From 5e6fd491f3ac4cccd1d7a4d360fb31eceff0ed12 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Wed, 7 Sep 2022 18:08:32 -0300 Subject: [PATCH 001/197] 4.8.0-rc.0 --- CHANGELOG.md | 2 +- contracts/access/AccessControl.sol | 2 +- contracts/access/Ownable2Step.sol | 2 +- contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL2.sol | 2 +- contracts/finance/PaymentSplitter.sol | 2 +- contracts/finance/VestingWallet.sol | 2 +- contracts/governance/Governor.sol | 2 +- contracts/governance/IGovernor.sol | 2 +- .../governance/compatibility/GovernorCompatibilityBravo.sol | 2 +- contracts/governance/extensions/GovernorCountingSimple.sol | 2 +- .../governance/extensions/GovernorVotesQuorumFraction.sol | 2 +- contracts/governance/utils/Votes.sol | 2 +- contracts/interfaces/IERC2309.sol | 1 + contracts/interfaces/IERC4626.sol | 2 +- contracts/metatx/MinimalForwarder.sol | 2 +- contracts/package.json | 2 +- contracts/proxy/Clones.sol | 2 +- contracts/proxy/utils/Initializable.sol | 2 +- contracts/proxy/utils/UUPSUpgradeable.sol | 2 +- contracts/security/PullPayment.sol | 2 +- contracts/security/ReentrancyGuard.sol | 2 +- contracts/token/ERC1155/ERC1155.sol | 2 +- contracts/token/ERC1155/extensions/ERC1155Burnable.sol | 2 +- contracts/token/ERC20/ERC20.sol | 2 +- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 2 +- contracts/token/ERC20/extensions/ERC20Votes.sol | 2 +- contracts/token/ERC20/extensions/ERC4626.sol | 2 +- contracts/token/ERC20/extensions/draft-ERC20Permit.sol | 2 +- contracts/token/ERC721/ERC721.sol | 2 +- contracts/token/ERC721/IERC721.sol | 2 +- contracts/token/ERC721/extensions/ERC721Burnable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Consecutive.sol | 1 + contracts/token/ERC721/extensions/ERC721Enumerable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Pausable.sol | 2 +- contracts/token/ERC721/extensions/draft-ERC721Votes.sol | 2 +- .../token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol | 2 +- contracts/token/ERC777/IERC777.sol | 2 +- contracts/utils/Address.sol | 2 +- contracts/utils/Arrays.sol | 2 +- contracts/utils/Checkpoints.sol | 2 +- contracts/utils/Create2.sol | 2 +- contracts/utils/Strings.sol | 2 +- contracts/utils/cryptography/ECDSA.sol | 2 +- contracts/utils/cryptography/EIP712.sol | 1 + contracts/utils/cryptography/SignatureChecker.sol | 2 +- contracts/utils/cryptography/draft-EIP712.sol | 1 + contracts/utils/introspection/ERC165Checker.sol | 2 +- contracts/utils/introspection/IERC1820Registry.sol | 2 +- contracts/utils/math/Math.sol | 2 +- contracts/utils/math/SafeCast.sol | 2 +- contracts/utils/math/SignedMath.sol | 2 +- contracts/utils/structs/BitMaps.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 2 +- contracts/utils/structs/EnumerableSet.sol | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 57 files changed, 58 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93107ee59..4cf92260b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## 4.8.0 * `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index 93fd028db..bbf462ef8 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (access/AccessControl.sol) pragma solidity ^0.8.0; diff --git a/contracts/access/Ownable2Step.sol b/contracts/access/Ownable2Step.sol index 5ee5cf8c7..ec6d96b51 100644 --- a/contracts/access/Ownable2Step.sol +++ b/contracts/access/Ownable2Step.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; diff --git a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol index e8d2acecd..7fba6bc75 100644 --- a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL2.sol b/contracts/crosschain/arbitrum/LibArbitrumL2.sol index ca3fd45ff..021a8c2a3 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/LibArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (crosschain/arbitrum/LibArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/finance/PaymentSplitter.sol b/contracts/finance/PaymentSplitter.sol index 381cc351b..712d7befc 100644 --- a/contracts/finance/PaymentSplitter.sol +++ b/contracts/finance/PaymentSplitter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol index bf8d198be..310d98082 100644 --- a/contracts/finance/VestingWallet.sol +++ b/contracts/finance/VestingWallet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (finance/VestingWallet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (finance/VestingWallet.sol) pragma solidity ^0.8.0; import "../token/ERC20/utils/SafeERC20.sol"; diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 5083165b1..851c0ac5f 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/Governor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/Governor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index a93231ca9..93fdda856 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/IGovernor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/IGovernor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index f54c62c66..43f493400 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/compatibility/GovernorCompatibilityBravo.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/compatibility/GovernorCompatibilityBravo.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/governance/extensions/GovernorCountingSimple.sol index 94470f5c3..05f838ed6 100644 --- a/contracts/governance/extensions/GovernorCountingSimple.sol +++ b/contracts/governance/extensions/GovernorCountingSimple.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/extensions/GovernorCountingSimple.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol index 1f19fc33e..175bb08fd 100644 --- a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorVotesQuorumFraction.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/extensions/GovernorVotesQuorumFraction.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 053bfa9e8..92087ab7f 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/utils/Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/utils/Votes.sol) pragma solidity ^0.8.0; import "../../utils/Context.sol"; diff --git a/contracts/interfaces/IERC2309.sol b/contracts/interfaces/IERC2309.sol index 9b2b42b1f..831eafba5 100644 --- a/contracts/interfaces/IERC2309.sol +++ b/contracts/interfaces/IERC2309.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (interfaces/IERC2309.sol) pragma solidity ^0.8.0; diff --git a/contracts/interfaces/IERC4626.sol b/contracts/interfaces/IERC4626.sol index dac12bb8c..a62dcb6eb 100644 --- a/contracts/interfaces/IERC4626.sol +++ b/contracts/interfaces/IERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (interfaces/IERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (interfaces/IERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index 54474860e..8433a65f8 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (metatx/MinimalForwarder.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (metatx/MinimalForwarder.sol) pragma solidity ^0.8.0; diff --git a/contracts/package.json b/contracts/package.json index 4e2c473ed..1c4cf4f96 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@openzeppelin/contracts", "description": "Secure Smart Contract library for Solidity", - "version": "4.7.0", + "version": "4.8.0-rc.0", "files": [ "**/*.sol", "/build/contracts/*.json", diff --git a/contracts/proxy/Clones.sol b/contracts/proxy/Clones.sol index 505fd613a..e7dcd5f2f 100644 --- a/contracts/proxy/Clones.sol +++ b/contracts/proxy/Clones.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/Clones.sol) pragma solidity ^0.8.0; diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 81683f002..334ffdc3c 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index 4d95d5673..548851ed0 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/PullPayment.sol b/contracts/security/PullPayment.sol index ea2ec64b2..e66cc76de 100644 --- a/contracts/security/PullPayment.sol +++ b/contracts/security/PullPayment.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (security/PullPayment.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (security/PullPayment.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index a0098a2ae..849d20cfe 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index 237e8ba94..5059ae55d 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol index 83f6e3d58..5d80714ec 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index 492e26101..1b537f60e 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index a835f1236..b95341bdb 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC20FlashMint.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC20FlashMint.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 3446d5534..2dfe61085 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 3adb63d84..30a1542ce 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol index 637b666fc..f7a859db9 100644 --- a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index a8e5aa4ab..63042c64f 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 46f73b4ef..4534f4412 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Burnable.sol b/contracts/token/ERC721/extensions/ERC721Burnable.sol index e2d96814d..a5cf48d3c 100644 --- a/contracts/token/ERC721/extensions/ERC721Burnable.sol +++ b/contracts/token/ERC721/extensions/ERC721Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 15ecdd986..b21558f8c 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Consecutive.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index c76613341..8e22c0ae6 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 22163b0f7..100b34907 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index 1d23c7854..4a2e201df 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/extensions/draft-ERC721Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 65ffef44b..1a3736409 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/IERC777.sol b/contracts/token/ERC777/IERC777.sol index 9a4d84354..f9b5c45aa 100644 --- a/contracts/token/ERC777/IERC777.sol +++ b/contracts/token/ERC777/IERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC777/IERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC777/IERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 69f3bf87a..1fe4d19a7 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Address.sol) pragma solidity ^0.8.1; diff --git a/contracts/utils/Arrays.sol b/contracts/utils/Arrays.sol index a0c967e17..4f9d4afde 100644 --- a/contracts/utils/Arrays.sol +++ b/contracts/utils/Arrays.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Arrays.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 81a8b5d5a..768197f50 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Checkpoints.sol) // This file was procedurally generated from scripts/generate/templates/Checkpoints.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 80acc3e2f..341b70ee7 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Create2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Create2.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index 45a52c96b..fd7270127 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Strings.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index 32e8b7e76..0d4e80b4e 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index a372b8de8..ff2da5325 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 42b222a0f..9fd8b87b1 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/draft-EIP712.sol b/contracts/utils/cryptography/draft-EIP712.sol index dbe2a92ec..4488bd967 100644 --- a/contracts/utils/cryptography/draft-EIP712.sol +++ b/contracts/utils/cryptography/draft-EIP712.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index f7cb5e8cf..43f006245 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/IERC1820Registry.sol b/contracts/utils/introspection/IERC1820Registry.sol index 8006117c8..41fd27eb1 100644 --- a/contracts/utils/introspection/IERC1820Registry.sol +++ b/contracts/utils/introspection/IERC1820Registry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (utils/introspection/IERC1820Registry.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/introspection/IERC1820Registry.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index e7bb33404..349da9f3b 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/Math.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SafeCast.sol b/contracts/utils/math/SafeCast.sol index 1412d6064..38fd60802 100644 --- a/contracts/utils/math/SafeCast.sol +++ b/contracts/utils/math/SafeCast.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SignedMath.sol b/contracts/utils/math/SignedMath.sol index 2a269fbe5..6aedc1853 100644 --- a/contracts/utils/math/SignedMath.sol +++ b/contracts/utils/math/SignedMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/SignedMath.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/BitMaps.sol b/contracts/utils/structs/BitMaps.sol index 1fb28393f..fd93bae62 100644 --- a/contracts/utils/structs/BitMaps.sol +++ b/contracts/utils/structs/BitMaps.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/structs/BitMaps.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index 16a963a68..f53b5c79f 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableMap.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/EnumerableMap.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableMap.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/EnumerableSet.sol b/contracts/utils/structs/EnumerableSet.sol index 8af57997f..00815a03a 100644 --- a/contracts/utils/structs/EnumerableSet.sol +++ b/contracts/utils/structs/EnumerableSet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; diff --git a/package-lock.json b/package-lock.json index 9b24a0fd0..8ee88247f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "openzeppelin-solidity", - "version": "4.7.0", + "version": "4.8.0-rc.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openzeppelin-solidity", - "version": "4.7.0", + "version": "4.8.0-rc.0", "license": "MIT", "bin": { "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" diff --git a/package.json b/package.json index 7e0d14c40..714f43727 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "openzeppelin-solidity", "description": "Secure Smart Contract library for Solidity", - "version": "4.7.0", + "version": "4.8.0-rc.0", "files": [ "/contracts/**/*.sol", "/build/contracts/*.json", From fac768cd2c1311955d30fd409320d2c06e32070b Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 13 Sep 2022 11:43:30 -0300 Subject: [PATCH 002/197] Update lockfile (#3698) --- package-lock.json | 2359 +++++++++++++++++++++++---------------------- 1 file changed, 1199 insertions(+), 1160 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b24a0fd0..5e820ca1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,9 +151,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -282,34 +282,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "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/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/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -320,28 +292,6 @@ "ethereumjs-util": "^7.1.5" } }, - "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/ethash/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" - } - }, "node_modules/@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -352,26 +302,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -1231,10 +1161,193 @@ "node": ">= 8" } }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.4.tgz", - "integrity": "sha512-bgS1HtuPZxOzEsQsF6jxfoOMQXKRlddsoJPT8dBNH1Pgpv9Y8AUQ3ecQk4ujAw9EOdTE1xAL4u7S6Gu4p3DO+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", "dev": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -1243,10 +1356,191 @@ "hardhat": "^2.9.5" } }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.6.tgz", - "integrity": "sha512-kzkpVEX36yOmdhCJHesu+1nB+fiaKpMrvUSVd0Ox6Jila+8aSxeHTC4bbEBOIqJcvOQZ3sj5fzuE5VjhNkZkvw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dev": true, "dependencies": { "@nomiclabs/truffle-contract": "^4.2.23", @@ -1384,9 +1678,9 @@ "dev": true }, "node_modules/@oclif/core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.0.tgz", - "integrity": "sha512-xtqhAbjQHBcz+xQpEHJ3eJEVfRQ4zl41Yw5gw/N+D1jgaIUrHTxCY/sfTvhw93LAQo7B++ozHzSb7DISFXsQFQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", + "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", "dev": true, "dependencies": { "@oclif/linewrap": "^1.0.0", @@ -1952,9 +2246,9 @@ } }, "node_modules/@openzeppelin/test-helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz", - "integrity": "sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", "dev": true, "dependencies": { "@openzeppelin/contract-loader": "^0.6.2", @@ -2159,13 +2453,12 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.0.tgz", - "integrity": "sha512-W4Kbm17+QQeeK/uXB80t10gw1H8lEnAu+B7bu7NZl2Zy74kwhsrGC+qCjynhRQtGsFnCcsI58VxjjNkn1PsgSg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", "dev": true, "dependencies": { "change-case": "3.0.2", - "faker": "5.5.3", "fast-check": "3.1.1", "web3-utils": "1.7.4" } @@ -2201,12 +2494,12 @@ "dev": true }, "node_modules/@truffle/codec": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.3.tgz", - "integrity": "sha512-8lwWQXkbrmewwiDSekZPUiweysGKXOpFSNhtWCi1CS6gtla3bNK8/xE1nUi3ALsuKw2745kzzLZpwKsipGtGKg==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", "dev": true, "dependencies": { - "@truffle/abi-utils": "^0.3.0", + "@truffle/abi-utils": "^0.3.1", "@truffle/compile-common": "^0.8.0", "big.js": "^6.0.3", "bn.js": "^5.1.3", @@ -2253,15 +2546,15 @@ } }, "node_modules/@truffle/contract": { - "version": "4.5.23", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.5.23.tgz", - "integrity": "sha512-ni/RzBdDFo60jaCb8ETCPBfPHRr1WVH5Y27EKmfEyrNg8TC7WZ28SQylMBkwdrgLjqAyPw3Pq7Y5us1f9tcyMQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", + "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", "dev": true, "dependencies": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.33", + "@truffle/debug-utils": "^6.0.34", "@truffle/error": "^0.1.1", "@truffle/interface-adapter": "^0.5.21", "bignumber.js": "^7.2.1", @@ -2835,12 +3128,12 @@ "dev": true }, "node_modules/@truffle/debug-utils": { - "version": "6.0.33", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.33.tgz", - "integrity": "sha512-nz6nApTxeqyRM1f9gO4g7sexmlC66YZ6dE1x2KbIz24FYx1yzfT5fAsQ2ZDoFHH++Ah4LH/1TMso76zspcn+vQ==", + "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", "dev": true, "dependencies": { - "@truffle/codec": "^0.14.3", + "@truffle/codec": "^0.14.4", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -4141,10 +4434,10 @@ "node": ">=4" } }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "node_modules/@types/bignumber.js": { @@ -4218,12 +4511,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -4239,23 +4526,6 @@ "@types/node": "*" } }, - "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", @@ -4269,9 +4539,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", "dev": true }, "node_modules/@types/pbkdf2": { @@ -4337,20 +4607,46 @@ "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", "dev": true }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "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, "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": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" }, "engines": { - "node": ">=6" + "node": ">=12" + } + }, + "node_modules/abstract-level/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/accepts": { @@ -4388,9 +4684,9 @@ } }, "node_modules/address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -5028,6 +5324,27 @@ "url": "https://opencollective.com/bigjs" } }, + "node_modules/bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "dependencies": { + "bigint-mod-arith": "^3.1.0" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -5174,6 +5491,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -5510,6 +5839,15 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": 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, + "engines": { + "node": ">=6" + } + }, "node_modules/cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -5760,6 +6098,23 @@ "node": ">=0.10.0" } }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6017,19 +6372,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6183,17 +6525,6 @@ "node": ">=0.10.0" } }, - "node_modules/core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", - "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", @@ -6522,35 +6853,6 @@ "node": ">=10" } }, - "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/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -6845,21 +7147,6 @@ "node": ">= 0.8" } }, - "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/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6891,9 +7178,9 @@ } }, "node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true, "engines": { "node": ">=0.12" @@ -6911,18 +7198,6 @@ "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", @@ -6933,16 +7208,16 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -6954,9 +7229,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -8817,12 +9092,6 @@ "node >=0.6.0" ] }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "node_modules/fast-check": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", @@ -8852,9 +9121,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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", @@ -9272,9 +9541,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -9661,20 +9930,25 @@ } }, "node_modules/hardhat": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.2.tgz", - "integrity": "sha512-L/KvDDT/MA6332uAtYTqdcHoSABljw4pPjHQe5SHdIJ+xKfaSc6vDKw03CmrQ5Xup0gHs8XnVSBpZo1AbbIW7g==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -9689,15 +9963,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "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", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -9705,11 +9978,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -9735,13 +10006,13 @@ } }, "node_modules/hardhat-gas-reporter": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz", - "integrity": "sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g==", + "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, "dependencies": { "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.24", + "eth-gas-reporter": "^0.2.25", "sha1": "^1.1.1" }, "peerDependencies": { @@ -10042,15 +10313,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -10063,18 +10325,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", @@ -10454,12 +10704,6 @@ "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.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -10813,9 +11057,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true, "engines": { "node": ">= 0.4" @@ -11043,15 +11287,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -11098,15 +11333,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "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", @@ -11119,15 +11345,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -11267,19 +11484,6 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "node_modules/isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", @@ -11489,12 +11693,11 @@ } }, "node_modules/keyv": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", - "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "dependencies": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -11528,119 +11731,67 @@ "node": ">=0.10.0" } }, - "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/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "buffer": "^5.6.0" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" }, "engines": { - "node": ">=6" - } - }, - "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" + "node": ">=12" }, - "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" - }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, "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/level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "dependencies": { - "xtend": "^4.0.2" + "buffer": "^6.0.3", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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/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": { - "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" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/levn": { @@ -12199,12 +12350,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/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -12267,45 +12412,20 @@ "node": ">= 0.6" } }, - "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/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-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" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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/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/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12330,20 +12450,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/merkletreejs": { "version": "0.2.32", "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", @@ -12817,6 +12923,15 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "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, + "engines": { + "node": ">=10" + } + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -13032,6 +13147,12 @@ "node": ">=0.10.0" } }, + "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 + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13523,15 +13644,6 @@ "node": ">=12.20" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -13574,18 +13686,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -13661,12 +13761,12 @@ } }, "node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "dependencies": { - "entities": "^4.3.0" + "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -14117,12 +14217,6 @@ "node": ">=0.8.0" } }, - "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", @@ -14163,9 +14257,9 @@ } }, "node_modules/pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", "dev": true, "funding": { "type": "opencollective", @@ -14842,6 +14936,29 @@ "queue-microtask": "^1.2.2" } }, + "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, + "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/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -15015,15 +15132,6 @@ "node": ">=10.0.0" } }, - "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.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -16341,9 +16449,9 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.21.tgz", - "integrity": "sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg==", + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", + "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", "dev": true, "dependencies": { "@solidity-parser/parser": "^0.14.0", @@ -16966,9 +17074,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -17001,16 +17109,16 @@ } }, "node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dev": true, "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -17019,16 +17127,25 @@ "xhr-request": "^1.0.1" } }, - "node_modules/swarm-js/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" } }, "node_modules/swarm-js/node_modules/fs-extra": { @@ -17042,86 +17159,60 @@ "universalify": "^0.1.0" } }, - "node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/swarm-js/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.19.0" } }, "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "engines": { - "node": ">=4" - } - }, - "node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/sync-request": { @@ -17528,12 +17619,6 @@ "node": ">=0.6" } }, - "node_modules/true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -17856,15 +17941,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "node_modules/url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -19011,9 +19087,9 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -19126,34 +19202,6 @@ "strip-json-comments": "^3.1.1" } }, - "@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, - "requires": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "@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, - "requires": { - "@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" - } - }, "@ethereumjs/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -19164,30 +19212,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@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, - "requires": { - "@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" - }, - "dependencies": { - "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, - "requires": { - "safe-buffer": "^5.1.1" - } - } - } - }, "@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -19198,26 +19222,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -19746,19 +19750,260 @@ "fastq": "^1.6.0" } }, + "@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + } + }, + "@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + } + }, + "@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.4.tgz", - "integrity": "sha512-bgS1HtuPZxOzEsQsF6jxfoOMQXKRlddsoJPT8dBNH1Pgpv9Y8AUQ3ecQk4ujAw9EOdTE1xAL4u7S6Gu4p3DO+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", "dev": true, "requires": { "ethereumjs-util": "^7.1.4" } }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "requires": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "dev": true, + "optional": true + }, "@nomiclabs/hardhat-truffle5": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.6.tgz", - "integrity": "sha512-kzkpVEX36yOmdhCJHesu+1nB+fiaKpMrvUSVd0Ox6Jila+8aSxeHTC4bbEBOIqJcvOQZ3sj5fzuE5VjhNkZkvw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dev": true, "requires": { "@nomiclabs/truffle-contract": "^4.2.23", @@ -19861,9 +20106,9 @@ } }, "@oclif/core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.0.tgz", - "integrity": "sha512-xtqhAbjQHBcz+xQpEHJ3eJEVfRQ4zl41Yw5gw/N+D1jgaIUrHTxCY/sfTvhw93LAQo7B++ozHzSb7DISFXsQFQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", + "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", "dev": true, "requires": { "@oclif/linewrap": "^1.0.0", @@ -20307,9 +20552,9 @@ } }, "@openzeppelin/test-helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz", - "integrity": "sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", "dev": true, "requires": { "@openzeppelin/contract-loader": "^0.6.2", @@ -20465,13 +20710,12 @@ } }, "@truffle/abi-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.0.tgz", - "integrity": "sha512-W4Kbm17+QQeeK/uXB80t10gw1H8lEnAu+B7bu7NZl2Zy74kwhsrGC+qCjynhRQtGsFnCcsI58VxjjNkn1PsgSg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", "dev": true, "requires": { "change-case": "3.0.2", - "faker": "5.5.3", "fast-check": "3.1.1", "web3-utils": "1.7.4" }, @@ -20506,12 +20750,12 @@ "dev": true }, "@truffle/codec": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.3.tgz", - "integrity": "sha512-8lwWQXkbrmewwiDSekZPUiweysGKXOpFSNhtWCi1CS6gtla3bNK8/xE1nUi3ALsuKw2745kzzLZpwKsipGtGKg==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", "dev": true, "requires": { - "@truffle/abi-utils": "^0.3.0", + "@truffle/abi-utils": "^0.3.1", "@truffle/compile-common": "^0.8.0", "big.js": "^6.0.3", "bn.js": "^5.1.3", @@ -20557,15 +20801,15 @@ } }, "@truffle/contract": { - "version": "4.5.23", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.5.23.tgz", - "integrity": "sha512-ni/RzBdDFo60jaCb8ETCPBfPHRr1WVH5Y27EKmfEyrNg8TC7WZ28SQylMBkwdrgLjqAyPw3Pq7Y5us1f9tcyMQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", + "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.33", + "@truffle/debug-utils": "^6.0.34", "@truffle/error": "^0.1.1", "@truffle/interface-adapter": "^0.5.21", "bignumber.js": "^7.2.1", @@ -21040,12 +21284,12 @@ } }, "@truffle/debug-utils": { - "version": "6.0.33", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.33.tgz", - "integrity": "sha512-nz6nApTxeqyRM1f9gO4g7sexmlC66YZ6dE1x2KbIz24FYx1yzfT5fAsQ2ZDoFHH++Ah4LH/1TMso76zspcn+vQ==", + "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", "dev": true, "requires": { - "@truffle/codec": "^0.14.3", + "@truffle/codec": "^0.14.4", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -22116,10 +22360,10 @@ } } }, - "@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "@types/bignumber.js": { @@ -22192,12 +22436,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -22213,23 +22451,6 @@ "@types/node": "*" } }, - "@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 - }, - "@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, - "requires": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, "@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", @@ -22243,9 +22464,9 @@ "dev": true }, "@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", "dev": true }, "@types/pbkdf2": { @@ -22308,17 +22529,31 @@ "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", "dev": true }, - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "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, "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "accepts": { @@ -22345,9 +22580,9 @@ "requires": {} }, "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true }, "adm-zip": { @@ -22833,6 +23068,21 @@ "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", "dev": true }, + "bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "requires": { + "bigint-mod-arith": "^3.1.0" + } + }, + "bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true + }, "bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -22959,6 +23209,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -23243,6 +23505,12 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true + }, "cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -23447,6 +23715,19 @@ "static-extend": "^0.1.1" } }, + "classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -23652,16 +23933,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -23801,12 +24072,6 @@ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true }, - "core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -24065,31 +24330,6 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, - "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, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "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, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - } - } - }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -24321,18 +24561,6 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, - "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, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -24360,9 +24588,9 @@ } }, "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "env-paths": { @@ -24371,15 +24599,6 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, - "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, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -24390,16 +24609,16 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -24411,9 +24630,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -25935,12 +26154,6 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, - "faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "fast-check": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", @@ -25963,9 +26176,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -26299,9 +26512,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -26597,20 +26810,25 @@ } }, "hardhat": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.2.tgz", - "integrity": "sha512-L/KvDDT/MA6332uAtYTqdcHoSABljw4pPjHQe5SHdIJ+xKfaSc6vDKw03CmrQ5Xup0gHs8XnVSBpZo1AbbIW7g==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -26625,15 +26843,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "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", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -26641,11 +26858,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -26855,13 +27070,13 @@ } }, "hardhat-gas-reporter": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz", - "integrity": "sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g==", + "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, "requires": { "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.24", + "eth-gas-reporter": "^0.2.25", "sha1": "^1.1.1" } }, @@ -26895,27 +27110,12 @@ "get-intrinsic": "^1.1.1" } }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, "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 }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", @@ -27216,12 +27416,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -27487,9 +27681,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true }, "is-core-module": { @@ -27645,12 +27839,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true - }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -27682,12 +27870,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, "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", @@ -27697,12 +27879,6 @@ "call-bind": "^1.0.2" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -27806,16 +27982,6 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, "jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", @@ -27984,12 +28150,11 @@ } }, "keyv": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", - "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "requires": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -28017,92 +28182,42 @@ "invert-kv": "^1.0.0" } }, - "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==", + "level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "requires": { - "buffer": "^5.6.0" - } - }, - "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 - }, - "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, - "requires": { - "errno": "~0.1.1" - } - }, - "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, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "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, - "requires": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - } - }, - "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, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" } }, "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 + }, + "level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "requires": { - "xtend": "^4.0.2" - } - }, - "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, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "requires": { - "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" + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "levn": { @@ -28571,12 +28686,6 @@ "yallist": "^3.0.2" } }, - "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 - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -28627,39 +28736,15 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "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, "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - } + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" } }, "memorystream": { @@ -28680,20 +28765,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "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, - "requires": { - "@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" - } - }, "merkletreejs": { "version": "0.2.32", "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", @@ -29059,6 +29130,12 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "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 + }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -29247,6 +29324,12 @@ } } }, + "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 + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -29623,12 +29706,6 @@ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -29656,15 +29733,6 @@ "aggregate-error": "^3.0.0" } }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -29731,12 +29799,12 @@ } }, "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "requires": { - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "parse5-htmlparser2-tree-adapter": { @@ -30079,12 +30147,6 @@ "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30122,9 +30184,9 @@ "dev": true }, "pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", "dev": true }, "qs": { @@ -30624,6 +30686,15 @@ "queue-microtask": "^1.2.2" } }, + "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, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -30756,12 +30827,6 @@ "node-gyp-build": "^4.2.0" } }, - "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 - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -31830,9 +31895,9 @@ "dev": true }, "solidity-coverage": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.21.tgz", - "integrity": "sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg==", + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", + "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", "dev": true, "requires": { "@solidity-parser/parser": "^0.14.0", @@ -32341,9 +32406,9 @@ } }, "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -32367,16 +32432,16 @@ } }, "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dev": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -32385,15 +32450,21 @@ "xhr-request": "^1.0.1" }, "dependencies": { - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "defer-to-connect": "^2.0.0" } }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -32405,66 +32476,46 @@ "universalify": "^0.1.0" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - }, "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } } } }, @@ -32799,12 +32850,6 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -33071,12 +33116,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", From d6975f8e07670f7652e056ee20ab5e4d3f5768c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:45:11 -0300 Subject: [PATCH 003/197] Update dependency solidity-coverage to ^0.8.0 (#3681) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 1852 ++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 817 insertions(+), 1037 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e820ca1a..913b83524 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "semver": "^7.3.5", "solhint": "^3.3.6", "solidity-ast": "^0.4.25", - "solidity-coverage": "^0.7.18", + "solidity-coverage": "^0.8.0", "solidity-docgen": "^0.5.3", "web3": "^1.3.0", "yargs": "^17.0.0" @@ -3785,568 +3785,6 @@ "node": ">=8.0.0" } }, - "node_modules/@truffle/provider": { - "version": "0.2.59", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.59.tgz", - "integrity": "sha512-4b79yUSZlEd7KqzaPkQiiT4aRCGaI+pXPdwJMD0olLvnZrGoNrBtRQSmnXesxBcqi6FaSDxxC+/9URG2HBPE2g==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", - "debug": "^4.3.1", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/provider/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/provider/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@truffle/provider/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/provider/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "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/@truffle/provider/node_modules/web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", @@ -6980,6 +6418,18 @@ "randombytes": "^2.0.0" } }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10452,6 +9902,12 @@ "upper-case": "^1.1.3" } }, + "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/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -16449,32 +15905,55 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", + "@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.0" + "web3-utils": "^1.3.6" }, "bin": { "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "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/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==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/solidity-coverage/node_modules/ansi-styles": { @@ -16489,6 +15968,15 @@ "node": ">=4" } }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/solidity-coverage/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -16503,6 +15991,38 @@ "node": ">=4" } }, + "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==", + "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/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/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -16518,6 +16038,40 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "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_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==", + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -16527,6 +16081,30 @@ "node": ">=0.8.0" } }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, "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", @@ -16541,6 +16119,38 @@ "node": ">=6 <7 || >=8" } }, + "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\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "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": "*" + } + }, "node_modules/solidity-coverage/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -16550,6 +16160,212 @@ "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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "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_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/solidity-coverage/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/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==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16562,6 +16378,80 @@ "node": ">=4" } }, + "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==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/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/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==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/solidity-docgen": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", @@ -21825,467 +21715,6 @@ } } }, - "@truffle/provider": { - "version": "0.2.59", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.59.tgz", - "integrity": "sha512-4b79yUSZlEd7KqzaPkQiiT4aRCGaI+pXPdwJMD0olLvnZrGoNrBtRQSmnXesxBcqi6FaSDxxC+/9URG2HBPE2g==", - "dev": true, - "requires": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", - "debug": "^4.3.1", - "web3": "1.7.4" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - } - } - }, "@trufflesuite/chromafi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", @@ -24427,6 +23856,15 @@ "randombytes": "^2.0.0" } }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "requires": { + "heap": ">= 0.2.0" + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -27220,6 +26658,12 @@ "upper-case": "^1.1.3" } }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -31895,31 +31339,45 @@ "dev": true }, "solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, "requires": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", + "@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.0" + "web3-utils": "^1.3.6" }, "dependencies": { + "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 + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -31929,6 +31387,12 @@ "color-convert": "^1.9.0" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -31940,6 +31404,33 @@ "supports-color": "^5.3.0" } }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -31955,12 +31446,57 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "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 + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "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, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -31972,12 +31508,191 @@ "universalify": "^0.1.0" } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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" + } + }, "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 }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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 + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "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, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -31986,6 +31701,71 @@ "requires": { "has-flag": "^3.0.0" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } } } }, diff --git a/package.json b/package.json index 7e0d14c40..86b65c3a1 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "semver": "^7.3.5", "solhint": "^3.3.6", "solidity-ast": "^0.4.25", - "solidity-coverage": "^0.7.18", + "solidity-coverage": "^0.8.0", "solidity-docgen": "^0.5.3", "web3": "^1.3.0", "yargs": "^17.0.0" From 9416743a1079f35320173b8809e9a28ae8444128 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 13 Sep 2022 19:20:29 -0300 Subject: [PATCH 004/197] Disable fuzzing on upgradeable contracts --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6be2fd722..780935493 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -44,6 +44,7 @@ jobs: token: ${{ github.token }} foundry-tests: + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 7deed7a7698e89263ae426f274cbe256b9ab0231 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 13 Sep 2022 19:20:29 -0300 Subject: [PATCH 005/197] Disable fuzzing on upgradeable contracts (cherry picked from commit 9416743a1079f35320173b8809e9a28ae8444128) --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6be2fd722..780935493 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -44,6 +44,7 @@ jobs: token: ${{ github.token }} foundry-tests: + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 76b538c226df019a1451467d36351b3c61cd4139 Mon Sep 17 00:00:00 2001 From: Emre Tepe Date: Fri, 16 Sep 2022 01:41:12 +0300 Subject: [PATCH 006/197] Update the informational link (#3703) --- contracts/metatx/MinimalForwarder.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index 54474860e..910d5d28b 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -57,7 +57,7 @@ contract MinimalForwarder is EIP712 { ); // Validate that the relayer has sent enough gas for the call. - // See https://ronan.eth.link/blog/ethereum-gas-dangers/ + // See https://ronan.eth.limo/blog/ethereum-gas-dangers/ if (gasleft() <= req.gas / 63) { // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since // neither revert or assert consume all gas since Solidity 0.8.0 From a549ec673e29101003ece15d4e864226cdf00d84 Mon Sep 17 00:00:00 2001 From: tincho Date: Fri, 16 Sep 2022 20:16:37 +0200 Subject: [PATCH 007/197] Improve Initializable docstrings (#3704) Co-authored-by: tincho Co-authored-by: Francisco Giordano --- contracts/proxy/utils/Initializable.sol | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 81683f002..51d4be7f4 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -73,7 +73,12 @@ abstract contract Initializable { /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, - * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. + * `onlyInitializing` functions can be used to initialize parent contracts. + * + * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a + * constructor. + * + * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; @@ -97,12 +102,18 @@ abstract contract Initializable { * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * - * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original - * initialization step. This is essential to configure modules that are added through upgrades and that require - * initialization. + * A reinitializer may be used after the original initialization step. This is essential to configure modules that + * are added through upgrades and that require initialization. + * + * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` + * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. + * + * WARNING: setting the version to 255 will prevent any future reinitialization. + * + * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); @@ -127,6 +138,8 @@ abstract contract Initializable { * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. + * + * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); From 7a14f6c5953a1f2228280e6eb1dfee8e5c28d79a Mon Sep 17 00:00:00 2001 From: Francisco Date: Sat, 17 Sep 2022 13:03:03 -0300 Subject: [PATCH 008/197] Make ERC721Votes no longer a Draft (#3699) --- CHANGELOG.md | 7 +++ contracts/mocks/ERC721ConsecutiveMock.sol | 2 +- contracts/mocks/ERC721VotesMock.sol | 2 +- .../token/ERC721/extensions/ERC721Votes.sol | 54 +++++++++++++++++++ .../ERC721/extensions/draft-ERC721Votes.sol | 53 ++---------------- scripts/migrate-imports.js | 2 +- .../{draft-EIP712.test.js => EIP712.test.js} | 0 7 files changed, 67 insertions(+), 53 deletions(-) create mode 100644 contracts/token/ERC721/extensions/ERC721Votes.sol rename test/utils/cryptography/{draft-EIP712.test.js => EIP712.test.js} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93107ee59..ecc6f02d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,13 @@ ```diff -import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +``` + + * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) + +```diff +-import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol"; ++import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol"; ``` ### ERC-721 Compatibility Note diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index 11c93d188..c4965aa85 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -6,7 +6,7 @@ import "../token/ERC721/extensions/ERC721Burnable.sol"; import "../token/ERC721/extensions/ERC721Consecutive.sol"; import "../token/ERC721/extensions/ERC721Enumerable.sol"; import "../token/ERC721/extensions/ERC721Pausable.sol"; -import "../token/ERC721/extensions/draft-ERC721Votes.sol"; +import "../token/ERC721/extensions/ERC721Votes.sol"; /** * @title ERC721ConsecutiveMock diff --git a/contracts/mocks/ERC721VotesMock.sol b/contracts/mocks/ERC721VotesMock.sol index 0755ace66..acb51ebfb 100644 --- a/contracts/mocks/ERC721VotesMock.sol +++ b/contracts/mocks/ERC721VotesMock.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../token/ERC721/extensions/draft-ERC721Votes.sol"; +import "../token/ERC721/extensions/ERC721Votes.sol"; contract ERC721VotesMock is ERC721Votes { constructor(string memory name, string memory symbol) ERC721(name, symbol) EIP712(name, "1") {} diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol new file mode 100644 index 000000000..ddcb15607 --- /dev/null +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../ERC721.sol"; +import "../../../governance/utils/Votes.sol"; + +/** + * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts + * as 1 vote unit. + * + * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost + * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of + * the votes in governance decisions, or they can delegate to themselves to be their own representative. + * + * _Available since v4.5._ + */ +abstract contract ERC721Votes is ERC721, Votes { + /** + * @dev Adjusts votes when tokens are transferred. + * + * Emits a {Votes-DelegateVotesChanged} event. + */ + function _afterTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override { + _transferVotingUnits(from, to, 1); + super._afterTokenTransfer(from, to, tokenId); + } + + /** + * @dev Adjusts votes when a batch of tokens is transferred. + * + * Emits a {Votes-DelegateVotesChanged} event. + */ + function _afterConsecutiveTokenTransfer( + address from, + address to, + uint256 first, + uint96 size + ) internal virtual override { + _transferVotingUnits(from, to, size); + super._afterConsecutiveTokenTransfer(from, to, first, size); + } + + /** + * @dev Returns the balance of `account`. + */ + function _getVotingUnits(address account) internal view virtual override returns (uint256) { + return balanceOf(account); + } +} diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index 1d23c7854..ea9227ab0 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,55 +1,8 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; -import "../ERC721.sol"; -import "../../../governance/utils/Votes.sol"; +// ERC721Votes was marked as draft due to the EIP-712 dependency. +// EIP-712 is Final as of 2022-08-11. This file is deprecated. -/** - * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts - * as 1 vote unit. - * - * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost - * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of - * the votes in governance decisions, or they can delegate to themselves to be their own representative. - * - * _Available since v4.5._ - */ -abstract contract ERC721Votes is ERC721, Votes { - /** - * @dev Adjusts votes when tokens are transferred. - * - * Emits a {Votes-DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override { - _transferVotingUnits(from, to, 1); - super._afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Adjusts votes when a batch of tokens is transferred. - * - * Emits a {Votes-DelegateVotesChanged} event. - */ - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - _transferVotingUnits(from, to, size); - super._afterConsecutiveTokenTransfer(from, to, first, size); - } - - /** - * @dev Returns the balance of `account`. - */ - function _getVotingUnits(address account) internal view virtual override returns (uint256) { - return balanceOf(account); - } -} +import "./ERC721Votes.sol"; diff --git a/scripts/migrate-imports.js b/scripts/migrate-imports.js index bc35253da..352de1408 100755 --- a/scripts/migrate-imports.js +++ b/scripts/migrate-imports.js @@ -9,7 +9,7 @@ const pathUpdates = { 'access/TimelockController.sol': 'governance/TimelockController.sol', 'cryptography/ECDSA.sol': 'utils/cryptography/ECDSA.sol', 'cryptography/MerkleProof.sol': 'utils/cryptography/MerkleProof.sol', - 'drafts/EIP712.sol': 'utils/cryptography/draft-EIP712.sol', + 'drafts/EIP712.sol': 'utils/cryptography/EIP712.sol', 'drafts/ERC20Permit.sol': 'token/ERC20/extensions/draft-ERC20Permit.sol', 'drafts/IERC20Permit.sol': 'token/ERC20/extensions/draft-IERC20Permit.sol', 'GSN/Context.sol': 'utils/Context.sol', diff --git a/test/utils/cryptography/draft-EIP712.test.js b/test/utils/cryptography/EIP712.test.js similarity index 100% rename from test/utils/cryptography/draft-EIP712.test.js rename to test/utils/cryptography/EIP712.test.js From a61532942300e2d70b2a1613f541801c79cb07e4 Mon Sep 17 00:00:00 2001 From: Francisco Date: Sat, 17 Sep 2022 13:03:03 -0300 Subject: [PATCH 009/197] Make ERC721Votes no longer a Draft (#3699) (cherry picked from commit 7a14f6c5953a1f2228280e6eb1dfee8e5c28d79a) --- CHANGELOG.md | 7 +++ contracts/mocks/ERC721ConsecutiveMock.sol | 2 +- contracts/mocks/ERC721VotesMock.sol | 2 +- .../token/ERC721/extensions/ERC721Votes.sol | 54 +++++++++++++++++++ .../ERC721/extensions/draft-ERC721Votes.sol | 53 ++---------------- scripts/migrate-imports.js | 2 +- .../{draft-EIP712.test.js => EIP712.test.js} | 0 7 files changed, 67 insertions(+), 53 deletions(-) create mode 100644 contracts/token/ERC721/extensions/ERC721Votes.sol rename test/utils/cryptography/{draft-EIP712.test.js => EIP712.test.js} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf92260b..fb92bafeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,13 @@ ```diff -import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +``` + + * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) + +```diff +-import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol"; ++import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol"; ``` ### ERC-721 Compatibility Note diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index 11c93d188..c4965aa85 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -6,7 +6,7 @@ import "../token/ERC721/extensions/ERC721Burnable.sol"; import "../token/ERC721/extensions/ERC721Consecutive.sol"; import "../token/ERC721/extensions/ERC721Enumerable.sol"; import "../token/ERC721/extensions/ERC721Pausable.sol"; -import "../token/ERC721/extensions/draft-ERC721Votes.sol"; +import "../token/ERC721/extensions/ERC721Votes.sol"; /** * @title ERC721ConsecutiveMock diff --git a/contracts/mocks/ERC721VotesMock.sol b/contracts/mocks/ERC721VotesMock.sol index 0755ace66..acb51ebfb 100644 --- a/contracts/mocks/ERC721VotesMock.sol +++ b/contracts/mocks/ERC721VotesMock.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../token/ERC721/extensions/draft-ERC721Votes.sol"; +import "../token/ERC721/extensions/ERC721Votes.sol"; contract ERC721VotesMock is ERC721Votes { constructor(string memory name, string memory symbol) ERC721(name, symbol) EIP712(name, "1") {} diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol new file mode 100644 index 000000000..ddcb15607 --- /dev/null +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../ERC721.sol"; +import "../../../governance/utils/Votes.sol"; + +/** + * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts + * as 1 vote unit. + * + * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost + * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of + * the votes in governance decisions, or they can delegate to themselves to be their own representative. + * + * _Available since v4.5._ + */ +abstract contract ERC721Votes is ERC721, Votes { + /** + * @dev Adjusts votes when tokens are transferred. + * + * Emits a {Votes-DelegateVotesChanged} event. + */ + function _afterTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override { + _transferVotingUnits(from, to, 1); + super._afterTokenTransfer(from, to, tokenId); + } + + /** + * @dev Adjusts votes when a batch of tokens is transferred. + * + * Emits a {Votes-DelegateVotesChanged} event. + */ + function _afterConsecutiveTokenTransfer( + address from, + address to, + uint256 first, + uint96 size + ) internal virtual override { + _transferVotingUnits(from, to, size); + super._afterConsecutiveTokenTransfer(from, to, first, size); + } + + /** + * @dev Returns the balance of `account`. + */ + function _getVotingUnits(address account) internal view virtual override returns (uint256) { + return balanceOf(account); + } +} diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index 4a2e201df..ea9227ab0 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,55 +1,8 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; -import "../ERC721.sol"; -import "../../../governance/utils/Votes.sol"; +// ERC721Votes was marked as draft due to the EIP-712 dependency. +// EIP-712 is Final as of 2022-08-11. This file is deprecated. -/** - * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts - * as 1 vote unit. - * - * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost - * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of - * the votes in governance decisions, or they can delegate to themselves to be their own representative. - * - * _Available since v4.5._ - */ -abstract contract ERC721Votes is ERC721, Votes { - /** - * @dev Adjusts votes when tokens are transferred. - * - * Emits a {Votes-DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override { - _transferVotingUnits(from, to, 1); - super._afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Adjusts votes when a batch of tokens is transferred. - * - * Emits a {Votes-DelegateVotesChanged} event. - */ - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - _transferVotingUnits(from, to, size); - super._afterConsecutiveTokenTransfer(from, to, first, size); - } - - /** - * @dev Returns the balance of `account`. - */ - function _getVotingUnits(address account) internal view virtual override returns (uint256) { - return balanceOf(account); - } -} +import "./ERC721Votes.sol"; diff --git a/scripts/migrate-imports.js b/scripts/migrate-imports.js index bc35253da..352de1408 100755 --- a/scripts/migrate-imports.js +++ b/scripts/migrate-imports.js @@ -9,7 +9,7 @@ const pathUpdates = { 'access/TimelockController.sol': 'governance/TimelockController.sol', 'cryptography/ECDSA.sol': 'utils/cryptography/ECDSA.sol', 'cryptography/MerkleProof.sol': 'utils/cryptography/MerkleProof.sol', - 'drafts/EIP712.sol': 'utils/cryptography/draft-EIP712.sol', + 'drafts/EIP712.sol': 'utils/cryptography/EIP712.sol', 'drafts/ERC20Permit.sol': 'token/ERC20/extensions/draft-ERC20Permit.sol', 'drafts/IERC20Permit.sol': 'token/ERC20/extensions/draft-IERC20Permit.sol', 'GSN/Context.sol': 'utils/Context.sol', diff --git a/test/utils/cryptography/draft-EIP712.test.js b/test/utils/cryptography/EIP712.test.js similarity index 100% rename from test/utils/cryptography/draft-EIP712.test.js rename to test/utils/cryptography/EIP712.test.js From 8769b19860863ed14e82ac78eb0d09449a49290b Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Tue, 20 Sep 2022 17:00:13 +0800 Subject: [PATCH 010/197] Fix issue number in CHANGELOG (#3710) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecc6f02d7..9359c2edc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,7 @@ +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; ``` - * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) + * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3699](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) ```diff -import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol"; From 8d3d181207b45e39aa0c500e450eceab90979836 Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Tue, 20 Sep 2022 17:00:13 +0800 Subject: [PATCH 011/197] Fix issue number in CHANGELOG (#3710) (cherry picked from commit 8769b19860863ed14e82ac78eb0d09449a49290b) Signed-off-by: Hadrien Croubois --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb92bafeb..67dbef02c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,7 @@ +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; ``` - * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) + * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3699](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) ```diff -import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol"; From 06e678d6ef966d9c55d512b736622682bcfdf7a7 Mon Sep 17 00:00:00 2001 From: Ana Julia Bittencourt Date: Thu, 22 Sep 2022 16:42:52 -0300 Subject: [PATCH 012/197] Update ReentrancyGuard documentation (#3715) --- contracts/security/ReentrancyGuard.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index a0098a2ae..3108ac9f4 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -54,7 +54,7 @@ abstract contract ReentrancyGuard { } function _nonReentrantBefore() private { - // On the first call to nonReentrant, _notEntered will be true + // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail From 046121e08027414184165bf2ac042e1d356d3bb0 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 22 Sep 2022 17:33:13 -0300 Subject: [PATCH 013/197] Ignore specific warnings and make the rest into errors (#3695) --- ...1ConsecutiveEnumerableMock.unreachable.sol | 62 +++ contracts/mocks/ERC721ConsecutiveMock.sol | 56 --- .../ERC721/extensions/ERC721Enumerable.sol | 8 +- hardhat.config.js | 8 + hardhat/ignore-unreachable-warnings.js | 47 +++ package-lock.json | 366 ++++++++++++++++++ package.json | 1 + 7 files changed, 490 insertions(+), 58 deletions(-) create mode 100644 contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol create mode 100644 hardhat/ignore-unreachable-warnings.js diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol new file mode 100644 index 000000000..791bf3f93 --- /dev/null +++ b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../token/ERC721/extensions/ERC721Consecutive.sol"; +import "../token/ERC721/extensions/ERC721Enumerable.sol"; + +contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable { + constructor( + string memory name, + string memory symbol, + address[] memory receivers, + uint96[] memory amounts + ) ERC721(name, symbol) { + for (uint256 i = 0; i < receivers.length; ++i) { + _mintConsecutive(receivers[i], amounts[i]); + } + } + + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC721, ERC721Enumerable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } + + function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) { + return super._ownerOf(tokenId); + } + + function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) { + super._mint(to, tokenId); + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override(ERC721, ERC721Enumerable) { + super._beforeTokenTransfer(from, to, tokenId); + } + + function _afterTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override(ERC721, ERC721Consecutive) { + super._afterTokenTransfer(from, to, tokenId); + } + + function _beforeConsecutiveTokenTransfer( + address from, + address to, + uint256 first, + uint96 size + ) internal virtual override(ERC721, ERC721Enumerable) { + super._beforeConsecutiveTokenTransfer(from, to, first, size); + } +} diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index c4965aa85..b88bef578 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -95,62 +95,6 @@ contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausa } } -contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable { - constructor( - string memory name, - string memory symbol, - address[] memory receivers, - uint96[] memory amounts - ) ERC721(name, symbol) { - for (uint256 i = 0; i < receivers.length; ++i) { - _mintConsecutive(receivers[i], amounts[i]); - } - } - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(ERC721, ERC721Enumerable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) { - return super._ownerOf(tokenId); - } - - function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) { - super._mint(to, tokenId); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeTokenTransfer(from, to, tokenId); - } - - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); - } -} - contract ERC721ConsecutiveNoConstructorMintMock is ERC721Consecutive { constructor(string memory name, string memory symbol) ERC721(name, symbol) { _mint(msg.sender, 0); diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index c76613341..7d879f58b 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -106,9 +106,13 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { address, address, uint256, - uint96 + uint96 size ) internal virtual override { - revert("ERC721Enumerable: consecutive transfers not supported"); + // We revert because enumerability is not supported with consecutive batch minting. + // This conditional is only needed to silence spurious warnings about unreachable code. + if (size > 0) { + revert("ERC721Enumerable: consecutive transfers not supported"); + } } /** diff --git a/hardhat.config.js b/hardhat.config.js index 0bfef82ce..fb28b5484 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -50,6 +50,7 @@ const argv = require('yargs/yargs')() .argv; require('@nomiclabs/hardhat-truffle5'); +require('hardhat-ignore-warnings'); if (argv.gas) { require('hardhat-gas-reporter'); @@ -75,6 +76,13 @@ module.exports = { viaIR: withOptimizations && argv.ir, }, }, + warnings: { + '*': { + 'code-size': withOptimizations, + 'unused-param': !argv.coverage, // coverage causes unused-param warnings + default: 'error', + }, + }, networks: { hardhat: { blockGasLimit: 10000000, diff --git a/hardhat/ignore-unreachable-warnings.js b/hardhat/ignore-unreachable-warnings.js new file mode 100644 index 000000000..c9d3c36a4 --- /dev/null +++ b/hardhat/ignore-unreachable-warnings.js @@ -0,0 +1,47 @@ +// Warnings about unreachable code are emitted with a source location that corresponds to the unreachable code. +// We have some testing contracts that purposely cause unreachable code, but said code is in the library contracts, and +// with hardhat-ignore-warnings we are not able to selectively ignore them without potentially ignoring relevant +// warnings that we don't want to miss. +// Thus, we need to handle these warnings separately. We force Hardhat to compile them in a separate compilation job and +// then ignore the warnings about unreachable code that come from that compilation job. + +const { task } = require('hardhat/config'); +const { + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + TASK_COMPILE_SOLIDITY_COMPILE, +} = require('hardhat/builtin-tasks/task-names'); + +const marker = Symbol('unreachable'); +const markedCache = new WeakMap(); + +task(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, async (params, _, runSuper) => { + const job = await runSuper(params); + // If the file is in the unreachable directory, we make a copy of the config and mark it, which will cause it to get + // compiled separately (along with the other marked files). + if (params.file.sourceName.startsWith('contracts/mocks/') && /\bunreachable\b/.test(params.file.sourceName)) { + const originalConfig = job.solidityConfig; + let markedConfig = markedCache.get(originalConfig); + if (markedConfig === undefined) { + markedConfig = { ...originalConfig, [marker]: true }; + markedCache.set(originalConfig, markedConfig); + } + job.solidityConfig = markedConfig; + } + return job; +}); + +const W_UNREACHABLE_CODE = '5740'; + +task(TASK_COMPILE_SOLIDITY_COMPILE, async (params, _, runSuper) => { + const marked = params.compilationJob.solidityConfig[marker]; + const result = await runSuper(params); + if (marked) { + result.output = { + ...result.output, + errors: result.output.errors?.filter( + e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE, + ), + }; + } + return result; +}); diff --git a/package-lock.json b/package-lock.json index 913b83524..b606151df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", + "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", "lodash.startcase": "^4.4.0", "lodash.zip": "^4.2.0", @@ -9469,6 +9470,38 @@ "hardhat": "^2.0.2" } }, + "node_modules/hardhat-ignore-warnings": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0", + "node-interval-tree": "^2.0.1", + "solidity-comments": "^0.0.2" + } + }, + "node_modules/hardhat-ignore-warnings/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hardhat/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -12725,6 +12758,18 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-interval-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "dev": true, + "dependencies": { + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/nofilter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", @@ -14898,6 +14943,12 @@ "ieee754": "^1.2.1" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15898,12 +15949,193 @@ "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", "dev": true }, + "node_modules/solidity-comments": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "solidity-comments-darwin-arm64": "0.0.2", + "solidity-comments-darwin-x64": "0.0.2", + "solidity-comments-freebsd-x64": "0.0.2", + "solidity-comments-linux-arm64-gnu": "0.0.2", + "solidity-comments-linux-arm64-musl": "0.0.2", + "solidity-comments-linux-x64-gnu": "0.0.2", + "solidity-comments-linux-x64-musl": "0.0.2", + "solidity-comments-win32-arm64-msvc": "0.0.2", + "solidity-comments-win32-ia32-msvc": "0.0.2", + "solidity-comments-win32-x64-msvc": "0.0.2" + } + }, + "node_modules/solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, "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-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/solidity-coverage": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", @@ -26518,6 +26750,37 @@ "sha1": "^1.1.1" } }, + "hardhat-ignore-warnings": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "dev": true, + "requires": { + "minimatch": "^5.1.0", + "node-interval-tree": "^2.0.1", + "solidity-comments": "^0.0.2" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -28867,6 +29130,15 @@ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", "dev": true }, + "node-interval-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "dev": true, + "requires": { + "shallowequal": "^1.1.0" + } + }, "nofilter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", @@ -30535,6 +30807,12 @@ } } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -31332,12 +31610,100 @@ "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", "dev": true }, + "solidity-comments": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", + "dev": true, + "requires": { + "solidity-comments-darwin-arm64": "0.0.2", + "solidity-comments-darwin-x64": "0.0.2", + "solidity-comments-freebsd-x64": "0.0.2", + "solidity-comments-linux-arm64-gnu": "0.0.2", + "solidity-comments-linux-arm64-musl": "0.0.2", + "solidity-comments-linux-x64-gnu": "0.0.2", + "solidity-comments-linux-x64-musl": "0.0.2", + "solidity-comments-win32-arm64-msvc": "0.0.2", + "solidity-comments-win32-ia32-msvc": "0.0.2", + "solidity-comments-win32-x64-msvc": "0.0.2" + } + }, + "solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "dev": true, + "optional": true + }, + "solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "dev": true, + "optional": true + }, "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 }, + "solidity-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-x64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-x64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", + "dev": true, + "optional": true + }, "solidity-coverage": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", diff --git a/package.json b/package.json index 86b65c3a1..249d96078 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", + "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", "lodash.startcase": "^4.4.0", "lodash.zip": "^4.2.0", From 8f0d4d4a4149ea854fc4092ff9871182701e1c2b Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 22 Sep 2022 18:13:09 -0300 Subject: [PATCH 014/197] Fix fuzzing coverage (#3716) --- test/utils/math/Math.t.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/utils/math/Math.t.sol b/test/utils/math/Math.t.sol index 2baa3f16c..c72cc88ee 100644 --- a/test/utils/math/Math.t.sol +++ b/test/utils/math/Math.t.sol @@ -24,6 +24,10 @@ contract MathTest is Test { assertFalse(rounding == Math.Rounding.Up); assertTrue(_squareBigger(result + 1, input)); } + // input is perfect square + else { + assertEq(result * result, input); + } } function _squareBigger(uint256 value, uint256 ref) private pure returns (bool) { @@ -49,6 +53,8 @@ contract MathTest is Test { } else if (_powerOf2Smaller(result, input)) { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf2Bigger(result + 1, input)); + } else { + assertEq(2**result, input); } } @@ -74,6 +80,8 @@ contract MathTest is Test { } else if (_powerOf10Smaller(result, input)) { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf10Bigger(result + 1, input)); + } else { + assertEq(10**result, input); } } @@ -99,6 +107,8 @@ contract MathTest is Test { } else if (_powerOf256Smaller(result, input)) { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf256Bigger(result + 1, input)); + } else { + assertEq(256**result, input); } } From aa4b9017882a9ef221648d0768dcf2a8436d869c Mon Sep 17 00:00:00 2001 From: tincho Date: Fri, 23 Sep 2022 11:48:39 +0200 Subject: [PATCH 015/197] Improve `ERC20FlashMint` documentation (#3719) Co-authored-by: Hadrien Croubois --- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index a835f1236..697a97246 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -29,9 +29,9 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { } /** - * @dev Returns the fee applied when doing flash loans. By default this - * implementation has 0 fees. This function can be overloaded to make - * the flash loan mechanism deflationary. + * @dev Returns the fee applied when doing flash loans. This function calls + * the {_flashFee} function which returns the fee applied when doing flash + * loans. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. @@ -42,7 +42,9 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { } /** - * @dev Returns the fee applied when doing flash loans. This function calls the {flashFee} function which returns the fee applied when doing flash loans. + * @dev Returns the fee applied when doing flash loans. By default this + * implementation has 0 fees. This function can be overloaded to make + * the flash loan mechanism deflationary. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. From 408055dfabbe5ee7ebf8808ba6105d34f85e4940 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 23 Sep 2022 16:58:56 +0200 Subject: [PATCH 016/197] Change admin role allocation in TimelockControler constructor (#3722) Co-authored-by: Francisco --- CHANGELOG.md | 3 ++ contracts/governance/README.adoc | 2 +- contracts/governance/TimelockController.sol | 30 +++++++++++-------- test/governance/TimelockController.test.js | 19 ++++++++++-- .../GovernorTimelockControl.test.js | 9 ++++-- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9359c2edc..6932b4d88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased + * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) * `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) * `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) @@ -37,6 +38,8 @@ * `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. + * `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. + ### Deprecations * `EIP712`: Added the file `EIP712.sol` and deprecated `draft-EIP712.sol` since the EIP is no longer a Draft. Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3621)) diff --git a/contracts/governance/README.adoc b/contracts/governance/README.adoc index e34f0eae1..f711c63cf 100644 --- a/contracts/governance/README.adoc +++ b/contracts/governance/README.adoc @@ -153,7 +153,7 @@ Operations status can be queried using the functions: [[timelock-admin]] ===== Admin -The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, both the timelock and the deployer have this role. After further configuration and testing, the deployer can renounce this role such that all further maintenance operations have to go through the timelock process. +The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, the admin role can be granted to any address (in addition to the timelock itself). After further configuration and testing, this optional admin should renounce its role such that all further maintenance operations have to go through the timelock process. This role is identified by the *TIMELOCK_ADMIN_ROLE* value: `0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5` diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index 91fcbfcda..d5b18ace6 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -62,31 +62,37 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver event MinDelayChange(uint256 oldDuration, uint256 newDuration); /** - * @dev Initializes the contract with a given `minDelay`, and a list of - * initial proposers and executors. The proposers receive both the - * proposer and the canceller role (for backward compatibility). The - * executors receive the executor role. + * @dev Initializes the contract with the following parameters: * - * NOTE: At construction, both the deployer and the timelock itself are - * administrators. This helps further configuration of the timelock by the - * deployer. After configuration is done, it is recommended that the - * deployer renounces its admin position and relies on timelocked - * operations to perform future maintenance. + * - `minDelay`: initial minimum delay for operations + * - `proposers`: accounts to be granted proposer and canceller roles + * - `executors`: accounts to be granted executor role + * - `admin`: optional account to be granted admin role; disable with zero address + * + * IMPORTANT: The optional admin can aid with initial configuration of roles after deployment + * without being subject to delay, but this role should be subsequently renounced in favor of + * administration through timelocked proposals. Previous versions of this contract would assign + * this admin to the deployer automatically and should be renounced as well. */ constructor( uint256 minDelay, address[] memory proposers, - address[] memory executors + address[] memory executors, + address admin ) { _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE); - // deployer + self administration - _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender()); + // self administration _setupRole(TIMELOCK_ADMIN_ROLE, address(this)); + // optional admin + if (admin != address(0)) { + _setupRole(TIMELOCK_ADMIN_ROLE, admin); + } + // register proposers and cancellers for (uint256 i = 0; i < proposers.length; ++i) { _setupRole(PROPOSER_ROLE, proposers[i]); diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index 2274bb0a4..e0a32440e 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -1,5 +1,5 @@ const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); -const { ZERO_BYTES32 } = constants; +const { ZERO_ADDRESS, ZERO_BYTES32 } = constants; const { expect } = require('chai'); @@ -52,7 +52,7 @@ function genOperationBatch (targets, values, payloads, predecessor, salt) { } contract('TimelockController', function (accounts) { - const [ admin, proposer, canceller, executor, other ] = accounts; + const [ , admin, proposer, canceller, executor, other ] = accounts; const TIMELOCK_ADMIN_ROLE = web3.utils.soliditySha3('TIMELOCK_ADMIN_ROLE'); const PROPOSER_ROLE = web3.utils.soliditySha3('PROPOSER_ROLE'); @@ -65,7 +65,7 @@ contract('TimelockController', function (accounts) { MINDELAY, [ proposer ], [ executor ], - { from: admin }, + admin, ); expect(await this.mock.hasRole(CANCELLER_ROLE, proposer)).to.be.equal(true); @@ -102,6 +102,19 @@ contract('TimelockController', function (accounts) { ))).to.be.deep.equal([ false, false, true ]); }); + it('optional admin', async function () { + const mock = await TimelockController.new( + MINDELAY, + [ proposer ], + [ executor ], + ZERO_ADDRESS, + { from: other }, + ); + + expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, admin)).to.be.equal(false); + expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, other)).to.be.equal(false); + }); + describe('methods', function () { describe('operation hashing', function () { it('hashOperation', async function () { diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 45e26c935..d06f79992 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -33,7 +33,7 @@ contract('GovernorTimelockControl', function (accounts) { const [ deployer ] = await web3.eth.getAccounts(); this.token = await Token.new(tokenName, tokenSymbol); - this.timelock = await Timelock.new(3600, [], []); + this.timelock = await Timelock.new(3600, [], [], deployer); this.mock = await Governor.new( name, this.token.address, @@ -322,7 +322,12 @@ contract('GovernorTimelockControl', function (accounts) { describe('updateTimelock', function () { beforeEach(async function () { - this.newTimelock = await Timelock.new(3600, [], []); + this.newTimelock = await Timelock.new( + 3600, + [ this.mock.address ], + [ this.mock.address ], + constants.ZERO_ADDRESS, + ); }); it('is protected', async function () { From 3f6c8245aaea433e435039c80e08fe342d7ebe63 Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 13 Sep 2022 11:43:30 -0300 Subject: [PATCH 017/197] Update lockfile (#3698) (cherry picked from commit fac768cd2c1311955d30fd409320d2c06e32070b) --- package-lock.json | 2359 +++++++++++++++++++++++---------------------- 1 file changed, 1199 insertions(+), 1160 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ee88247f..291625b4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,9 +151,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" @@ -282,34 +282,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "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/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/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -320,28 +292,6 @@ "ethereumjs-util": "^7.1.5" } }, - "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/ethash/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" - } - }, "node_modules/@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -352,26 +302,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -1231,10 +1161,193 @@ "node": ">= 8" } }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.4.tgz", - "integrity": "sha512-bgS1HtuPZxOzEsQsF6jxfoOMQXKRlddsoJPT8dBNH1Pgpv9Y8AUQ3ecQk4ujAw9EOdTE1xAL4u7S6Gu4p3DO+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", "dev": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -1243,10 +1356,191 @@ "hardhat": "^2.9.5" } }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.6.tgz", - "integrity": "sha512-kzkpVEX36yOmdhCJHesu+1nB+fiaKpMrvUSVd0Ox6Jila+8aSxeHTC4bbEBOIqJcvOQZ3sj5fzuE5VjhNkZkvw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dev": true, "dependencies": { "@nomiclabs/truffle-contract": "^4.2.23", @@ -1384,9 +1678,9 @@ "dev": true }, "node_modules/@oclif/core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.0.tgz", - "integrity": "sha512-xtqhAbjQHBcz+xQpEHJ3eJEVfRQ4zl41Yw5gw/N+D1jgaIUrHTxCY/sfTvhw93LAQo7B++ozHzSb7DISFXsQFQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", + "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", "dev": true, "dependencies": { "@oclif/linewrap": "^1.0.0", @@ -1952,9 +2246,9 @@ } }, "node_modules/@openzeppelin/test-helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz", - "integrity": "sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", "dev": true, "dependencies": { "@openzeppelin/contract-loader": "^0.6.2", @@ -2159,13 +2453,12 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.0.tgz", - "integrity": "sha512-W4Kbm17+QQeeK/uXB80t10gw1H8lEnAu+B7bu7NZl2Zy74kwhsrGC+qCjynhRQtGsFnCcsI58VxjjNkn1PsgSg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", "dev": true, "dependencies": { "change-case": "3.0.2", - "faker": "5.5.3", "fast-check": "3.1.1", "web3-utils": "1.7.4" } @@ -2201,12 +2494,12 @@ "dev": true }, "node_modules/@truffle/codec": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.3.tgz", - "integrity": "sha512-8lwWQXkbrmewwiDSekZPUiweysGKXOpFSNhtWCi1CS6gtla3bNK8/xE1nUi3ALsuKw2745kzzLZpwKsipGtGKg==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", "dev": true, "dependencies": { - "@truffle/abi-utils": "^0.3.0", + "@truffle/abi-utils": "^0.3.1", "@truffle/compile-common": "^0.8.0", "big.js": "^6.0.3", "bn.js": "^5.1.3", @@ -2253,15 +2546,15 @@ } }, "node_modules/@truffle/contract": { - "version": "4.5.23", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.5.23.tgz", - "integrity": "sha512-ni/RzBdDFo60jaCb8ETCPBfPHRr1WVH5Y27EKmfEyrNg8TC7WZ28SQylMBkwdrgLjqAyPw3Pq7Y5us1f9tcyMQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", + "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", "dev": true, "dependencies": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.33", + "@truffle/debug-utils": "^6.0.34", "@truffle/error": "^0.1.1", "@truffle/interface-adapter": "^0.5.21", "bignumber.js": "^7.2.1", @@ -2835,12 +3128,12 @@ "dev": true }, "node_modules/@truffle/debug-utils": { - "version": "6.0.33", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.33.tgz", - "integrity": "sha512-nz6nApTxeqyRM1f9gO4g7sexmlC66YZ6dE1x2KbIz24FYx1yzfT5fAsQ2ZDoFHH++Ah4LH/1TMso76zspcn+vQ==", + "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", "dev": true, "dependencies": { - "@truffle/codec": "^0.14.3", + "@truffle/codec": "^0.14.4", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -4141,10 +4434,10 @@ "node": ">=4" } }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "node_modules/@types/bignumber.js": { @@ -4218,12 +4511,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -4239,23 +4526,6 @@ "@types/node": "*" } }, - "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", @@ -4269,9 +4539,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", "dev": true }, "node_modules/@types/pbkdf2": { @@ -4337,20 +4607,46 @@ "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", "dev": true }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "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, "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": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" }, "engines": { - "node": ">=6" + "node": ">=12" + } + }, + "node_modules/abstract-level/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/accepts": { @@ -4388,9 +4684,9 @@ } }, "node_modules/address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -5028,6 +5324,27 @@ "url": "https://opencollective.com/bigjs" } }, + "node_modules/bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "dependencies": { + "bigint-mod-arith": "^3.1.0" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -5174,6 +5491,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -5510,6 +5839,15 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": 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, + "engines": { + "node": ">=6" + } + }, "node_modules/cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -5760,6 +6098,23 @@ "node": ">=0.10.0" } }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6017,19 +6372,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6183,17 +6525,6 @@ "node": ">=0.10.0" } }, - "node_modules/core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", - "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", @@ -6522,35 +6853,6 @@ "node": ">=10" } }, - "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/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -6845,21 +7147,6 @@ "node": ">= 0.8" } }, - "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/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -6891,9 +7178,9 @@ } }, "node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true, "engines": { "node": ">=0.12" @@ -6911,18 +7198,6 @@ "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", @@ -6933,16 +7208,16 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -6954,9 +7229,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -8817,12 +9092,6 @@ "node >=0.6.0" ] }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "node_modules/fast-check": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", @@ -8852,9 +9121,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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", @@ -9272,9 +9541,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -9661,20 +9930,25 @@ } }, "node_modules/hardhat": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.2.tgz", - "integrity": "sha512-L/KvDDT/MA6332uAtYTqdcHoSABljw4pPjHQe5SHdIJ+xKfaSc6vDKw03CmrQ5Xup0gHs8XnVSBpZo1AbbIW7g==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -9689,15 +9963,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "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", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -9705,11 +9978,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -9735,13 +10006,13 @@ } }, "node_modules/hardhat-gas-reporter": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz", - "integrity": "sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g==", + "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, "dependencies": { "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.24", + "eth-gas-reporter": "^0.2.25", "sha1": "^1.1.1" }, "peerDependencies": { @@ -10042,15 +10313,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -10063,18 +10325,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", @@ -10454,12 +10704,6 @@ "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.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -10813,9 +11057,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true, "engines": { "node": ">= 0.4" @@ -11043,15 +11287,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -11098,15 +11333,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "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", @@ -11119,15 +11345,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -11267,19 +11484,6 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "node_modules/isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", @@ -11489,12 +11693,11 @@ } }, "node_modules/keyv": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", - "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "dependencies": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -11528,119 +11731,67 @@ "node": ">=0.10.0" } }, - "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/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "buffer": "^5.6.0" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" }, "engines": { - "node": ">=6" - } - }, - "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" + "node": ">=12" }, - "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" - }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, "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/level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "dependencies": { - "xtend": "^4.0.2" + "buffer": "^6.0.3", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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/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": { - "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" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/levn": { @@ -12199,12 +12350,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/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -12267,45 +12412,20 @@ "node": ">= 0.6" } }, - "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/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-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" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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/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/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12330,20 +12450,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/merkletreejs": { "version": "0.2.32", "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", @@ -12817,6 +12923,15 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "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, + "engines": { + "node": ">=10" + } + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -13032,6 +13147,12 @@ "node": ">=0.10.0" } }, + "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 + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13523,15 +13644,6 @@ "node": ">=12.20" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -13574,18 +13686,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -13661,12 +13761,12 @@ } }, "node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "dependencies": { - "entities": "^4.3.0" + "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -14117,12 +14217,6 @@ "node": ">=0.8.0" } }, - "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", @@ -14163,9 +14257,9 @@ } }, "node_modules/pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", "dev": true, "funding": { "type": "opencollective", @@ -14842,6 +14936,29 @@ "queue-microtask": "^1.2.2" } }, + "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, + "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/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -15015,15 +15132,6 @@ "node": ">=10.0.0" } }, - "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.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -16341,9 +16449,9 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.21.tgz", - "integrity": "sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg==", + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", + "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", "dev": true, "dependencies": { "@solidity-parser/parser": "^0.14.0", @@ -16966,9 +17074,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -17001,16 +17109,16 @@ } }, "node_modules/swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dev": true, "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -17019,16 +17127,25 @@ "xhr-request": "^1.0.1" } }, - "node_modules/swarm-js/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" } }, "node_modules/swarm-js/node_modules/fs-extra": { @@ -17042,86 +17159,60 @@ "universalify": "^0.1.0" } }, - "node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/swarm-js/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.19.0" } }, "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "engines": { - "node": ">=4" - } - }, - "node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/sync-request": { @@ -17528,12 +17619,6 @@ "node": ">=0.6" } }, - "node_modules/true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -17856,15 +17941,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "node_modules/url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -19011,9 +19087,9 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -19126,34 +19202,6 @@ "strip-json-comments": "^3.1.1" } }, - "@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, - "requires": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "@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, - "requires": { - "@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" - } - }, "@ethereumjs/common": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", @@ -19164,30 +19212,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@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, - "requires": { - "@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" - }, - "dependencies": { - "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, - "requires": { - "safe-buffer": "^5.1.1" - } - } - } - }, "@ethereumjs/tx": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", @@ -19198,26 +19222,6 @@ "ethereumjs-util": "^7.1.5" } }, - "@ethereumjs/vm": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.9.3.tgz", - "integrity": "sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.3", - "@ethereumjs/blockchain": "^5.5.3", - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.4", - "rustbn.js": "~0.2.0" - } - }, "@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -19746,19 +19750,260 @@ "fastq": "^1.6.0" } }, + "@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + } + }, + "@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + } + }, + "@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "requires": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.4.tgz", - "integrity": "sha512-bgS1HtuPZxOzEsQsF6jxfoOMQXKRlddsoJPT8dBNH1Pgpv9Y8AUQ3ecQk4ujAw9EOdTE1xAL4u7S6Gu4p3DO+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", "dev": true, "requires": { "ethereumjs-util": "^7.1.4" } }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "requires": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "dev": true, + "optional": true + }, "@nomiclabs/hardhat-truffle5": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.6.tgz", - "integrity": "sha512-kzkpVEX36yOmdhCJHesu+1nB+fiaKpMrvUSVd0Ox6Jila+8aSxeHTC4bbEBOIqJcvOQZ3sj5fzuE5VjhNkZkvw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dev": true, "requires": { "@nomiclabs/truffle-contract": "^4.2.23", @@ -19861,9 +20106,9 @@ } }, "@oclif/core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.0.tgz", - "integrity": "sha512-xtqhAbjQHBcz+xQpEHJ3eJEVfRQ4zl41Yw5gw/N+D1jgaIUrHTxCY/sfTvhw93LAQo7B++ozHzSb7DISFXsQFQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", + "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", "dev": true, "requires": { "@oclif/linewrap": "^1.0.0", @@ -20307,9 +20552,9 @@ } }, "@openzeppelin/test-helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.15.tgz", - "integrity": "sha512-10fS0kyOjc/UObo9iEWPNbC6MCeiQ7z97LDOJBj68g+AAs5pIGEI2h3V6G9TYTIq8VxOdwMQbfjKrx7Y3YZJtA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", "dev": true, "requires": { "@openzeppelin/contract-loader": "^0.6.2", @@ -20465,13 +20710,12 @@ } }, "@truffle/abi-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.0.tgz", - "integrity": "sha512-W4Kbm17+QQeeK/uXB80t10gw1H8lEnAu+B7bu7NZl2Zy74kwhsrGC+qCjynhRQtGsFnCcsI58VxjjNkn1PsgSg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", "dev": true, "requires": { "change-case": "3.0.2", - "faker": "5.5.3", "fast-check": "3.1.1", "web3-utils": "1.7.4" }, @@ -20506,12 +20750,12 @@ "dev": true }, "@truffle/codec": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.3.tgz", - "integrity": "sha512-8lwWQXkbrmewwiDSekZPUiweysGKXOpFSNhtWCi1CS6gtla3bNK8/xE1nUi3ALsuKw2745kzzLZpwKsipGtGKg==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", "dev": true, "requires": { - "@truffle/abi-utils": "^0.3.0", + "@truffle/abi-utils": "^0.3.1", "@truffle/compile-common": "^0.8.0", "big.js": "^6.0.3", "bn.js": "^5.1.3", @@ -20557,15 +20801,15 @@ } }, "@truffle/contract": { - "version": "4.5.23", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.5.23.tgz", - "integrity": "sha512-ni/RzBdDFo60jaCb8ETCPBfPHRr1WVH5Y27EKmfEyrNg8TC7WZ28SQylMBkwdrgLjqAyPw3Pq7Y5us1f9tcyMQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", + "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.33", + "@truffle/debug-utils": "^6.0.34", "@truffle/error": "^0.1.1", "@truffle/interface-adapter": "^0.5.21", "bignumber.js": "^7.2.1", @@ -21040,12 +21284,12 @@ } }, "@truffle/debug-utils": { - "version": "6.0.33", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.33.tgz", - "integrity": "sha512-nz6nApTxeqyRM1f9gO4g7sexmlC66YZ6dE1x2KbIz24FYx1yzfT5fAsQ2ZDoFHH++Ah4LH/1TMso76zspcn+vQ==", + "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", "dev": true, "requires": { - "@truffle/codec": "^0.14.3", + "@truffle/codec": "^0.14.4", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -22116,10 +22360,10 @@ } } }, - "@types/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==", + "@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "@types/bignumber.js": { @@ -22192,12 +22436,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -22213,23 +22451,6 @@ "@types/node": "*" } }, - "@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 - }, - "@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, - "requires": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, "@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", @@ -22243,9 +22464,9 @@ "dev": true }, "@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==", + "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", "dev": true }, "@types/pbkdf2": { @@ -22308,17 +22529,31 @@ "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", "dev": true }, - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "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, "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "accepts": { @@ -22345,9 +22580,9 @@ "requires": {} }, "address": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz", - "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true }, "adm-zip": { @@ -22833,6 +23068,21 @@ "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", "dev": true }, + "bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "requires": { + "bigint-mod-arith": "^3.1.0" + } + }, + "bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true + }, "bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -22959,6 +23209,18 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -23243,6 +23505,12 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true + }, "cbor": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", @@ -23447,6 +23715,19 @@ "static-extend": "^0.1.1" } }, + "classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -23652,16 +23933,6 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -23801,12 +24072,6 @@ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true }, - "core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -24065,31 +24330,6 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, - "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, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "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, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - } - } - }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -24321,18 +24561,6 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, - "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, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -24360,9 +24588,9 @@ } }, "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "env-paths": { @@ -24371,15 +24599,6 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, - "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, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -24390,16 +24609,16 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.2", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", @@ -24411,9 +24630,9 @@ "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", @@ -25935,12 +26154,6 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, - "faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "fast-check": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", @@ -25963,9 +26176,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -26299,9 +26512,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -26597,20 +26810,25 @@ } }, "hardhat": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.10.2.tgz", - "integrity": "sha512-L/KvDDT/MA6332uAtYTqdcHoSABljw4pPjHQe5SHdIJ+xKfaSc6vDKw03CmrQ5Xup0gHs8XnVSBpZo1AbbIW7g==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/blockchain": "^5.5.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/tx": "^3.5.1", - "@ethereumjs/vm": "^5.9.0", "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", - "@solidity-parser/parser": "^0.14.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", "abort-controller": "^3.0.0", @@ -26625,15 +26843,14 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^7.1.4", "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", - "merkle-patricia-tree": "^4.2.4", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", @@ -26641,11 +26858,9 @@ "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", - "slash": "^3.0.0", "solc": "0.7.3", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", - "true-case-path": "^2.2.1", "tsort": "0.0.1", "undici": "^5.4.0", "uuid": "^8.3.2", @@ -26855,13 +27070,13 @@ } }, "hardhat-gas-reporter": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz", - "integrity": "sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g==", + "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, "requires": { "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.24", + "eth-gas-reporter": "^0.2.25", "sha1": "^1.1.1" } }, @@ -26895,27 +27110,12 @@ "get-intrinsic": "^1.1.1" } }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, "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 }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", @@ -27216,12 +27416,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -27487,9 +27681,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true }, "is-core-module": { @@ -27645,12 +27839,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true - }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -27682,12 +27870,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, "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", @@ -27697,12 +27879,6 @@ "call-bind": "^1.0.2" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -27806,16 +27982,6 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, "jake": { "version": "10.8.5", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", @@ -27984,12 +28150,11 @@ } }, "keyv": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.4.1.tgz", - "integrity": "sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "requires": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -28017,92 +28182,42 @@ "invert-kv": "^1.0.0" } }, - "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==", + "level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "requires": { - "buffer": "^5.6.0" - } - }, - "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 - }, - "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, - "requires": { - "errno": "~0.1.1" - } - }, - "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, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "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, - "requires": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - } - }, - "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, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" } }, "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 + }, + "level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "requires": { - "xtend": "^4.0.2" - } - }, - "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, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "requires": { - "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" + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } } }, "levn": { @@ -28571,12 +28686,6 @@ "yallist": "^3.0.2" } }, - "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 - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -28627,39 +28736,15 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "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, "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - } + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" } }, "memorystream": { @@ -28680,20 +28765,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, - "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, - "requires": { - "@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" - } - }, "merkletreejs": { "version": "0.2.32", "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", @@ -29059,6 +29130,12 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, + "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 + }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -29247,6 +29324,12 @@ } } }, + "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 + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -29623,12 +29706,6 @@ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -29656,15 +29733,6 @@ "aggregate-error": "^3.0.0" } }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -29731,12 +29799,12 @@ } }, "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "requires": { - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "parse5-htmlparser2-tree-adapter": { @@ -30079,12 +30147,6 @@ "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30122,9 +30184,9 @@ "dev": true }, "pure-rand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.1.tgz", - "integrity": "sha512-ksWccjmXOHU2gJBnH0cK1lSYdvSZ0zLoCMSz/nTGh6hDvCSgcRxDyIcOBD6KNxFz3xhMPm/T267Tbe2JRymKEQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", "dev": true }, "qs": { @@ -30624,6 +30686,15 @@ "queue-microtask": "^1.2.2" } }, + "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, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", @@ -30756,12 +30827,6 @@ "node-gyp-build": "^4.2.0" } }, - "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 - }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -31830,9 +31895,9 @@ "dev": true }, "solidity-coverage": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.21.tgz", - "integrity": "sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg==", + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", + "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", "dev": true, "requires": { "@solidity-parser/parser": "^0.14.0", @@ -32341,9 +32406,9 @@ } }, "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -32367,16 +32432,16 @@ } }, "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dev": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "eth-lib": "^0.1.26", "fs-extra": "^4.0.2", - "got": "^7.1.0", + "got": "^11.8.5", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", @@ -32385,15 +32450,21 @@ "xhr-request": "^1.0.1" }, "dependencies": { - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "requires": { - "mimic-response": "^1.0.0" + "defer-to-connect": "^2.0.0" } }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -32405,66 +32476,46 @@ "universalify": "^0.1.0" } }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - }, "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } }, "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } } } }, @@ -32799,12 +32850,6 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -33071,12 +33116,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", From c8a0639afe98a0293d2deb712252162531ab1ff3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:45:11 -0300 Subject: [PATCH 018/197] Update dependency solidity-coverage to ^0.8.0 (#3681) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit d6975f8e07670f7652e056ee20ab5e4d3f5768c6) --- package-lock.json | 1852 ++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 817 insertions(+), 1037 deletions(-) diff --git a/package-lock.json b/package-lock.json index 291625b4f..58a8a8135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "semver": "^7.3.5", "solhint": "^3.3.6", "solidity-ast": "^0.4.25", - "solidity-coverage": "^0.7.18", + "solidity-coverage": "^0.8.0", "solidity-docgen": "^0.5.3", "web3": "^1.3.0", "yargs": "^17.0.0" @@ -3785,568 +3785,6 @@ "node": ">=8.0.0" } }, - "node_modules/@truffle/provider": { - "version": "0.2.59", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.59.tgz", - "integrity": "sha512-4b79yUSZlEd7KqzaPkQiiT4aRCGaI+pXPdwJMD0olLvnZrGoNrBtRQSmnXesxBcqi6FaSDxxC+/9URG2HBPE2g==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", - "debug": "^4.3.1", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/provider/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/provider/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@truffle/provider/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/provider/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "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/@truffle/provider/node_modules/web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", @@ -6980,6 +6418,18 @@ "randombytes": "^2.0.0" } }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10452,6 +9902,12 @@ "upper-case": "^1.1.3" } }, + "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/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -16449,32 +15905,55 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", + "@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.0" + "web3-utils": "^1.3.6" }, "bin": { "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "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/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==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/solidity-coverage/node_modules/ansi-styles": { @@ -16489,6 +15968,15 @@ "node": ">=4" } }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/solidity-coverage/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -16503,6 +15991,38 @@ "node": ">=4" } }, + "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==", + "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/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/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -16518,6 +16038,40 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "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_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==", + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -16527,6 +16081,30 @@ "node": ">=0.8.0" } }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, "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", @@ -16541,6 +16119,38 @@ "node": ">=6 <7 || >=8" } }, + "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\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "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": "*" + } + }, "node_modules/solidity-coverage/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -16550,6 +16160,212 @@ "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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "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_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/solidity-coverage/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/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==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16562,6 +16378,80 @@ "node": ">=4" } }, + "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==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/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/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==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/solidity-docgen": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", @@ -21825,467 +21715,6 @@ } } }, - "@truffle/provider": { - "version": "0.2.59", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.59.tgz", - "integrity": "sha512-4b79yUSZlEd7KqzaPkQiiT4aRCGaI+pXPdwJMD0olLvnZrGoNrBtRQSmnXesxBcqi6FaSDxxC+/9URG2HBPE2g==", - "dev": true, - "requires": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", - "debug": "^4.3.1", - "web3": "1.7.4" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - } - } - }, "@trufflesuite/chromafi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", @@ -24427,6 +23856,15 @@ "randombytes": "^2.0.0" } }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "requires": { + "heap": ">= 0.2.0" + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -27220,6 +26658,12 @@ "upper-case": "^1.1.3" } }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -31895,31 +31339,45 @@ "dev": true }, "solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, "requires": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", + "@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.0" + "web3-utils": "^1.3.6" }, "dependencies": { + "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 + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -31929,6 +31387,12 @@ "color-convert": "^1.9.0" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -31940,6 +31404,33 @@ "supports-color": "^5.3.0" } }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -31955,12 +31446,57 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "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 + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "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, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -31972,12 +31508,191 @@ "universalify": "^0.1.0" } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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" + } + }, "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 }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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 + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "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, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -31986,6 +31701,71 @@ "requires": { "has-flag": "^3.0.0" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } } } }, diff --git a/package.json b/package.json index 714f43727..84247b7a2 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "semver": "^7.3.5", "solhint": "^3.3.6", "solidity-ast": "^0.4.25", - "solidity-coverage": "^0.7.18", + "solidity-coverage": "^0.8.0", "solidity-docgen": "^0.5.3", "web3": "^1.3.0", "yargs": "^17.0.0" From 1bbdf2005db4d3e491a974dd5bd4550723572e4e Mon Sep 17 00:00:00 2001 From: Emre Tepe Date: Fri, 16 Sep 2022 01:41:12 +0300 Subject: [PATCH 019/197] Update the informational link (#3703) (cherry picked from commit 76b538c226df019a1451467d36351b3c61cd4139) --- contracts/metatx/MinimalForwarder.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index 8433a65f8..34ca2922d 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -57,7 +57,7 @@ contract MinimalForwarder is EIP712 { ); // Validate that the relayer has sent enough gas for the call. - // See https://ronan.eth.link/blog/ethereum-gas-dangers/ + // See https://ronan.eth.limo/blog/ethereum-gas-dangers/ if (gasleft() <= req.gas / 63) { // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since // neither revert or assert consume all gas since Solidity 0.8.0 From 09369d265c3769fc1b2f91e38262bc694e6a9318 Mon Sep 17 00:00:00 2001 From: tincho Date: Fri, 16 Sep 2022 20:16:37 +0200 Subject: [PATCH 020/197] Improve Initializable docstrings (#3704) Co-authored-by: tincho Co-authored-by: Francisco Giordano (cherry picked from commit a549ec673e29101003ece15d4e864226cdf00d84) --- contracts/proxy/utils/Initializable.sol | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 334ffdc3c..8147d678f 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -73,7 +73,12 @@ abstract contract Initializable { /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, - * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. + * `onlyInitializing` functions can be used to initialize parent contracts. + * + * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a + * constructor. + * + * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; @@ -97,12 +102,18 @@ abstract contract Initializable { * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * - * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original - * initialization step. This is essential to configure modules that are added through upgrades and that require - * initialization. + * A reinitializer may be used after the original initialization step. This is essential to configure modules that + * are added through upgrades and that require initialization. + * + * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` + * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. + * + * WARNING: setting the version to 255 will prevent any future reinitialization. + * + * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); @@ -127,6 +138,8 @@ abstract contract Initializable { * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. + * + * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); From 8740d8f7f3bd81634d64cc952cda7cc25d223fc8 Mon Sep 17 00:00:00 2001 From: Ana Julia Bittencourt Date: Thu, 22 Sep 2022 16:42:52 -0300 Subject: [PATCH 021/197] Update ReentrancyGuard documentation (#3715) (cherry picked from commit 06e678d6ef966d9c55d512b736622682bcfdf7a7) --- contracts/security/ReentrancyGuard.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index 849d20cfe..f2cd6321c 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -54,7 +54,7 @@ abstract contract ReentrancyGuard { } function _nonReentrantBefore() private { - // On the first call to nonReentrant, _notEntered will be true + // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail From 089f9b95af980a61e369342f4b3ca52c69e4c38c Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 22 Sep 2022 17:33:13 -0300 Subject: [PATCH 022/197] Ignore specific warnings and make the rest into errors (#3695) (cherry picked from commit 046121e08027414184165bf2ac042e1d356d3bb0) --- ...1ConsecutiveEnumerableMock.unreachable.sol | 62 +++ contracts/mocks/ERC721ConsecutiveMock.sol | 56 --- .../ERC721/extensions/ERC721Enumerable.sol | 8 +- hardhat.config.js | 8 + hardhat/ignore-unreachable-warnings.js | 47 +++ package-lock.json | 366 ++++++++++++++++++ package.json | 1 + 7 files changed, 490 insertions(+), 58 deletions(-) create mode 100644 contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol create mode 100644 hardhat/ignore-unreachable-warnings.js diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol new file mode 100644 index 000000000..791bf3f93 --- /dev/null +++ b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../token/ERC721/extensions/ERC721Consecutive.sol"; +import "../token/ERC721/extensions/ERC721Enumerable.sol"; + +contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable { + constructor( + string memory name, + string memory symbol, + address[] memory receivers, + uint96[] memory amounts + ) ERC721(name, symbol) { + for (uint256 i = 0; i < receivers.length; ++i) { + _mintConsecutive(receivers[i], amounts[i]); + } + } + + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC721, ERC721Enumerable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } + + function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) { + return super._ownerOf(tokenId); + } + + function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) { + super._mint(to, tokenId); + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override(ERC721, ERC721Enumerable) { + super._beforeTokenTransfer(from, to, tokenId); + } + + function _afterTokenTransfer( + address from, + address to, + uint256 tokenId + ) internal virtual override(ERC721, ERC721Consecutive) { + super._afterTokenTransfer(from, to, tokenId); + } + + function _beforeConsecutiveTokenTransfer( + address from, + address to, + uint256 first, + uint96 size + ) internal virtual override(ERC721, ERC721Enumerable) { + super._beforeConsecutiveTokenTransfer(from, to, first, size); + } +} diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index c4965aa85..b88bef578 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -95,62 +95,6 @@ contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausa } } -contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable { - constructor( - string memory name, - string memory symbol, - address[] memory receivers, - uint96[] memory amounts - ) ERC721(name, symbol) { - for (uint256 i = 0; i < receivers.length; ++i) { - _mintConsecutive(receivers[i], amounts[i]); - } - } - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(ERC721, ERC721Enumerable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) { - return super._ownerOf(tokenId); - } - - function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) { - super._mint(to, tokenId); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeTokenTransfer(from, to, tokenId); - } - - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); - } -} - contract ERC721ConsecutiveNoConstructorMintMock is ERC721Consecutive { constructor(string memory name, string memory symbol) ERC721(name, symbol) { _mint(msg.sender, 0); diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 8e22c0ae6..760f643f6 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -106,9 +106,13 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { address, address, uint256, - uint96 + uint96 size ) internal virtual override { - revert("ERC721Enumerable: consecutive transfers not supported"); + // We revert because enumerability is not supported with consecutive batch minting. + // This conditional is only needed to silence spurious warnings about unreachable code. + if (size > 0) { + revert("ERC721Enumerable: consecutive transfers not supported"); + } } /** diff --git a/hardhat.config.js b/hardhat.config.js index 0bfef82ce..fb28b5484 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -50,6 +50,7 @@ const argv = require('yargs/yargs')() .argv; require('@nomiclabs/hardhat-truffle5'); +require('hardhat-ignore-warnings'); if (argv.gas) { require('hardhat-gas-reporter'); @@ -75,6 +76,13 @@ module.exports = { viaIR: withOptimizations && argv.ir, }, }, + warnings: { + '*': { + 'code-size': withOptimizations, + 'unused-param': !argv.coverage, // coverage causes unused-param warnings + default: 'error', + }, + }, networks: { hardhat: { blockGasLimit: 10000000, diff --git a/hardhat/ignore-unreachable-warnings.js b/hardhat/ignore-unreachable-warnings.js new file mode 100644 index 000000000..c9d3c36a4 --- /dev/null +++ b/hardhat/ignore-unreachable-warnings.js @@ -0,0 +1,47 @@ +// Warnings about unreachable code are emitted with a source location that corresponds to the unreachable code. +// We have some testing contracts that purposely cause unreachable code, but said code is in the library contracts, and +// with hardhat-ignore-warnings we are not able to selectively ignore them without potentially ignoring relevant +// warnings that we don't want to miss. +// Thus, we need to handle these warnings separately. We force Hardhat to compile them in a separate compilation job and +// then ignore the warnings about unreachable code that come from that compilation job. + +const { task } = require('hardhat/config'); +const { + TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, + TASK_COMPILE_SOLIDITY_COMPILE, +} = require('hardhat/builtin-tasks/task-names'); + +const marker = Symbol('unreachable'); +const markedCache = new WeakMap(); + +task(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, async (params, _, runSuper) => { + const job = await runSuper(params); + // If the file is in the unreachable directory, we make a copy of the config and mark it, which will cause it to get + // compiled separately (along with the other marked files). + if (params.file.sourceName.startsWith('contracts/mocks/') && /\bunreachable\b/.test(params.file.sourceName)) { + const originalConfig = job.solidityConfig; + let markedConfig = markedCache.get(originalConfig); + if (markedConfig === undefined) { + markedConfig = { ...originalConfig, [marker]: true }; + markedCache.set(originalConfig, markedConfig); + } + job.solidityConfig = markedConfig; + } + return job; +}); + +const W_UNREACHABLE_CODE = '5740'; + +task(TASK_COMPILE_SOLIDITY_COMPILE, async (params, _, runSuper) => { + const marked = params.compilationJob.solidityConfig[marker]; + const result = await runSuper(params); + if (marked) { + result.output = { + ...result.output, + errors: result.output.errors?.filter( + e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE, + ), + }; + } + return result; +}); diff --git a/package-lock.json b/package-lock.json index 58a8a8135..d465941c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", + "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", "lodash.startcase": "^4.4.0", "lodash.zip": "^4.2.0", @@ -9469,6 +9470,38 @@ "hardhat": "^2.0.2" } }, + "node_modules/hardhat-ignore-warnings": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0", + "node-interval-tree": "^2.0.1", + "solidity-comments": "^0.0.2" + } + }, + "node_modules/hardhat-ignore-warnings/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hardhat/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -12725,6 +12758,18 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-interval-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "dev": true, + "dependencies": { + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/nofilter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", @@ -14898,6 +14943,12 @@ "ieee754": "^1.2.1" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15898,12 +15949,193 @@ "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", "dev": true }, + "node_modules/solidity-comments": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "solidity-comments-darwin-arm64": "0.0.2", + "solidity-comments-darwin-x64": "0.0.2", + "solidity-comments-freebsd-x64": "0.0.2", + "solidity-comments-linux-arm64-gnu": "0.0.2", + "solidity-comments-linux-arm64-musl": "0.0.2", + "solidity-comments-linux-x64-gnu": "0.0.2", + "solidity-comments-linux-x64-musl": "0.0.2", + "solidity-comments-win32-arm64-msvc": "0.0.2", + "solidity-comments-win32-ia32-msvc": "0.0.2", + "solidity-comments-win32-x64-msvc": "0.0.2" + } + }, + "node_modules/solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, "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-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/solidity-coverage": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", @@ -26518,6 +26750,37 @@ "sha1": "^1.1.1" } }, + "hardhat-ignore-warnings": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "dev": true, + "requires": { + "minimatch": "^5.1.0", + "node-interval-tree": "^2.0.1", + "solidity-comments": "^0.0.2" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -28867,6 +29130,15 @@ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", "dev": true }, + "node-interval-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "dev": true, + "requires": { + "shallowequal": "^1.1.0" + } + }, "nofilter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", @@ -30535,6 +30807,12 @@ } } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -31332,12 +31610,100 @@ "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", "dev": true }, + "solidity-comments": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", + "dev": true, + "requires": { + "solidity-comments-darwin-arm64": "0.0.2", + "solidity-comments-darwin-x64": "0.0.2", + "solidity-comments-freebsd-x64": "0.0.2", + "solidity-comments-linux-arm64-gnu": "0.0.2", + "solidity-comments-linux-arm64-musl": "0.0.2", + "solidity-comments-linux-x64-gnu": "0.0.2", + "solidity-comments-linux-x64-musl": "0.0.2", + "solidity-comments-win32-arm64-msvc": "0.0.2", + "solidity-comments-win32-ia32-msvc": "0.0.2", + "solidity-comments-win32-x64-msvc": "0.0.2" + } + }, + "solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "dev": true, + "optional": true + }, + "solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "dev": true, + "optional": true + }, "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 }, + "solidity-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-x64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-x64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", + "dev": true, + "optional": true + }, "solidity-coverage": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", diff --git a/package.json b/package.json index 84247b7a2..e3cc4edfc 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", + "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", "lodash.startcase": "^4.4.0", "lodash.zip": "^4.2.0", From d89a62e0a62accf3fe9366781a129d8f9a76eb6a Mon Sep 17 00:00:00 2001 From: tincho Date: Fri, 23 Sep 2022 11:48:39 +0200 Subject: [PATCH 023/197] Improve `ERC20FlashMint` documentation (#3719) Co-authored-by: Hadrien Croubois (cherry picked from commit aa4b9017882a9ef221648d0768dcf2a8436d869c) --- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index b95341bdb..9ef7c36ae 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -29,9 +29,9 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { } /** - * @dev Returns the fee applied when doing flash loans. By default this - * implementation has 0 fees. This function can be overloaded to make - * the flash loan mechanism deflationary. + * @dev Returns the fee applied when doing flash loans. This function calls + * the {_flashFee} function which returns the fee applied when doing flash + * loans. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. @@ -42,7 +42,9 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { } /** - * @dev Returns the fee applied when doing flash loans. This function calls the {flashFee} function which returns the fee applied when doing flash loans. + * @dev Returns the fee applied when doing flash loans. By default this + * implementation has 0 fees. This function can be overloaded to make + * the flash loan mechanism deflationary. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. From 76273ecd8e35ceaa50412618f3c7cd8e3f85cbee Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 23 Sep 2022 16:58:56 +0200 Subject: [PATCH 024/197] Change admin role allocation in TimelockControler constructor (#3722) Co-authored-by: Francisco (cherry picked from commit 408055dfabbe5ee7ebf8808ba6105d34f85e4940) --- CHANGELOG.md | 3 ++ contracts/governance/README.adoc | 2 +- contracts/governance/TimelockController.sol | 30 +++++++++++-------- test/governance/TimelockController.test.js | 19 ++++++++++-- .../GovernorTimelockControl.test.js | 9 ++++-- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67dbef02c..3f1870f82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 4.8.0 + * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) * `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) * `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) @@ -37,6 +38,8 @@ * `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. + * `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. + ### Deprecations * `EIP712`: Added the file `EIP712.sol` and deprecated `draft-EIP712.sol` since the EIP is no longer a Draft. Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3621)) diff --git a/contracts/governance/README.adoc b/contracts/governance/README.adoc index e34f0eae1..f711c63cf 100644 --- a/contracts/governance/README.adoc +++ b/contracts/governance/README.adoc @@ -153,7 +153,7 @@ Operations status can be queried using the functions: [[timelock-admin]] ===== Admin -The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, both the timelock and the deployer have this role. After further configuration and testing, the deployer can renounce this role such that all further maintenance operations have to go through the timelock process. +The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, the admin role can be granted to any address (in addition to the timelock itself). After further configuration and testing, this optional admin should renounce its role such that all further maintenance operations have to go through the timelock process. This role is identified by the *TIMELOCK_ADMIN_ROLE* value: `0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5` diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index 91fcbfcda..d5b18ace6 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -62,31 +62,37 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver event MinDelayChange(uint256 oldDuration, uint256 newDuration); /** - * @dev Initializes the contract with a given `minDelay`, and a list of - * initial proposers and executors. The proposers receive both the - * proposer and the canceller role (for backward compatibility). The - * executors receive the executor role. + * @dev Initializes the contract with the following parameters: * - * NOTE: At construction, both the deployer and the timelock itself are - * administrators. This helps further configuration of the timelock by the - * deployer. After configuration is done, it is recommended that the - * deployer renounces its admin position and relies on timelocked - * operations to perform future maintenance. + * - `minDelay`: initial minimum delay for operations + * - `proposers`: accounts to be granted proposer and canceller roles + * - `executors`: accounts to be granted executor role + * - `admin`: optional account to be granted admin role; disable with zero address + * + * IMPORTANT: The optional admin can aid with initial configuration of roles after deployment + * without being subject to delay, but this role should be subsequently renounced in favor of + * administration through timelocked proposals. Previous versions of this contract would assign + * this admin to the deployer automatically and should be renounced as well. */ constructor( uint256 minDelay, address[] memory proposers, - address[] memory executors + address[] memory executors, + address admin ) { _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE); - // deployer + self administration - _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender()); + // self administration _setupRole(TIMELOCK_ADMIN_ROLE, address(this)); + // optional admin + if (admin != address(0)) { + _setupRole(TIMELOCK_ADMIN_ROLE, admin); + } + // register proposers and cancellers for (uint256 i = 0; i < proposers.length; ++i) { _setupRole(PROPOSER_ROLE, proposers[i]); diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index 2274bb0a4..e0a32440e 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -1,5 +1,5 @@ const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); -const { ZERO_BYTES32 } = constants; +const { ZERO_ADDRESS, ZERO_BYTES32 } = constants; const { expect } = require('chai'); @@ -52,7 +52,7 @@ function genOperationBatch (targets, values, payloads, predecessor, salt) { } contract('TimelockController', function (accounts) { - const [ admin, proposer, canceller, executor, other ] = accounts; + const [ , admin, proposer, canceller, executor, other ] = accounts; const TIMELOCK_ADMIN_ROLE = web3.utils.soliditySha3('TIMELOCK_ADMIN_ROLE'); const PROPOSER_ROLE = web3.utils.soliditySha3('PROPOSER_ROLE'); @@ -65,7 +65,7 @@ contract('TimelockController', function (accounts) { MINDELAY, [ proposer ], [ executor ], - { from: admin }, + admin, ); expect(await this.mock.hasRole(CANCELLER_ROLE, proposer)).to.be.equal(true); @@ -102,6 +102,19 @@ contract('TimelockController', function (accounts) { ))).to.be.deep.equal([ false, false, true ]); }); + it('optional admin', async function () { + const mock = await TimelockController.new( + MINDELAY, + [ proposer ], + [ executor ], + ZERO_ADDRESS, + { from: other }, + ); + + expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, admin)).to.be.equal(false); + expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, other)).to.be.equal(false); + }); + describe('methods', function () { describe('operation hashing', function () { it('hashOperation', async function () { diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 45e26c935..d06f79992 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -33,7 +33,7 @@ contract('GovernorTimelockControl', function (accounts) { const [ deployer ] = await web3.eth.getAccounts(); this.token = await Token.new(tokenName, tokenSymbol); - this.timelock = await Timelock.new(3600, [], []); + this.timelock = await Timelock.new(3600, [], [], deployer); this.mock = await Governor.new( name, this.token.address, @@ -322,7 +322,12 @@ contract('GovernorTimelockControl', function (accounts) { describe('updateTimelock', function () { beforeEach(async function () { - this.newTimelock = await Timelock.new(3600, [], []); + this.newTimelock = await Timelock.new( + 3600, + [ this.mock.address ], + [ this.mock.address ], + constants.ZERO_ADDRESS, + ); }); it('is protected', async function () { From 16791134c10d3f9c576400a8202072a91cf14f65 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 23 Sep 2022 18:59:29 +0200 Subject: [PATCH 025/197] 4.8.0-rc.1 --- contracts/access/AccessControl.sol | 2 +- contracts/access/Ownable2Step.sol | 2 +- contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL2.sol | 2 +- contracts/finance/PaymentSplitter.sol | 2 +- contracts/finance/VestingWallet.sol | 2 +- contracts/governance/Governor.sol | 2 +- contracts/governance/IGovernor.sol | 2 +- contracts/governance/TimelockController.sol | 2 +- .../governance/compatibility/GovernorCompatibilityBravo.sol | 2 +- contracts/governance/extensions/GovernorCountingSimple.sol | 2 +- .../governance/extensions/GovernorVotesQuorumFraction.sol | 2 +- contracts/governance/utils/Votes.sol | 2 +- contracts/interfaces/IERC2309.sol | 2 +- contracts/interfaces/IERC4626.sol | 2 +- contracts/metatx/MinimalForwarder.sol | 2 +- contracts/package.json | 2 +- contracts/proxy/Clones.sol | 2 +- contracts/proxy/utils/Initializable.sol | 2 +- contracts/proxy/utils/UUPSUpgradeable.sol | 2 +- contracts/security/PullPayment.sol | 2 +- contracts/security/ReentrancyGuard.sol | 2 +- contracts/token/ERC1155/ERC1155.sol | 2 +- contracts/token/ERC1155/extensions/ERC1155Burnable.sol | 2 +- contracts/token/ERC20/ERC20.sol | 2 +- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 2 +- contracts/token/ERC20/extensions/ERC20Votes.sol | 2 +- contracts/token/ERC20/extensions/ERC4626.sol | 2 +- contracts/token/ERC20/extensions/draft-ERC20Permit.sol | 2 +- contracts/token/ERC721/ERC721.sol | 2 +- contracts/token/ERC721/IERC721.sol | 2 +- contracts/token/ERC721/extensions/ERC721Burnable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Consecutive.sol | 2 +- contracts/token/ERC721/extensions/ERC721Enumerable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Pausable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Votes.sol | 1 + contracts/token/ERC721/extensions/draft-ERC721Votes.sol | 1 + .../token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol | 2 +- contracts/token/ERC777/IERC777.sol | 2 +- contracts/utils/Address.sol | 2 +- contracts/utils/Arrays.sol | 2 +- contracts/utils/Checkpoints.sol | 2 +- contracts/utils/Create2.sol | 2 +- contracts/utils/Strings.sol | 2 +- contracts/utils/cryptography/ECDSA.sol | 2 +- contracts/utils/cryptography/EIP712.sol | 2 +- contracts/utils/cryptography/SignatureChecker.sol | 2 +- contracts/utils/cryptography/draft-EIP712.sol | 2 +- contracts/utils/introspection/ERC165Checker.sol | 2 +- contracts/utils/introspection/IERC1820Registry.sol | 2 +- contracts/utils/math/Math.sol | 2 +- contracts/utils/math/SafeCast.sol | 2 +- contracts/utils/math/SignedMath.sol | 2 +- contracts/utils/structs/BitMaps.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 2 +- contracts/utils/structs/EnumerableSet.sol | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 58 files changed, 59 insertions(+), 57 deletions(-) diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index bbf462ef8..afae5c519 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (access/AccessControl.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (access/AccessControl.sol) pragma solidity ^0.8.0; diff --git a/contracts/access/Ownable2Step.sol b/contracts/access/Ownable2Step.sol index ec6d96b51..a2dc8f0e3 100644 --- a/contracts/access/Ownable2Step.sol +++ b/contracts/access/Ownable2Step.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (access/Ownable2Step.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (access/Ownable2Step.sol) pragma solidity ^0.8.0; diff --git a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol index 7fba6bc75..5977cbd92 100644 --- a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL2.sol b/contracts/crosschain/arbitrum/LibArbitrumL2.sol index 021a8c2a3..fd80a3357 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (crosschain/arbitrum/LibArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (crosschain/arbitrum/LibArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/finance/PaymentSplitter.sol b/contracts/finance/PaymentSplitter.sol index 712d7befc..4cada18c1 100644 --- a/contracts/finance/PaymentSplitter.sol +++ b/contracts/finance/PaymentSplitter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (finance/PaymentSplitter.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol index 310d98082..324a38b4b 100644 --- a/contracts/finance/VestingWallet.sol +++ b/contracts/finance/VestingWallet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (finance/VestingWallet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (finance/VestingWallet.sol) pragma solidity ^0.8.0; import "../token/ERC20/utils/SafeERC20.sol"; diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 851c0ac5f..7b35424fb 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/Governor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/Governor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index 93fdda856..efef23957 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/IGovernor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/IGovernor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index d5b18ace6..f86aef155 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/TimelockController.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 43f493400..71dd06a8f 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/compatibility/GovernorCompatibilityBravo.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/compatibility/GovernorCompatibilityBravo.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/governance/extensions/GovernorCountingSimple.sol index 05f838ed6..220c276a0 100644 --- a/contracts/governance/extensions/GovernorCountingSimple.sol +++ b/contracts/governance/extensions/GovernorCountingSimple.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/extensions/GovernorCountingSimple.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/extensions/GovernorCountingSimple.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol index 175bb08fd..3e041520c 100644 --- a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/extensions/GovernorVotesQuorumFraction.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/extensions/GovernorVotesQuorumFraction.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 92087ab7f..631563996 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (governance/utils/Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/utils/Votes.sol) pragma solidity ^0.8.0; import "../../utils/Context.sol"; diff --git a/contracts/interfaces/IERC2309.sol b/contracts/interfaces/IERC2309.sol index 831eafba5..576dd5e19 100644 --- a/contracts/interfaces/IERC2309.sol +++ b/contracts/interfaces/IERC2309.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (interfaces/IERC2309.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (interfaces/IERC2309.sol) pragma solidity ^0.8.0; diff --git a/contracts/interfaces/IERC4626.sol b/contracts/interfaces/IERC4626.sol index a62dcb6eb..923f97c75 100644 --- a/contracts/interfaces/IERC4626.sol +++ b/contracts/interfaces/IERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (interfaces/IERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (interfaces/IERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index 34ca2922d..ebc7b6054 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (metatx/MinimalForwarder.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (metatx/MinimalForwarder.sol) pragma solidity ^0.8.0; diff --git a/contracts/package.json b/contracts/package.json index 1c4cf4f96..58eda2bcc 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@openzeppelin/contracts", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.0", + "version": "4.8.0-rc.1", "files": [ "**/*.sol", "/build/contracts/*.json", diff --git a/contracts/proxy/Clones.sol b/contracts/proxy/Clones.sol index e7dcd5f2f..0c31679a1 100644 --- a/contracts/proxy/Clones.sol +++ b/contracts/proxy/Clones.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/Clones.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/Clones.sol) pragma solidity ^0.8.0; diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 8147d678f..01794bc3e 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/utils/Initializable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index 548851ed0..2a7c42659 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (proxy/utils/UUPSUpgradeable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/PullPayment.sol b/contracts/security/PullPayment.sol index e66cc76de..d45ffb044 100644 --- a/contracts/security/PullPayment.sol +++ b/contracts/security/PullPayment.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (security/PullPayment.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (security/PullPayment.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index f2cd6321c..3197d90ed 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (security/ReentrancyGuard.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index 5059ae55d..d3b11cafa 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC1155/ERC1155.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol index 5d80714ec..d96c3c0c2 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC1155/extensions/ERC1155Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index 1b537f60e..648180d8e 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/ERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index 9ef7c36ae..b8a1c7b62 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC20FlashMint.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC20FlashMint.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 2dfe61085..6dac80d5a 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC20Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 30a1542ce..8e14f776a 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/ERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol index f7a859db9..41ff7273b 100644 --- a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC20/extensions/draft-ERC20Permit.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 63042c64f..2974d4fd0 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/ERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 4534f4412..3eb1dee9f 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/IERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Burnable.sol b/contracts/token/ERC721/extensions/ERC721Burnable.sol index a5cf48d3c..6b640ed66 100644 --- a/contracts/token/ERC721/extensions/ERC721Burnable.sol +++ b/contracts/token/ERC721/extensions/ERC721Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index b21558f8c..9b325b4c3 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Consecutive.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Consecutive.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 760f643f6..54aaffbc8 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Enumerable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 100b34907..d5b27625b 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/extensions/ERC721Pausable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index ddcb15607..494fcae51 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index ea9227ab0..1dae9403f 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,4 +1,5 @@ // SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 1a3736409..35ee6c2d6 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/IERC777.sol b/contracts/token/ERC777/IERC777.sol index f9b5c45aa..c888a4f10 100644 --- a/contracts/token/ERC777/IERC777.sol +++ b/contracts/token/ERC777/IERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (token/ERC777/IERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC777/IERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 1fe4d19a7..2c62434b8 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Address.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Address.sol) pragma solidity ^0.8.1; diff --git a/contracts/utils/Arrays.sol b/contracts/utils/Arrays.sol index 4f9d4afde..d57080798 100644 --- a/contracts/utils/Arrays.sol +++ b/contracts/utils/Arrays.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Arrays.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Arrays.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 768197f50..7fa8745c8 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Checkpoints.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Checkpoints.sol) // This file was procedurally generated from scripts/generate/templates/Checkpoints.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 341b70ee7..460b05c8f 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Create2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Create2.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index fd7270127..d7baccf24 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/Strings.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Strings.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index 0d4e80b4e..eacb91f92 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/ECDSA.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index ff2da5325..3260966f4 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 9fd8b87b1..7bc4f2c43 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/SignatureChecker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/draft-EIP712.sol b/contracts/utils/cryptography/draft-EIP712.sol index 4488bd967..8f2779681 100644 --- a/contracts/utils/cryptography/draft-EIP712.sol +++ b/contracts/utils/cryptography/draft-EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/cryptography/draft-EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index 43f006245..37c3664b9 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/introspection/ERC165Checker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/IERC1820Registry.sol b/contracts/utils/introspection/IERC1820Registry.sol index 41fd27eb1..a3cd31da1 100644 --- a/contracts/utils/introspection/IERC1820Registry.sol +++ b/contracts/utils/introspection/IERC1820Registry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/introspection/IERC1820Registry.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/introspection/IERC1820Registry.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index 349da9f3b..d19ed55d1 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/Math.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/Math.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SafeCast.sol b/contracts/utils/math/SafeCast.sol index 38fd60802..770c040ac 100644 --- a/contracts/utils/math/SafeCast.sol +++ b/contracts/utils/math/SafeCast.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/SafeCast.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SignedMath.sol b/contracts/utils/math/SignedMath.sol index 6aedc1853..2b84adde8 100644 --- a/contracts/utils/math/SignedMath.sol +++ b/contracts/utils/math/SignedMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/math/SignedMath.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/BitMaps.sol b/contracts/utils/structs/BitMaps.sol index fd93bae62..5749dcc9f 100644 --- a/contracts/utils/structs/BitMaps.sol +++ b/contracts/utils/structs/BitMaps.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/BitMaps.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index f53b5c79f..962e96979 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/EnumerableMap.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/EnumerableMap.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableMap.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/EnumerableSet.sol b/contracts/utils/structs/EnumerableSet.sol index 00815a03a..e2e89497c 100644 --- a/contracts/utils/structs/EnumerableSet.sol +++ b/contracts/utils/structs/EnumerableSet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.0) (utils/structs/EnumerableSet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; diff --git a/package-lock.json b/package-lock.json index d465941c7..5e313e24c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.0", + "version": "4.8.0-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.0", + "version": "4.8.0-rc.1", "license": "MIT", "bin": { "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" diff --git a/package.json b/package.json index e3cc4edfc..48926d9ff 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "openzeppelin-solidity", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.0", + "version": "4.8.0-rc.1", "files": [ "/contracts/**/*.sol", "/build/contracts/*.json", From c08c6e1b84159714b97c1dd0707727431e62805c Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 23 Sep 2022 18:45:20 -0300 Subject: [PATCH 026/197] Add fuzz testing of mulDiv (#3717) Co-authored-by: Hadrien Croubois --- foundry.toml | 2 + package.json | 4 +- test/utils/math/Math.t.sol | 105 +++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 foundry.toml diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 000000000..1076ef55b --- /dev/null +++ b/foundry.toml @@ -0,0 +1,2 @@ +[fuzz] +runs = 10000 diff --git a/package.json b/package.json index 249d96078..84c978e9a 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix", "lint:js": "eslint --ignore-path .gitignore .", "lint:js:fix": "eslint --ignore-path .gitignore . --fix", - "lint:sol": "solhint 'contracts/**/*.sol' && prettier -c 'contracts/**/*.sol'", - "lint:sol:fix": "prettier --write \"contracts/**/*.sol\"", + "lint:sol": "solhint '{contracts,test}/**/*.sol' && prettier -c '{contracts,test}/**/*.sol'", + "lint:sol:fix": "prettier --write '{contracts,test}/**/*.sol'", "clean": "hardhat clean && rimraf build contracts/build", "prepare": "scripts/prepare.sh", "prepack": "scripts/prepack.sh", diff --git a/test/utils/math/Math.t.sol b/test/utils/math/Math.t.sol index c72cc88ee..fa682149f 100644 --- a/test/utils/math/Math.t.sol +++ b/test/utils/math/Math.t.sol @@ -8,6 +8,22 @@ import "../../../contracts/utils/math/Math.sol"; import "../../../contracts/utils/math/SafeMath.sol"; contract MathTest is Test { + // CEILDIV + function testCeilDiv(uint256 a, uint256 b) public { + vm.assume(b > 0); + + uint256 result = Math.ceilDiv(a, b); + + if (result == 0) { + assertEq(a, 0); + } else { + uint256 maxdiv = UINT256_MAX / b; + bool overflow = maxdiv * b < a; + assertTrue(a > b * (result - 1)); + assertTrue(overflow ? result == maxdiv + 1 : a <= b * result); + } + } + // SQRT function testSqrt(uint256 input, uint8 r) public { Math.Rounding rounding = _asRounding(r); @@ -120,9 +136,98 @@ contract MathTest is Test { return 256**value < ref; } + // MULDIV + function testMulDiv( + uint256 x, + uint256 y, + uint256 d + ) public { + // Full precision for x * y + (uint256 xyHi, uint256 xyLo) = _mulHighLow(x, y); + + // Assume result won't overflow (see {testMulDivDomain}) + // This also checks that `d` is positive + vm.assume(xyHi < d); + + // Perform muldiv + uint256 q = Math.mulDiv(x, y, d); + + // Full precision for q * d + (uint256 qdHi, uint256 qdLo) = _mulHighLow(q, d); + // Add reminder of x * y / d (computed as rem = (x * y % d)) + (uint256 qdRemLo, uint256 c) = _addCarry(qdLo, _mulmod(x, y, d)); + uint256 qdRemHi = qdHi + c; + + // Full precision check that x * y = q * d + rem + assertEq(xyHi, qdRemHi); + assertEq(xyLo, qdRemLo); + } + + function testMulDivDomain( + uint256 x, + uint256 y, + uint256 d + ) public { + (uint256 xyHi, ) = _mulHighLow(x, y); + + // Violate {testMulDiv} assumption (covers d is 0 and result overflow) + vm.assume(xyHi >= d); + + // we are outside the scope of {testMulDiv}, we expect muldiv to revert + try this.muldiv(x, y, d) returns (uint256) { + fail(); + } catch {} + } + + // External call + function muldiv( + uint256 x, + uint256 y, + uint256 d + ) external pure returns (uint256) { + return Math.mulDiv(x, y, d); + } + // Helpers function _asRounding(uint8 r) private returns (Math.Rounding) { vm.assume(r < uint8(type(Math.Rounding).max)); return Math.Rounding(r); } + + function _mulmod( + uint256 x, + uint256 y, + uint256 z + ) private pure returns (uint256 r) { + assembly { + r := mulmod(x, y, z) + } + } + + function _mulHighLow(uint256 x, uint256 y) private pure returns (uint256 high, uint256 low) { + (uint256 x0, uint256 x1) = (x & type(uint128).max, x >> 128); + (uint256 y0, uint256 y1) = (y & type(uint128).max, y >> 128); + + // Karatsuba algorithm + // https://en.wikipedia.org/wiki/Karatsuba_algorithm + uint256 z2 = x1 * y1; + uint256 z1a = x1 * y0; + uint256 z1b = x0 * y1; + uint256 z0 = x0 * y0; + + uint256 carry = ((z1a & type(uint128).max) + (z1b & type(uint128).max) + (z0 >> 128)) >> 128; + + high = z2 + (z1a >> 128) + (z1b >> 128) + carry; + + unchecked { + low = x * y; + } + } + + function _addCarry(uint256 x, uint256 y) private pure returns (uint256 res, uint256 carry) { + unchecked { + res = x + y; + } + carry = res < x ? 1 : 0; + } } From e2362ce74fbf2c6b8a01d6c11bdf1576c1737b64 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 23 Sep 2022 19:06:20 -0300 Subject: [PATCH 027/197] Add documentation about the security of overrides (#3725) --- docs/modules/ROOT/pages/extending-contracts.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index 7d25ae9e4..022dfc957 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -129,3 +129,8 @@ contract MyToken is ERC20 { ``` That's it! Enjoy simpler code using hooks! +== Security + +The maintainers of OpenZeppelin Contracts are mainly concerned with the correctness and security of the code as published in the library, and the combinations of base contracts with the official extensions from the library. + +Custom overrides, and those of hooks in particular, may break some important assumptions and introduce vulnerabilities in otherwise secure code. While we try to ensure the contracts remain secure in the face of a wide range of potential customizations, this is done in a best-effort manner. Similarly, while we try to document all important assumptions, this should not be relied upon. Custom overrides should be carefully reviewed and checked against the source code of the contract they are customizing so as to fully understand their impact and guarantee their security. From 561d0eead30d3977847f2c2b4ae54eac31c218df Mon Sep 17 00:00:00 2001 From: tincho Date: Sat, 24 Sep 2022 00:23:32 +0200 Subject: [PATCH 028/197] Add comments to `unsafeAccess` functions of `Arrays` library (#3718) --- contracts/utils/Arrays.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/utils/Arrays.sol b/contracts/utils/Arrays.sol index a0c967e17..1684b62e7 100644 --- a/contracts/utils/Arrays.sol +++ b/contracts/utils/Arrays.sol @@ -56,6 +56,9 @@ library Arrays { */ function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) { bytes32 slot; + // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` + // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. + /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) @@ -71,6 +74,9 @@ library Arrays { */ function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) { bytes32 slot; + // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` + // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. + /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) @@ -86,6 +92,9 @@ library Arrays { */ function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) { bytes32 slot; + // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` + // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. + /// @solidity memory-safe-assembly assembly { mstore(0, arr.slot) From 5e8e8bb9f0c6c5e1a8d3a38bcedd7861906f692b Mon Sep 17 00:00:00 2001 From: Tadashi Date: Sun, 25 Sep 2022 00:58:09 +0200 Subject: [PATCH 029/197] Fixes broken link (#3728) --- contracts/utils/Address.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 69f3bf87a..600f019b3 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -50,7 +50,7 @@ library Address { * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using From ed12acfb0a575c2a3160d28b0aeaf1f19cbfadba Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 26 Sep 2022 20:27:33 +0200 Subject: [PATCH 030/197] Add support for EOA target in Governor.relay (#3730) --- CHANGELOG.md | 1 + contracts/governance/Governor.sol | 5 +-- .../GovernorTimelockControl.test.js | 33 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6932b4d88..eace4471c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) * `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) * `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469)) + * `Governor`: make the `relay` function payable, and add support for EOA payments. ([#3730](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3730)) * `GovernorCompatibilityBravo`: remove unused `using` statements. ([#3506](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3506)) * `ERC20`: optimize `_transfer`, `_mint` and `_burn` by using `unchecked` arithmetic when possible. ([#3513](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3513)) * `ERC20Votes`, `ERC721Votes`: optimize `getPastVotes` for looking up recent checkpoints. ([#3673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3673)) diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 5083165b1..101138821 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -544,8 +544,9 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive address target, uint256 value, bytes calldata data - ) external virtual onlyGovernance { - Address.functionCallWithValue(target, data, value); + ) external payable virtual onlyGovernance { + (bool success, bytes memory returndata) = target.call{value: value}(data); + Address.verifyCallResult(success, returndata, "Governor: relay reverted without message"); } /** diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index d06f79992..56d3b225c 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -293,6 +293,39 @@ contract('GovernorTimelockControl', function (accounts) { ); }); + it('is payable and can transfer eth to EOA', async function () { + const t2g = web3.utils.toBN(128); // timelock to governor + const g2o = web3.utils.toBN(100); // governor to eoa (other) + + this.helper.setProposal([ + { + target: this.mock.address, + value: t2g, + data: this.mock.contract.methods.relay( + other, + g2o, + '0x', + ).encodeABI(), + }, + ], ''); + + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); + const timelockBalance = await web3.eth.getBalance(this.timelock.address).then(web3.utils.toBN); + const otherBalance = await web3.eth.getBalance(other).then(web3.utils.toBN); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + + expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal(timelockBalance.sub(t2g)); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(t2g.sub(g2o)); + expect(await web3.eth.getBalance(other)).to.be.bignumber.equal(otherBalance.add(g2o)); + }); + it('protected against other proposers', async function () { await this.timelock.schedule( this.mock.address, From ec88e9d6aac25bd6641b2f2849a0b72d75676cfe Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 26 Sep 2022 20:27:33 +0200 Subject: [PATCH 031/197] Add support for EOA target in Governor.relay (#3730) (cherry picked from commit ed12acfb0a575c2a3160d28b0aeaf1f19cbfadba) --- CHANGELOG.md | 1 + contracts/governance/Governor.sol | 5 +-- .../GovernorTimelockControl.test.js | 33 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f1870f82..bb527f06e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) * `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) * `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469)) + * `Governor`: make the `relay` function payable, and add support for EOA payments. ([#3730](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3730)) * `GovernorCompatibilityBravo`: remove unused `using` statements. ([#3506](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3506)) * `ERC20`: optimize `_transfer`, `_mint` and `_burn` by using `unchecked` arithmetic when possible. ([#3513](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3513)) * `ERC20Votes`, `ERC721Votes`: optimize `getPastVotes` for looking up recent checkpoints. ([#3673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3673)) diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 7b35424fb..3fcf21b93 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -544,8 +544,9 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive address target, uint256 value, bytes calldata data - ) external virtual onlyGovernance { - Address.functionCallWithValue(target, data, value); + ) external payable virtual onlyGovernance { + (bool success, bytes memory returndata) = target.call{value: value}(data); + Address.verifyCallResult(success, returndata, "Governor: relay reverted without message"); } /** diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index d06f79992..56d3b225c 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -293,6 +293,39 @@ contract('GovernorTimelockControl', function (accounts) { ); }); + it('is payable and can transfer eth to EOA', async function () { + const t2g = web3.utils.toBN(128); // timelock to governor + const g2o = web3.utils.toBN(100); // governor to eoa (other) + + this.helper.setProposal([ + { + target: this.mock.address, + value: t2g, + data: this.mock.contract.methods.relay( + other, + g2o, + '0x', + ).encodeABI(), + }, + ], ''); + + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); + const timelockBalance = await web3.eth.getBalance(this.timelock.address).then(web3.utils.toBN); + const otherBalance = await web3.eth.getBalance(other).then(web3.utils.toBN); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + + expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal(timelockBalance.sub(t2g)); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(t2g.sub(g2o)); + expect(await web3.eth.getBalance(other)).to.be.bignumber.equal(otherBalance.add(g2o)); + }); + it('protected against other proposers', async function () { await this.timelock.schedule( this.mock.address, From 72bbe63ec75fbf5aed164bc67a3a2f65de64f375 Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Tue, 27 Sep 2022 16:23:23 +0800 Subject: [PATCH 032/197] Fix incorrect issue number in CHANGELOG (#3732) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eace4471c..cf1833bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -208,8 +208,8 @@ It is no longer possible to call an `initializer`-protected function from within * `ECDSA`: add a variant of `toEthSignedMessageHash` for arbitrary length message hashing. ([#2865](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2865)) * `MerkleProof`: add a `processProof` function that returns the rebuilt root hash given a leaf and a proof. ([#2841](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2841)) * `VestingWallet`: new contract that handles the vesting of Ether and ERC20 tokens following a customizable vesting schedule. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2748)) - * `Governor`: enable receiving Ether when a Timelock contract is not used. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) - * `GovernorTimelockCompound`: fix ability to use Ether stored in the Timelock contract. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) + * `Governor`: enable receiving Ether when a Timelock contract is not used. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) + * `GovernorTimelockCompound`: fix ability to use Ether stored in the Timelock contract. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) ## 4.3.3 From fb9345814b5a0e8cfc7ccb6210855d47e0e65e57 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 27 Sep 2022 09:26:17 +0100 Subject: [PATCH 033/197] Remove unnecessary `Address` library import in `SignatureChecker` (#3731) --- contracts/utils/cryptography/SignatureChecker.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 42b222a0f..a6ec35044 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import "./ECDSA.sol"; -import "../Address.sol"; import "../../interfaces/IERC1271.sol"; /** From 2a45f99fc4338c8d81e8c22a43ff2ee1a9bef2a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:08:57 -0300 Subject: [PATCH 034/197] Bump yargs-parser from 2.4.1 to 20.2.4 (#3726) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 125 ++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index b606151df..546e55ef0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2454,9 +2454,9 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", - "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.2.tgz", + "integrity": "sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA==", "dev": true, "dependencies": { "change-case": "3.0.2", @@ -2495,13 +2495,13 @@ "dev": true }, "node_modules/@truffle/codec": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", - "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.5.tgz", + "integrity": "sha512-3FCpTJe6o7LGWUfrSdguMpdpH1PTn3u7bIfbj6Cfdzym2OAVSgxTgdlqC1poepbk0xcOVcUW+EsqNwLMqmBiPA==", "dev": true, "dependencies": { - "@truffle/abi-utils": "^0.3.1", - "@truffle/compile-common": "^0.8.0", + "@truffle/abi-utils": "^0.3.2", + "@truffle/compile-common": "^0.8.1", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -2537,9 +2537,9 @@ } }, "node_modules/@truffle/compile-common": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", - "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.1.tgz", + "integrity": "sha512-7mzzG9Cfrn+fDT5Sqi7B6pccvIIV5w/GM8/56YgnjysbDzy5aZ6mv0fe37ZbcznEVQ35NJjBy+lEr/ozOGXwQA==", "dev": true, "dependencies": { "@truffle/error": "^0.1.1", @@ -2547,17 +2547,17 @@ } }, "node_modules/@truffle/contract": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", - "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.2.tgz", + "integrity": "sha512-OZZIDmKtHgZS2Q6sCczNe8OfTuMWpRaAo3vwY49LGGs0VXLiwc7nIcCFh+bMg14IRK6vBN4pWE9W9eWSBFy31Q==", "dev": true, "dependencies": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", - "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.34", + "@truffle/contract-schema": "^3.4.10", + "@truffle/debug-utils": "^6.0.35", "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", + "@truffle/interface-adapter": "^0.5.22", "bignumber.js": "^7.2.1", "debug": "^4.3.1", "ethers": "^4.0.32", @@ -2569,9 +2569,9 @@ } }, "node_modules/@truffle/contract-schema": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", - "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.10.tgz", + "integrity": "sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ==", "dev": true, "dependencies": { "ajv": "^6.10.0", @@ -3129,12 +3129,12 @@ "dev": true }, "node_modules/@truffle/debug-utils": { - "version": "6.0.34", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", - "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", + "version": "6.0.35", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.35.tgz", + "integrity": "sha512-GuLsc+GFEYiUM683GWh4/ol3jkBts5a601detVWu1Xo5/bSL5gxooOjgOTovjA8dimCjkyi/DnK2yHHC+q+g0g==", "dev": true, "dependencies": { - "@truffle/codec": "^0.14.4", + "@truffle/codec": "^0.14.5", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -3226,9 +3226,9 @@ "dev": true }, "node_modules/@truffle/interface-adapter": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.21.tgz", - "integrity": "sha512-2ltbu3upsWS0TAQu1kLQc048XlXNmDkCzH6iebX4dg3VBB+l7oG/pu5+/kl8t+LRfzGoEMLKwOQt7vk0Vm3PNA==", + "version": "0.5.22", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.22.tgz", + "integrity": "sha512-Bgl5Afb1mPVNedI8CJzZQzVIdrZWSXISTBrXPZmppD4Q+6V1RUzlLxiaGGB4gYHOA+U0pBzD8MCcSycPAD9RsA==", "dev": true, "dependencies": { "bn.js": "^5.1.3", @@ -12406,6 +12406,15 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -20832,9 +20841,9 @@ } }, "@truffle/abi-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", - "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.2.tgz", + "integrity": "sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA==", "dev": true, "requires": { "change-case": "3.0.2", @@ -20872,13 +20881,13 @@ "dev": true }, "@truffle/codec": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", - "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.5.tgz", + "integrity": "sha512-3FCpTJe6o7LGWUfrSdguMpdpH1PTn3u7bIfbj6Cfdzym2OAVSgxTgdlqC1poepbk0xcOVcUW+EsqNwLMqmBiPA==", "dev": true, "requires": { - "@truffle/abi-utils": "^0.3.1", - "@truffle/compile-common": "^0.8.0", + "@truffle/abi-utils": "^0.3.2", + "@truffle/compile-common": "^0.8.1", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -20913,9 +20922,9 @@ } }, "@truffle/compile-common": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", - "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.1.tgz", + "integrity": "sha512-7mzzG9Cfrn+fDT5Sqi7B6pccvIIV5w/GM8/56YgnjysbDzy5aZ6mv0fe37ZbcznEVQ35NJjBy+lEr/ozOGXwQA==", "dev": true, "requires": { "@truffle/error": "^0.1.1", @@ -20923,17 +20932,17 @@ } }, "@truffle/contract": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", - "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.2.tgz", + "integrity": "sha512-OZZIDmKtHgZS2Q6sCczNe8OfTuMWpRaAo3vwY49LGGs0VXLiwc7nIcCFh+bMg14IRK6vBN4pWE9W9eWSBFy31Q==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.4", - "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.34", + "@truffle/contract-schema": "^3.4.10", + "@truffle/debug-utils": "^6.0.35", "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", + "@truffle/interface-adapter": "^0.5.22", "bignumber.js": "^7.2.1", "debug": "^4.3.1", "ethers": "^4.0.32", @@ -21396,9 +21405,9 @@ } }, "@truffle/contract-schema": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", - "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.10.tgz", + "integrity": "sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ==", "dev": true, "requires": { "ajv": "^6.10.0", @@ -21406,12 +21415,12 @@ } }, "@truffle/debug-utils": { - "version": "6.0.34", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", - "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", + "version": "6.0.35", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.35.tgz", + "integrity": "sha512-GuLsc+GFEYiUM683GWh4/ol3jkBts5a601detVWu1Xo5/bSL5gxooOjgOTovjA8dimCjkyi/DnK2yHHC+q+g0g==", "dev": true, "requires": { - "@truffle/codec": "^0.14.4", + "@truffle/codec": "^0.14.5", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -21490,9 +21499,9 @@ "dev": true }, "@truffle/interface-adapter": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.21.tgz", - "integrity": "sha512-2ltbu3upsWS0TAQu1kLQc048XlXNmDkCzH6iebX4dg3VBB+l7oG/pu5+/kl8t+LRfzGoEMLKwOQt7vk0Vm3PNA==", + "version": "0.5.22", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.22.tgz", + "integrity": "sha512-Bgl5Afb1mPVNedI8CJzZQzVIdrZWSXISTBrXPZmppD4Q+6V1RUzlLxiaGGB4gYHOA+U0pBzD8MCcSycPAD9RsA==", "dev": true, "requires": { "bn.js": "^5.1.3", @@ -28827,6 +28836,14 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } } } } From c22db8104e0eb4609c0f84a0546b2919dc6c0cb3 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 27 Sep 2022 21:13:15 +0200 Subject: [PATCH 035/197] Recommended improvement to ERC721Consecutive (#3712) Co-authored-by: Francisco Giordano --- contracts/token/ERC721/ERC721.sol | 9 ++-- .../ERC721/extensions/ERC721Consecutive.sol | 41 +++++++++++++------ .../extensions/ERC721Consecutive.test.js | 35 +++++++++++++++- 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index a8e5aa4ab..0facc3dbd 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -488,11 +488,9 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { ) internal virtual {} /** - * @dev Hook that is called before consecutive token transfers. + * @dev Hook that is called before "consecutive token transfers" as defined in ERC2309 and implemented in + * {ERC721Consecutive}. * Calling conditions are similar to {_beforeTokenTransfer}. - * - * The default implementation include balances updates that extensions such as {ERC721Consecutive} cannot perform - * directly. */ function _beforeConsecutiveTokenTransfer( address from, @@ -509,7 +507,8 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { } /** - * @dev Hook that is called after consecutive token transfers. + * @dev Hook that is called after "consecutive token transfers" as defined in ERC2309 and implemented in + * {ERC721Consecutive}. * Calling conditions are similar to {_afterTokenTransfer}. */ function _afterConsecutiveTokenTransfer( diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 15ecdd986..42b447fd3 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -5,17 +5,17 @@ pragma solidity ^0.8.0; import "../ERC721.sol"; import "../../../interfaces/IERC2309.sol"; import "../../../utils/Checkpoints.sol"; -import "../../../utils/math/SafeCast.sol"; import "../../../utils/structs/BitMaps.sol"; /** * @dev Implementation of the ERC2309 "Consecutive Transfer Extension" as defined in * https://eips.ethereum.org/EIPS/eip-2309[EIP-2309]. * - * This extension allows the minting of large batches of tokens during the contract construction. These batches are - * limited to 5000 tokens at a time to accommodate off-chain indexers. + * This extension allows the minting of large batches of tokens, during contract construction only. For upgradeable + * contracts this implies that batch minting is only available during proxy deployment, and not in subsequent upgrades. + * These batches are limited to 5000 tokens at a time by default to accommodate off-chain indexers. * - * Using this extension removes the ability to mint single tokens during the contract construction. This ability is + * Using this extension removes the ability to mint single tokens during contract construction. This ability is * regained after construction. During construction, only batch minting is allowed. * * IMPORTANT: This extension bypasses the hooks {_beforeTokenTransfer} and {_afterTokenTransfer} for tokens minted in @@ -35,6 +35,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { Checkpoints.Trace160 private _sequentialOwnership; BitMaps.BitMap private _sequentialBurn; + /** + * @dev Maximum size of a batch of consecutive tokens. This is designed to limit stress on off-chain indexing + * services that have to record one entry per token, and have protections against "unreasonably large" batches of + * tokens. + * + * NOTE: Overriding the default value of 5000 will not cause on-chain issues, but may result in the asset not being + * correctly supported by off-chain indexing services (including marketplaces). + */ + function _maxBatchSize() internal view virtual returns (uint96) { + return 5000; + } + /** * @dev See {ERC721-_ownerOf}. Override that checks the sequential ownership structure for tokens that have * been minted as part of a batch, and not yet transferred. @@ -53,13 +65,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { } /** - * @dev Mint a batch of tokens of length `batchSize` for `to`. + * @dev Mint a batch of tokens of length `batchSize` for `to`. Returns the token id of the first token minted in the + * batch; if `batchSize` is 0, returns the number of consecutive ids minted so far. * - * WARNING: Consecutive mint is only available during construction. ERC721 requires that any minting done after - * construction emits a `Transfer` event, which is not the case of mints performed using this function. + * Requirements: * - * WARNING: Consecutive mint is limited to batches of 5000 tokens. Further minting is possible from a contract's - * point of view but would cause indexing issues for off-chain services. + * - `batchSize` must not be greater than {_maxBatchSize}. + * - The function is called in the constructor of the contract (directly or indirectly). + * + * CAUTION: Does not emit a `Transfer` event. This is ERC721 compliant as long as it is done outside of the + * constructor, which is enforced by this function. + * + * CAUTION: Does not invoke `onERC721Received` on the receiver. * * Emits a {ConsecutiveTransfer} event. */ @@ -70,7 +87,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { if (batchSize > 0) { require(!Address.isContract(address(this)), "ERC721Consecutive: batch minting restricted to constructor"); require(to != address(0), "ERC721Consecutive: mint to the zero address"); - require(batchSize <= 5000, "ERC721Consecutive: batch too large"); + require(batchSize <= _maxBatchSize(), "ERC721Consecutive: batch too large"); // hook before _beforeConsecutiveTokenTransfer(address(0), to, first, batchSize); @@ -99,7 +116,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { } /** - * @dev See {ERC721-_afterTokenTransfer}. Burning of token that have been sequentially minted must be explicit. + * @dev See {ERC721-_afterTokenTransfer}. Burning of tokens that have been sequentially minted must be explicit. */ function _afterTokenTransfer( address from, @@ -108,7 +125,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { ) internal virtual override { if ( to == address(0) && // if we burn - tokenId <= _totalConsecutiveSupply() && // and the tokenId was minted is a batch + tokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch !_sequentialBurn.get(tokenId) // and the token was never marked as burnt ) { _sequentialBurn.set(tokenId); diff --git a/test/token/ERC721/extensions/ERC721Consecutive.test.js b/test/token/ERC721/extensions/ERC721Consecutive.test.js index de3af0a07..5e480abb8 100644 --- a/test/token/ERC721/extensions/ERC721Consecutive.test.js +++ b/test/token/ERC721/extensions/ERC721Consecutive.test.js @@ -122,7 +122,7 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.ownerOf(1)).to.be.equal(receiver); }); - it('tokens can be burned and re-minted', async function () { + it('tokens can be burned and re-minted #1', async function () { expectEvent( await this.token.burn(1, { from: user1 }), 'Transfer', @@ -139,6 +139,39 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.ownerOf(1)).to.be.equal(user2); }); + + it('tokens can be burned and re-minted #2', async function () { + const tokenId = batches.reduce((acc, { amount }) => acc.addn(amount), web3.utils.toBN(0)); + + expect(await this.token.exists(tokenId)).to.be.equal(false); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); + + // mint + await this.token.mint(user1, tokenId); + + expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.ownerOf(tokenId), user1); + + // burn + expectEvent( + await this.token.burn(tokenId, { from: user1 }), + 'Transfer', + { from: user1, to: constants.ZERO_ADDRESS, tokenId }, + ); + + expect(await this.token.exists(tokenId)).to.be.equal(false); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); + + // re-mint + expectEvent( + await this.token.mint(user2, tokenId), + 'Transfer', + { from: constants.ZERO_ADDRESS, to: user2, tokenId }, + ); + + expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.ownerOf(tokenId), user2); + }); }); }); From 9938a85558e43bcadefe411d8e85e4a471de6a32 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 28 Sep 2022 19:46:48 +0200 Subject: [PATCH 036/197] Update Arbitrum's vendored contracts to Nitro (#3692) Co-authored-by: Francisco --- CHANGELOG.md | 1 + .../crosschain/arbitrum/LibArbitrumL1.sol | 1 - contracts/vendor/arbitrum/IArbSys.sol | 123 ++++++++---- contracts/vendor/arbitrum/IBridge.sol | 114 +++++++---- .../arbitrum/IDelayedMessageProvider.sol | 15 ++ contracts/vendor/arbitrum/IInbox.sol | 183 ++++++++++++------ .../vendor/arbitrum/IMessageProvider.sol | 26 --- contracts/vendor/arbitrum/IOutbox.sol | 129 +++++++++--- 8 files changed, 396 insertions(+), 196 deletions(-) create mode 100644 contracts/vendor/arbitrum/IDelayedMessageProvider.sol delete mode 100644 contracts/vendor/arbitrum/IMessageProvider.sol diff --git a/CHANGELOG.md b/CHANGELOG.md index cf1833bf6..2b8f0e56d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ * `Ownable2Step`: extension of `Ownable` that makes the ownership transfers a two step process. ([#3620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3620)) * `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679)) * `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670)) + * Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692)) ### Breaking changes diff --git a/contracts/crosschain/arbitrum/LibArbitrumL1.sol b/contracts/crosschain/arbitrum/LibArbitrumL1.sol index 6b591cac4..8947f906d 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL1.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL1.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.4; import {IBridge as ArbitrumL1_Bridge} from "../../vendor/arbitrum/IBridge.sol"; -import {IInbox as ArbitrumL1_Inbox} from "../../vendor/arbitrum/IInbox.sol"; import {IOutbox as ArbitrumL1_Outbox} from "../../vendor/arbitrum/IOutbox.sol"; import "../errors.sol"; diff --git a/contracts/vendor/arbitrum/IArbSys.sol b/contracts/vendor/arbitrum/IArbSys.sol index 15a10451a..eb02432d2 100644 --- a/contracts/vendor/arbitrum/IArbSys.sol +++ b/contracts/vendor/arbitrum/IArbSys.sol @@ -1,19 +1,15 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IArbSys.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + pragma solidity >=0.4.21 <0.9.0; /** - * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality. + * @title System level functionality + * @notice For use by contracts to interact with core L2-specific functionality. + * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. */ interface IArbSys { - /** - * @notice Get internal version number identifying an ArbOS build - * @return version number as int - */ - function arbOSVersion() external pure returns (uint256); - - function arbChainID() external view returns (uint256); - /** * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0) * @return block number as int @@ -21,43 +17,44 @@ interface IArbSys { function arbBlockNumber() external view returns (uint256); /** - * @notice Send given amount of Eth to dest from sender. - * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1. - * @param destination recipient address on L1 - * @return unique identifier for this L2-to-L1 transaction. + * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum) + * @return block hash */ - function withdrawEth(address destination) external payable returns (uint256); + function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32); /** - * @notice Send a transaction to L1 - * @param destination recipient address on L1 - * @param calldataForL1 (optional) calldata for L1 contract call - * @return a unique identifier for this L2-to-L1 transaction. + * @notice Gets the rollup's unique chain identifier + * @return Chain identifier as int */ - function sendTxToL1(address destination, bytes calldata calldataForL1) external payable returns (uint256); + function arbChainID() external view returns (uint256); /** - * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract - * @param account target account - * @return the number of transactions issued by the given external account or the account sequence number of the given contract + * @notice Get internal version number identifying an ArbOS build + * @return version number as int */ - function getTransactionCount(address account) external view returns (uint256); + function arbOSVersion() external view returns (uint256); /** - * @notice get the value of target L2 storage slot - * This function is only callable from address 0 to prevent contracts from being able to call it - * @param account target account - * @param index target index of storage slot - * @return stotage value for the given account at the given index + * @notice Returns 0 since Nitro has no concept of storage gas + * @return uint 0 */ - function getStorageAt(address account, uint256 index) external view returns (uint256); + function getStorageGasAvailable() external view returns (uint256); /** - * @notice check if current call is coming from l1 - * @return true if the caller of this was called directly from L1 + * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract) + * @dev this call has been deprecated and may be removed in a future release + * @return true if current execution frame is not a call by another L2 contract */ function isTopLevelCall() external view returns (bool); + /** + * @notice map L1 sender contract address to its L2 alias + * @param sender sender address + * @param unused argument no longer used + * @return aliased sender address + */ + function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address); + /** * @notice check if the caller (of this caller of this) is an aliased L1 contract address * @return true iff the caller's address is an alias for an L1 contract address @@ -71,19 +68,55 @@ interface IArbSys { function myCallersAddressWithoutAliasing() external view returns (address); /** - * @notice map L1 sender contract address to its L2 alias - * @param sender sender address - * @param dest destination address - * @return aliased sender address + * @notice Send given amount of Eth to dest from sender. + * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data. + * @param destination recipient address on L1 + * @return unique identifier for this L2-to-L1 transaction. */ - function mapL1SenderContractAddressToL2Alias(address sender, address dest) external pure returns (address); + function withdrawEth(address destination) external payable returns (uint256); /** - * @notice get the caller's amount of available storage gas - * @return amount of storage gas available to the caller + * @notice Send a transaction to L1 + * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data + * to a contract address without any code (as enforced by the Bridge contract). + * @param destination recipient address on L1 + * @param data (optional) calldata for L1 contract call + * @return a unique identifier for this L2-to-L1 transaction. */ - function getStorageGasAvailable() external view returns (uint256); + function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256); + /** + * @notice Get send Merkle tree state + * @return size number of sends in the history + * @return root root hash of the send history + * @return partials hashes of partial subtrees in the send history tree + */ + function sendMerkleTreeState() + external + view + returns ( + uint256 size, + bytes32 root, + bytes32[] memory partials + ); + + /** + * @notice creates a send txn from L2 to L1 + * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf + */ + event L2ToL1Tx( + address caller, + address indexed destination, + uint256 indexed hash, + uint256 indexed position, + uint256 arbBlockNum, + uint256 ethBlockNum, + uint256 timestamp, + uint256 callvalue, + bytes data + ); + + /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade event L2ToL1Transaction( address caller, address indexed destination, @@ -96,4 +129,12 @@ interface IArbSys { uint256 callvalue, bytes data ); + + /** + * @notice logs a merkle branch for proof synthesis + * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event + * @param hash the merkle hash + * @param position = (level << 192) + leaf + */ + event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position); } diff --git a/contracts/vendor/arbitrum/IBridge.sol b/contracts/vendor/arbitrum/IBridge.sol index 88d5013b1..7982fb95b 100644 --- a/contracts/vendor/arbitrum/IBridge.sol +++ b/contracts/vendor/arbitrum/IBridge.sol @@ -1,23 +1,9 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IBridge.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; interface IBridge { event MessageDelivered( @@ -26,41 +12,97 @@ interface IBridge { address inbox, uint8 kind, address sender, - bytes32 messageDataHash + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp ); - event BridgeCallTriggered(address indexed outbox, address indexed destAddr, uint256 amount, bytes data); + event BridgeCallTriggered(address indexed outbox, address indexed to, uint256 value, bytes data); event InboxToggle(address indexed inbox, bool enabled); event OutboxToggle(address indexed outbox, bool enabled); - function deliverMessageToInbox( + event SequencerInboxUpdated(address newSequencerInbox); + + function allowedDelayedInboxList(uint256) external returns (address); + + function allowedOutboxList(uint256) external returns (address); + + /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function delayedInboxAccs(uint256) external view returns (bytes32); + + /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function sequencerInboxAccs(uint256) external view returns (bytes32); + + // OpenZeppelin: changed return type from IOwnable + function rollup() external view returns (address); + + function sequencerInbox() external view returns (address); + + function activeOutbox() external view returns (address); + + function allowedDelayedInboxes(address inbox) external view returns (bool); + + function allowedOutboxes(address outbox) external view returns (bool); + + function sequencerReportedSubMessageCount() external view returns (uint256); + + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256); function executeCall( - address destAddr, - uint256 amount, + address to, + uint256 value, bytes calldata data ) external returns (bool success, bytes memory returnData); - // These are only callable by the admin - function setInbox(address inbox, bool enabled) external; + function delayedMessageCount() external view returns (uint256); + + function sequencerMessageCount() external view returns (uint256); + + // ---------- onlySequencerInbox functions ---------- + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ); + + /** + * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type + * This is done through a separate function entrypoint instead of allowing the sequencer inbox + * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either + * every delayed inbox or every sequencer inbox call. + */ + function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) external returns (uint256 msgNum); + + // ---------- onlyRollupOrOwner functions ---------- + + function setSequencerInbox(address _sequencerInbox) external; + + function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; - // View functions + // ---------- initializer ---------- - function activeOutbox() external view returns (address); - - function allowedInboxes(address inbox) external view returns (bool); - - function allowedOutboxes(address outbox) external view returns (bool); - - function inboxAccs(uint256 index) external view returns (bytes32); - - function messageCount() external view returns (uint256); + // OpenZeppelin: changed rollup_ type from IOwnable + function initialize(address rollup_) external; } diff --git a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol new file mode 100644 index 000000000..9e650c872 --- /dev/null +++ b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol @@ -0,0 +1,15 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +interface IDelayedMessageProvider { + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + /// same as InboxMessageDelivered but the batch data is available in tx.input + event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); +} diff --git a/contracts/vendor/arbitrum/IInbox.sol b/contracts/vendor/arbitrum/IInbox.sol index 75f93ed86..4396dc18f 100644 --- a/contracts/vendor/arbitrum/IInbox.sol +++ b/contracts/vendor/arbitrum/IInbox.sol @@ -1,92 +1,151 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IInbox.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; -pragma solidity ^0.8.0; +import "./IBridge.sol"; +import "./IDelayedMessageProvider.sol"; -import "./IMessageProvider.sol"; +interface IInbox is IDelayedMessageProvider { + function bridge() external view returns (IBridge); -interface IInbox is IMessageProvider { + // OpenZeppelin: changed return type from ISequencerInbox + function sequencerInbox() external view returns (address); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input + * @param messageData Data of the message being sent + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method can be used to send any type of message that doesn't require L1 validation + * @param messageData Data of the message being sent + */ function sendL2Message(bytes calldata messageData) external returns (uint256); - function sendUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, - uint256 nonce, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - - function sendContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - function sendL1FundedUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, + uint256 gasLimit, + uint256 maxFeePerGas, uint256 nonce, - address destAddr, + address to, bytes calldata data ) external payable returns (uint256); function sendL1FundedContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, + uint256 gasLimit, + uint256 maxFeePerGas, + address to, bytes calldata data ) external payable returns (uint256); + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Get the L1 fee for submitting a retryable + * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value + * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! + * @param dataLength The length of the retryable's calldata, in bytes + * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used + */ + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) external view returns (uint256); + + /** + * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositEth() external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all msg.value will deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ function createRetryableTicket( - address destAddr, - uint256 arbTxCallValue, + address to, + uint256 l2CallValue, uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); - function createRetryableTicketNoRefundAliasRewrite( - address destAddr, - uint256 arbTxCallValue, + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); - function depositEth(uint256 maxSubmissionCost) external payable returns (uint256); + // ---------- onlyRollupOrOwner functions ---------- - function bridge() external view returns (address); + /// @notice pauses all inbox functionality + function pause() external; - function pauseCreateRetryables() external; + /// @notice unpauses all inbox functionality + function unpause() external; - function unpauseCreateRetryables() external; + // ---------- initializer ---------- - function startRewriteAddress() external; + /** + * @dev function to be called one time during the inbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit(IBridge _bridge) external; - function stopRewriteAddress() external; + // OpenZeppelin: changed _sequencerInbox type from ISequencerInbox + function initialize(IBridge _bridge, address _sequencerInbox) external; } diff --git a/contracts/vendor/arbitrum/IMessageProvider.sol b/contracts/vendor/arbitrum/IMessageProvider.sol deleted file mode 100644 index 88d9ba4fc..000000000 --- a/contracts/vendor/arbitrum/IMessageProvider.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IMessageProvider.sol) - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -interface IMessageProvider { - event InboxMessageDelivered(uint256 indexed messageNum, bytes data); - - event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); -} diff --git a/contracts/vendor/arbitrum/IOutbox.sol b/contracts/vendor/arbitrum/IOutbox.sol index 95c10800b..13dd5719d 100644 --- a/contracts/vendor/arbitrum/IOutbox.sol +++ b/contracts/vendor/arbitrum/IOutbox.sol @@ -1,51 +1,120 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IOutbox.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; -pragma solidity ^0.8.0; +import "./IBridge.sol"; interface IOutbox { - event OutboxEntryCreated( - uint256 indexed batchNum, - uint256 outboxEntryIndex, - bytes32 outputRoot, - uint256 numInBatch - ); + event SendRootUpdated(bytes32 indexed blockHash, bytes32 indexed outputRoot); event OutBoxTransactionExecuted( - address indexed destAddr, + address indexed to, address indexed l2Sender, - uint256 indexed outboxEntryIndex, + uint256 indexed zero, uint256 transactionIndex ); + function rollup() external view returns (address); // the rollup contract + + function bridge() external view returns (IBridge); // the bridge contract + + function spent(uint256) external view returns (bytes32); // packed spent bitmap + + function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash + + // solhint-disable-next-line func-name-mixedcase + function OUTBOX_VERSION() external view returns (uint128); // the outbox version + + function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external; + + /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account + /// When the return value is zero, that means this is a system message + /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies function l2ToL1Sender() external view returns (address); + /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1Block() external view returns (uint256); + /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1EthBlock() external view returns (uint256); + /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1Timestamp() external view returns (uint256); - function l2ToL1BatchNum() external view returns (uint256); - + /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active function l2ToL1OutputId() external view returns (bytes32); - function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths) external; + /** + * @notice Executes a messages in an Outbox entry. + * @dev Reverts if dispute period hasn't expired, since the outbox entry + * is only created once the rollup confirms the respective assertion. + * @dev it is not possible to execute any L2-to-L1 transaction which contains data + * to a contract address without any code (as enforced by the Bridge contract). + * @param proof Merkle proof of message inclusion in send root + * @param index Merkle path to message + * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1) + * @param to destination address for L1 contract call + * @param l2Block l2 block number at which sendTxToL1 call was made + * @param l1Block l1 block number at which sendTxToL1 call was made + * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made + * @param value wei in L1 message + * @param data abi-encoded L1 message data + */ + function executeTransaction( + bytes32[] calldata proof, + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external; - function outboxEntryExists(uint256 batchNum) external view returns (bool); + /** + * @dev function used to simulate the result of a particular function call from the outbox + * it is useful for things such as gas estimates. This function includes all costs except for + * proof validation (which can be considered offchain as a somewhat of a fixed cost - it's + * not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation). + * We can't include the cost of proof validation since this is intended to be used to simulate txs + * that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend + * to confirm a pending merkle root, but that would be less practical for integrating with tooling. + * It is only possible to trigger it when the msg sender is address zero, which should be impossible + * unless under simulation in an eth_call or eth_estimateGas + */ + function executeTransactionSimulation( + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external; + + /** + * @param index Merkle path to message + * @return true if the message has been spent + */ + function isSpent(uint256 index) external view returns (bool); + + function calculateItemHash( + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external pure returns (bytes32); + + function calculateMerkleRoot( + bytes32[] memory proof, + uint256 path, + bytes32 item + ) external pure returns (bytes32); } From 14f98dbb581a5365ce3f0c50bd850e499c554f72 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 28 Sep 2022 15:42:55 -0300 Subject: [PATCH 037/197] Improve handling and docs for ERC4626.decimals (#3733) --- contracts/token/ERC20/extensions/ERC4626.sol | 33 ++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 3adb63d84..41ec9d685 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -33,18 +33,33 @@ abstract contract ERC4626 is ERC20, IERC4626 { * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC20 or ERC777). */ constructor(IERC20 asset_) { - uint8 decimals_; - try IERC20Metadata(address(asset_)).decimals() returns (uint8 value) { - decimals_ = value; - } catch { - decimals_ = super.decimals(); - } - + (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_); + _decimals = success ? assetDecimals : super.decimals(); _asset = asset_; - _decimals = decimals_; } - /** @dev See {IERC20Metadata-decimals}. */ + /** + * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way. + */ + function _tryGetAssetDecimals(IERC20 asset_) private returns (bool, uint8) { + (bool success, bytes memory encodedDecimals) = address(asset_).call( + abi.encodeWithSelector(IERC20Metadata.decimals.selector) + ); + if (success && encodedDecimals.length >= 32) { + uint256 returnedDecimals = abi.decode(encodedDecimals, (uint256)); + if (returnedDecimals <= type(uint8).max) { + return (true, uint8(returnedDecimals)); + } + } + return (false, 0); + } + + /** + * @dev Decimals are read from the underlying asset in the constructor and cached. If this fails (e.g., the asset + * has not been created yet), the cached value is set to a default obtained by `super.decimals()` (which depends on + * inheritance but is most likely 18). Override this function in order to set a guaranteed hardcoded value. + * See {IERC20Metadata-decimals}. + */ function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) { return _decimals; } From 26dddee1c05ff91264ae24c5c172bd05827cf5d8 Mon Sep 17 00:00:00 2001 From: Samuel Moelius <35515885+smoelius@users.noreply.github.com> Date: Wed, 28 Sep 2022 18:05:54 -0400 Subject: [PATCH 038/197] Fix typo (#3738) --- .../governance/compatibility/GovernorCompatibilityBravo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index f54c62c66..031d49b11 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -12,7 +12,7 @@ import "./IGovernorCompatibilityBravo.sol"; * @dev Compatibility layer that implements GovernorBravo compatibility on to of {Governor}. * * This compatibility layer includes a voting system and requires a {IGovernorTimelock} compatible module to be added - * through inheritance. It does not include token bindings, not does it include any variable upgrade patterns. + * through inheritance. It does not include token bindings, nor does it include any variable upgrade patterns. * * NOTE: When using this module, you may need to enable the Solidity optimizer to avoid hitting the contract size limit. * From c52625018b2afb7bd015cf7f3be20753123b437b Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 30 Sep 2022 12:52:45 -0300 Subject: [PATCH 039/197] Update docs pipeline to solidity-docgen@0.6 (#3707) --- contracts/governance/utils/Votes.sol | 2 +- .../token/ERC20/extensions/ERC20FlashMint.sol | 2 +- .../token/ERC20/extensions/ERC20Votes.sol | 4 +- contracts/token/ERC20/utils/SafeERC20.sol | 2 +- .../ERC721/extensions/ERC721Consecutive.sol | 2 +- .../token/ERC721/extensions/ERC721Royalty.sol | 4 +- .../token/ERC721/extensions/ERC721Votes.sol | 4 +- contracts/token/ERC777/ERC777.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 4 +- docs/config.js | 21 + docs/contract.hbs | 91 - docs/helpers.js | 10 - docs/prelude.hbs | 6 - docs/templates/contract.hbs | 85 + docs/templates/helpers.js | 46 + docs/templates/page.hbs | 4 + docs/templates/properties.js | 49 + hardhat.config.js | 3 + package-lock.json | 6260 +---------------- package.json | 9 +- scripts/gen-nav.js | 6 +- scripts/generate/templates/EnumerableMap.js | 4 +- scripts/prepare-docs-solc.js | 16 - scripts/prepare-docs.sh | 12 +- 24 files changed, 610 insertions(+), 6038 deletions(-) create mode 100644 docs/config.js delete mode 100644 docs/contract.hbs delete mode 100644 docs/helpers.js delete mode 100644 docs/prelude.hbs create mode 100644 docs/templates/contract.hbs create mode 100644 docs/templates/helpers.js create mode 100644 docs/templates/page.hbs create mode 100644 docs/templates/properties.js delete mode 100644 scripts/prepare-docs-solc.js diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 053bfa9e8..f763589c6 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -122,7 +122,7 @@ abstract contract Votes is IVotes, Context, EIP712 { /** * @dev Delegate all of `account`'s voting units to `delegatee`. * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. + * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. */ function _delegate(address account, address delegatee) internal virtual { address oldDelegate = delegates(account); diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index 697a97246..a4efbacaf 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -73,7 +73,7 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { * amount + fee tokens and have them approved back to the token contract itself so * they can be burned. * @param receiver The receiver of the flash loan. Should implement the - * {IERC3156FlashBorrower.onFlashLoan} interface. + * {IERC3156FlashBorrower-onFlashLoan} interface. * @param token The token to be flash loaned. Only `address(this)` is * supported. * @param amount The amount of tokens to be loaned. diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 3446d5534..da16cbada 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -191,7 +191,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { /** * @dev Move voting power when tokens are transferred. * - * Emits a {DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, @@ -206,7 +206,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { /** * @dev Change delegation for `delegator` to `delegatee`. * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. + * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index 37d25f58a..f7f3653dc 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -104,7 +104,7 @@ library SafeERC20 { */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 42b447fd3..34abf18c8 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -78,7 +78,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { * * CAUTION: Does not invoke `onERC721Received` on the receiver. * - * Emits a {ConsecutiveTransfer} event. + * Emits a {IERC2309-ConsecutiveTransfer} event. */ function _mintConsecutive(address to, uint96 batchSize) internal virtual returns (uint96) { uint96 first = _totalConsecutiveSupply(); diff --git a/contracts/token/ERC721/extensions/ERC721Royalty.sol b/contracts/token/ERC721/extensions/ERC721Royalty.sol index f9414da05..9addb9c5b 100644 --- a/contracts/token/ERC721/extensions/ERC721Royalty.sol +++ b/contracts/token/ERC721/extensions/ERC721Royalty.sol @@ -11,8 +11,8 @@ import "../../../utils/introspection/ERC165.sol"; * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * - * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for - * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. + * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for + * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index ddcb15607..d19a3173d 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -19,7 +19,7 @@ abstract contract ERC721Votes is ERC721, Votes { /** * @dev Adjusts votes when tokens are transferred. * - * Emits a {Votes-DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, @@ -33,7 +33,7 @@ abstract contract ERC721Votes is ERC721, Votes { /** * @dev Adjusts votes when a batch of tokens is transferred. * - * Emits a {Votes-DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterConsecutiveTokenTransfer( address from, diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index a46100437..96f2ae4c5 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -508,7 +508,7 @@ contract ERC777 is Context, IERC777, IERC20 { * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * - * Might emit an {Approval} event. + * Might emit an {IERC20-Approval} event. */ function _spendAllowance( address owner, diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index 16a963a68..ae1a2682f 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -145,10 +145,10 @@ library EnumerableMap { } /** - * @dev Same as {_get}, with a custom error message when `key` is not in the map. + * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {_tryGet}. + * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( Bytes32ToBytes32Map storage map, diff --git a/docs/config.js b/docs/config.js new file mode 100644 index 000000000..f0af66390 --- /dev/null +++ b/docs/config.js @@ -0,0 +1,21 @@ +const path = require('path'); +const fs = require('fs'); + +/** @type import('solidity-docgen/dist/config').UserConfig */ +module.exports = { + outputDir: 'docs/modules/api/pages', + templates: 'docs/templates', + exclude: ['mocks'], + pageExtension: '.adoc', + pages: (_, file, config) => { + // For each contract file, find the closest README.adoc and return its location as the output page path. + const sourcesDir = path.resolve(config.root, config.sourcesDir); + let dir = path.resolve(config.root, file.absolutePath); + while (dir.startsWith(sourcesDir)) { + dir = path.dirname(dir); + if (fs.existsSync(path.join(dir, 'README.adoc'))) { + return path.relative(sourcesDir, dir) + config.pageExtension; + } + } + }, +}; diff --git a/docs/contract.hbs b/docs/contract.hbs deleted file mode 100644 index 8690cf8a2..000000000 --- a/docs/contract.hbs +++ /dev/null @@ -1,91 +0,0 @@ -{{~#*inline "typed-variable-array"~}} -{{#each .}}{{typeName}}{{#if name}} {{name}}{{/if}}{{#unless @last}}, {{/unless}}{{/each}} -{{~/inline~}} - -{{#each linkable}} -:{{name}}: pass:normal[xref:#{{anchor}}[`++{{name}}++`]] -{{/each}} - -[.contract] -[[{{anchor}}]] -=== `++{{name}}++` link:{{github-link file.path}}[{github-icon},role=heading-link] - -[.hljs-theme-light.nopadding] -```solidity -import "@openzeppelin/contracts/{{file.path}}"; -``` - -{{natspec.devdoc}} - -{{#if ownModifiers}} -[.contract-index] -.Modifiers --- -{{#each ownModifiers}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} --- -{{/if}} - -{{#if functions}} -[.contract-index] -.Functions --- -{{#each inheritedItems}} -{{#if (or @first (ne contract.name "Context"))}} -{{#unless @first}} -[.contract-subindex-inherited] -.{{contract.name}} -{{/unless}} -{{#each functions}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} - -{{/if}} -{{/each}} --- -{{/if}} - -{{#if events}} -[.contract-index] -.Events --- -{{#each inheritedItems}} -{{#unless @first}} -[.contract-subindex-inherited] -.{{contract.name}} -{{/unless}} -{{#each events}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} - -{{/each}} --- -{{/if}} - -{{#each ownModifiers}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}})++` [.item-kind]#modifier# - -{{natspec.devdoc}} - -{{/each}} - -{{#each ownFunctions}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}}){{#if outputs}} → {{> typed-variable-array outputs}}{{/if}}++` [.item-kind]#{{visibility}}# - -{{natspec.devdoc}} - -{{/each}} - -{{#each ownEvents}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}})++` [.item-kind]#event# - -{{natspec.devdoc}} - -{{/each}} diff --git a/docs/helpers.js b/docs/helpers.js deleted file mode 100644 index 9b71f44f3..000000000 --- a/docs/helpers.js +++ /dev/null @@ -1,10 +0,0 @@ -const { version } = require('../package.json'); - -module.exports = { - 'github-link': (contractPath) => { - if (typeof contractPath !== 'string') { - throw new Error('Missing argument'); - } - return `https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v${version}/contracts/${contractPath}`; - }, -}; diff --git a/docs/prelude.hbs b/docs/prelude.hbs deleted file mode 100644 index f531d72f0..000000000 --- a/docs/prelude.hbs +++ /dev/null @@ -1,6 +0,0 @@ -:github-icon: pass:[] - -{{#links}} -:{{slug target.fullName}}: pass:normal[xref:{{path}}#{{target.anchor}}[`{{target.fullName}}`]] -:xref-{{slug target.anchor}}: xref:{{path}}#{{target.anchor}} -{{/links}} diff --git a/docs/templates/contract.hbs b/docs/templates/contract.hbs new file mode 100644 index 000000000..d97e7fd0d --- /dev/null +++ b/docs/templates/contract.hbs @@ -0,0 +1,85 @@ +{{#each items}} +:{{name}}: pass:normal[xref:#{{anchor}}[`++{{name}}++`]] +{{/each}} + +[.contract] +[[{{anchor}}]] +=== `++{{name}}++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v{{oz-version}}/{{__item_context.file.absolutePath}}[{github-icon},role=heading-link] + +[.hljs-theme-light.nopadding] +```solidity +import "@openzeppelin/{{__item_context.file.absolutePath}}"; +``` + +{{{natspec.dev}}} + +{{#if modifiers}} +[.contract-index] +.Modifiers +-- +{{#each modifiers}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} +-- +{{/if}} + +{{#if has-functions}} +[.contract-index] +.Functions +-- +{{#each inherited-functions}} +{{#unless @first}} +[.contract-subindex-inherited] +.{{contract.name}} +{{/unless}} +{{#each functions}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} + +{{/each}} +-- +{{/if}} + +{{#if has-events}} +[.contract-index] +.Events +-- +{{#each inheritance}} +{{#unless @first}} +[.contract-subindex-inherited] +.{{name}} +{{/unless}} +{{#each events}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} + +{{/each}} +-- +{{/if}} + +{{#each modifiers}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#modifier# + +{{{natspec.dev}}} + +{{/each}} + +{{#each functions}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}}){{#if returns}} → {{typed-params returns}}{{/if}}++` [.item-kind]#{{visibility}}# + +{{{natspec.dev}}} + +{{/each}} + +{{#each events}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#event# + +{{{natspec.dev}}} + +{{/each}} diff --git a/docs/templates/helpers.js b/docs/templates/helpers.js new file mode 100644 index 000000000..8c94d757c --- /dev/null +++ b/docs/templates/helpers.js @@ -0,0 +1,46 @@ +const { version } = require('../../package.json'); + +module.exports['oz-version'] = () => version; + +module.exports['readme-path'] = (opts) => { + return 'contracts/' + opts.data.root.id.replace(/\.adoc$/, '') + '/README.adoc'; +}; + +module.exports.names = (params) => params.map(p => p.name).join(', '); + +module.exports['typed-params'] = (params) => { + return params.map(p => `${p.type}${p.name ? ' ' + p.name : ''}`).join(', '); +}; + +const slug = module.exports.slug = (str) => { + if (str === undefined) { + throw new Error('Missing argument'); + } + return str.replace(/\W/g, '-'); +}; + +const linksCache = new WeakMap(); + +function getAllLinks (items) { + if (linksCache.has(items)) { + return linksCache.get(items); + } + const res = {}; + linksCache.set(items, res); + for (const item of items) { + res[`xref-${item.anchor}`] = `xref:${item.__item_context.page}#${item.anchor}`; + res[slug(item.fullName)] = `pass:normal[xref:${item.__item_context.page}#${item.anchor}[\`${item.fullName}\`]]`; + } + return res; +} + +module.exports['with-prelude'] = (opts) => { + const links = getAllLinks(opts.data.site.items); + const contents = opts.fn(); + const neededLinks = contents + .match(/\{[-._a-z0-9]+\}/ig) + .map(m => m.replace(/^\{(.+)\}$/, '$1')) + .filter(k => k in links); + const prelude = neededLinks.map(k => `:${k}: ${links[k]}`).join('\n'); + return prelude + '\n' + contents; +}; diff --git a/docs/templates/page.hbs b/docs/templates/page.hbs new file mode 100644 index 000000000..cab050acb --- /dev/null +++ b/docs/templates/page.hbs @@ -0,0 +1,4 @@ +:github-icon: pass:[] +{{#with-prelude}} +{{readme (readme-path)}} +{{/with-prelude}} diff --git a/docs/templates/properties.js b/docs/templates/properties.js new file mode 100644 index 000000000..5dde3a471 --- /dev/null +++ b/docs/templates/properties.js @@ -0,0 +1,49 @@ +const { isNodeType } = require('solidity-ast/utils'); +const { slug } = require('./helpers'); + +module.exports.anchor = function anchor ({ item, contract }) { + let res = ''; + if (contract) { + res += contract.name + '-'; + } + res += item.name; + if ('parameters' in item) { + const signature = item.parameters.parameters.map(v => v.typeName.typeDescriptions.typeString).join(','); + res += slug('(' + signature + ')'); + } + if (isNodeType('VariableDeclaration', item)) { + res += '-' + slug(item.typeName.typeDescriptions.typeString); + } + return res; +}; + +module.exports.inheritance = function ({ item, build }) { + if (!isNodeType('ContractDefinition', item)) { + throw new Error('used inherited-items on non-contract'); + } + + return item.linearizedBaseContracts + .map(id => build.deref('ContractDefinition', id)) + .filter((c, i) => c.name !== 'Context' || i === 0); +}; + +module.exports['has-functions'] = function ({ item }) { + return item.inheritance.some(c => c.functions.length > 0); +}; + +module.exports['has-events'] = function ({ item }) { + return item.inheritance.some(c => c.events.length > 0); +}; + +module.exports['inherited-functions'] = function ({ item }) { + const { inheritance } = item; + const baseFunctions = new Set( + inheritance.flatMap(c => c.functions.flatMap(f => f.baseFunctions ?? [])), + ); + return inheritance.map((contract, i) => ({ + contract, + functions: contract.functions.filter(f => + !baseFunctions.has(f.id) && (f.name !== 'constructor' || i === 0), + ), + })); +}; diff --git a/hardhat.config.js b/hardhat.config.js index fb28b5484..4dbff0e4e 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -52,6 +52,8 @@ const argv = require('yargs/yargs')() require('@nomiclabs/hardhat-truffle5'); require('hardhat-ignore-warnings'); +require('solidity-docgen'); + if (argv.gas) { require('hardhat-gas-reporter'); } @@ -95,6 +97,7 @@ module.exports = { outputFile: argv.gasReport, coinmarketcap: argv.coinmarketcap, }, + docgen: require('./docs/config'), }; if (argv.coverage) { diff --git a/package-lock.json b/package-lock.json index 546e55ef0..f133d1de9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/docs-utils": "^0.1.0", + "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", "eslint": "^7.32.0", @@ -27,6 +27,7 @@ "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", + "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", @@ -43,7 +44,7 @@ "solhint": "^3.3.6", "solidity-ast": "^0.4.25", "solidity-coverage": "^0.8.0", - "solidity-docgen": "^0.5.3", + "solidity-docgen": "^0.6.0-beta.29", "web3": "^1.3.0", "yargs": "^17.0.0" } @@ -1043,6 +1044,16 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@frangio/servbot": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", + "dev": true, + "engines": { + "node": ">=12.x", + "pnpm": "7.5.1" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -1594,614 +1605,6 @@ "web3-utils": "^1.2.1" } }, - "node_modules/@oclif/command": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.16.tgz", - "integrity": "sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==", - "dev": true, - "dependencies": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.5", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.6", - "debug": "^4.1.1", - "semver": "^7.3.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@oclif/config": "^1" - } - }, - "node_modules/@oclif/config": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.3.tgz", - "integrity": "sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.5", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/config/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/@oclif/config/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/config/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/config/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", - "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", - "dev": true, - "dependencies": { - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^3.0.2", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.10.0", - "debug": "^4.3.4", - "ejs": "^3.1.6", - "fs-extra": "^9.1.0", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "semver": "^7.3.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "tslib": "^2.3.1", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oclif/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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/@oclif/core/node_modules/chalk/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": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/core/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/@oclif/core/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/@oclif/core/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/@oclif/core/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/core/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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/@oclif/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/core/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/@oclif/errors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", - "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", - "dev": true, - "dependencies": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/errors/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/errors/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/errors/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": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/errors/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.1.tgz", - "integrity": "sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw==", - "dev": true, - "dependencies": { - "@oclif/config": "1.18.2", - "@oclif/errors": "1.3.5", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/@oclif/config": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz", - "integrity": "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/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/@oclif/help/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/@oclif/help/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/@oclif/help/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/help/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/help/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "node_modules/@oclif/parser": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.7.tgz", - "integrity": "sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.5", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/parser/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/@oclif/parser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/plugin-help": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.1.12.tgz", - "integrity": "sha512-HvH/RubJxqCinP0vUWQLTOboT+SfjfL8h40s+PymkWaldIcXlpoRaJX50vz+SjZIs7uewZwEk8fzLqpF/BWXlg==", - "dev": true, - "dependencies": { - "@oclif/core": "^1.3.6" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@oclif/screen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.2.tgz", - "integrity": "sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@openzeppelin/contract-loader": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", @@ -2227,18 +1630,18 @@ } }, "node_modules/@openzeppelin/docs-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.2.tgz", - "integrity": "sha512-oBchkfFlpqHCee/HaNXPvFy8py9Yi/LTnaE2Vsf+eO4j/FSaupzBsFIgxESjdTScSvJcIOWZFsbZDDRKscg2DQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", "dev": true, "dependencies": { + "@frangio/servbot": "^0.2.5", "chalk": "^3.0.0", - "chokidar": "^3.3.0", + "chokidar": "^3.5.3", "env-paths": "^2.2.0", "find-up": "^4.1.0", "is-port-reachable": "^3.0.0", "js-yaml": "^3.13.1", - "live-server": "^1.2.1", "lodash.startcase": "^4.4.0", "minimist": "^1.2.0" }, @@ -4257,12 +3660,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, "node_modules/antlr4": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", @@ -4288,27 +3685,6 @@ "node": ">= 8" } }, - "node_modules/apache-crypt": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", - "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", - "dev": true, - "dependencies": { - "unix-crypt-td-js": "^1.1.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/apache-md5": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", - "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4318,33 +3694,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -4388,15 +3737,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -4479,15 +3819,6 @@ "node": "*" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ast-parents": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", @@ -4512,12 +3843,6 @@ "lodash": "^4.17.14" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "node_modules/async-eventemitter": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", @@ -4539,27 +3864,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -4593,24 +3897,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -4620,56 +3906,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4690,30 +3926,6 @@ } ] }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "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 - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -4729,12 +3941,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -4802,16 +4008,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -5114,26 +4310,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cacheable-lookup": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", @@ -5259,19 +4435,6 @@ "node": ">=4" } }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -5522,21 +4685,6 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", @@ -5575,68 +4723,6 @@ "node": ">=4" } }, - "node_modules/cli-progress": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", - "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", - "dev": true, - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-progress/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/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/cli-progress/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -5741,19 +4827,6 @@ "node": ">=0.10.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5805,12 +4878,6 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5862,36 +4929,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/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/connect/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/constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", @@ -5955,15 +4992,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6308,18 +5336,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6525,12 +5541,6 @@ "no-case": "^2.2.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -6553,21 +5563,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -8225,21 +7220,6 @@ "npm": ">=3" } }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -8265,39 +7245,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/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/expand-brackets/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/express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -8439,18 +7386,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -8465,75 +7400,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -8608,18 +7474,6 @@ "reusify": "^1.0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -8653,43 +7507,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8702,39 +7519,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/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/finalhandler/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/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -8805,15 +7589,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -8858,18 +7633,6 @@ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -8879,12 +7642,6 @@ "node": ">= 0.6" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -9005,15 +7762,6 @@ "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", @@ -9051,15 +7799,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -9154,20 +7893,19 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9185,6 +7923,27 @@ "node": ">= 6" } }, + "node_modules/glob/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -9267,6 +8026,26 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globby/node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -9582,6 +8361,26 @@ "node": ">=4" } }, + "node_modules/hardhat/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/hardhat/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -9823,75 +8622,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -9992,31 +8722,6 @@ "entities": "^4.3.0" } }, - "node_modules/http-auth": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", - "integrity": "sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==", - "dev": true, - "dependencies": { - "apache-crypt": "^1.1.2", - "apache-md5": "^1.0.6", - "bcryptjs": "^2.3.0", - "uuid": "^3.0.0" - }, - "engines": { - "node": ">=4.6.1" - } - }, - "node_modules/http-auth/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/http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -10069,12 +8774,6 @@ "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -10131,15 +8830,6 @@ "node": ">= 6" } }, - "node_modules/hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10430,36 +9120,6 @@ "node": ">= 0.10" } }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -10569,36 +9229,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -10614,29 +9244,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -10646,30 +9253,6 @@ "node": ">=0.10.0" } }, - "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, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -10785,18 +9368,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-port-reachable": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", @@ -10928,24 +9499,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -10958,61 +9511,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.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/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/jake/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/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -11080,18 +9584,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11296,363 +9788,6 @@ "node": ">= 0.8.0" } }, - "node_modules/live-server": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.2.tgz", - "integrity": "sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==", - "dev": true, - "dependencies": { - "chokidar": "^2.0.4", - "colors": "1.4.0", - "connect": "^3.6.6", - "cors": "latest", - "event-stream": "3.3.4", - "faye-websocket": "0.11.x", - "http-auth": "3.1.x", - "morgan": "^1.9.1", - "object-assign": "latest", - "opn": "latest", - "proxy-middleware": "latest", - "send": "latest", - "serve-index": "^1.9.1" - }, - "bin": { - "live-server": "live-server.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/live-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/live-server/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/live-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/live-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/live-server/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/live-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/live-server/node_modules/safe-buffer": { - "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 - }, - "node_modules/live-server/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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/live-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -11839,33 +9974,6 @@ "yallist": "^3.0.2" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "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", @@ -12108,31 +10216,6 @@ "minipass": "^2.9.0" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -12263,6 +10346,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/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/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/glob/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": "*" + } + }, "node_modules/mocha/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", @@ -12430,37 +10555,6 @@ "node": ">=10" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/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/morgan/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/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12516,13 +10610,6 @@ "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true - }, "node_modules/nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -12547,104 +10634,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -12657,15 +10646,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -12901,38 +10881,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -12951,27 +10899,6 @@ "node": ">= 0.4" } }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -13008,18 +10935,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -13052,27 +10967,6 @@ "http-https": "^1.0.0" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -13094,19 +10988,6 @@ "node": ">=4" } }, - "node_modules/opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "deprecated": "The package has been renamed to `open`", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -13314,101 +11195,6 @@ "upper-case-first": "^1.1.0" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - } - }, - "node_modules/password-prompt/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/password-prompt/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/password-prompt/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/password-prompt/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/password-prompt/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt/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/path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -13418,12 +11204,6 @@ "no-case": "^2.2.0" } }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13487,15 +11267,6 @@ "node": "*" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -13560,15 +11331,6 @@ "node": ">=0.10.0" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13718,15 +11480,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14023,59 +11776,12 @@ "node": "*" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -14105,30 +11811,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/req-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", @@ -14302,13 +11984,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -14343,15 +12018,6 @@ "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -14377,6 +12043,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -14507,15 +12193,6 @@ } ] }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -14760,75 +12437,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/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/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/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/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -14866,21 +12474,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -14996,6 +12589,26 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -15103,143 +12716,6 @@ "no-case": "^2.2.0" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/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/snapdragon/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/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/solc": { "version": "0.4.26", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", @@ -15313,6 +12789,26 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "node_modules/solc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/solc/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", @@ -15722,6 +13218,26 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "node_modules/solhint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/solhint/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -16694,156 +14210,16 @@ } }, "node_modules/solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", + "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", "dev": true, "dependencies": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" + "handlebars": "^4.7.7", + "solidity-ast": "^0.4.31" }, - "bin": { - "solidity-docgen": "dist/cli.js" - } - }, - "node_modules/solidity-docgen/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/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": { - "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/solidity-docgen/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/solidity-docgen/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/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/solidity-docgen/node_modules/solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solidity-docgen/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==", - "dev": true, - "bin": { - "semver": "bin/semver" + "peerDependencies": { + "hardhat": "^2.8.0" } }, "node_modules/source-map": { @@ -16859,20 +14235,6 @@ "node": ">=0.8.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -16892,13 +14254,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -16931,55 +14286,6 @@ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17038,28 +14344,6 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -17069,15 +14353,6 @@ "node": ">=0.10.0" } }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -17204,19 +14479,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -17562,36 +14824,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -17601,21 +14833,6 @@ "node": ">=6" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17628,82 +14845,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -17926,21 +15067,6 @@ "node": ">=12.18" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -17950,12 +15076,6 @@ "node": ">= 4.0.0" } }, - "node_modules/unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -17965,64 +15085,6 @@ "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -18047,13 +15109,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -18072,15 +15127,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", @@ -18604,29 +15650,6 @@ "node": ">=4.0.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/websocket/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -18718,68 +15741,6 @@ "string-width": "^1.0.2 || 2" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/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/widest-line/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -19787,6 +16748,12 @@ "@ethersproject/strings": "^5.7.0" } }, + "@frangio/servbot": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -20171,477 +17138,6 @@ "source-map-support": "^0.5.19" } }, - "@oclif/command": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.16.tgz", - "integrity": "sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==", - "dev": true, - "requires": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.5", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.6", - "debug": "^4.1.1", - "semver": "^7.3.2" - } - }, - "@oclif/config": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.3.tgz", - "integrity": "sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.5", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.3.1" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "@oclif/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", - "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", - "dev": true, - "requires": { - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^3.0.2", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.10.0", - "debug": "^4.3.4", - "ejs": "^3.1.6", - "fs-extra": "^9.1.0", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "semver": "^7.3.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "tslib": "^2.3.1", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "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 - }, - "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, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@oclif/errors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", - "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", - "dev": true, - "requires": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "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, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "@oclif/help": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.1.tgz", - "integrity": "sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw==", - "dev": true, - "requires": { - "@oclif/config": "1.18.2", - "@oclif/errors": "1.3.5", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "@oclif/config": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz", - "integrity": "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "@oclif/parser": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.7.tgz", - "integrity": "sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.5", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "@oclif/plugin-help": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.1.12.tgz", - "integrity": "sha512-HvH/RubJxqCinP0vUWQLTOboT+SfjfL8h40s+PymkWaldIcXlpoRaJX50vz+SjZIs7uewZwEk8fzLqpF/BWXlg==", - "dev": true, - "requires": { - "@oclif/core": "^1.3.6" - } - }, - "@oclif/screen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.2.tgz", - "integrity": "sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ==", - "dev": true - }, "@openzeppelin/contract-loader": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", @@ -20666,18 +17162,18 @@ } }, "@openzeppelin/docs-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.2.tgz", - "integrity": "sha512-oBchkfFlpqHCee/HaNXPvFy8py9Yi/LTnaE2Vsf+eO4j/FSaupzBsFIgxESjdTScSvJcIOWZFsbZDDRKscg2DQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", "dev": true, "requires": { + "@frangio/servbot": "^0.2.5", "chalk": "^3.0.0", - "chokidar": "^3.3.0", + "chokidar": "^3.5.3", "env-paths": "^2.2.0", "find-up": "^4.1.0", "is-port-reachable": "^3.0.0", "js-yaml": "^3.13.1", - "live-server": "^1.2.1", "lodash.startcase": "^4.4.0", "minimist": "^1.2.0" } @@ -22343,12 +18839,6 @@ "color-convert": "^2.0.1" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, "antlr4": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", @@ -22371,21 +18861,6 @@ "picomatch": "^2.0.4" } }, - "apache-crypt": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", - "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", - "dev": true, - "requires": { - "unix-crypt-td-js": "^1.1.4" - } - }, - "apache-md5": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", - "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -22395,24 +18870,6 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -22444,12 +18901,6 @@ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, "array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -22514,12 +18965,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, "ast-parents": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", @@ -22541,12 +18986,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "async-eventemitter": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", @@ -22568,18 +19007,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -22604,61 +19031,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -22674,29 +19046,6 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "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 - } - } - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -22714,12 +19063,6 @@ } } }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -22765,16 +19108,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -23046,23 +19379,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-lookup": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", @@ -23159,16 +19475,6 @@ "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -23373,18 +19679,6 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - } - }, "classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", @@ -23413,55 +19707,6 @@ "restore-cursor": "^2.0.0" } }, - "cli-progress": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", - "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", - "dev": true, - "requires": { - "string-width": "^4.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -23545,16 +19790,6 @@ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -23597,12 +19832,6 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -23653,35 +19882,6 @@ } } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", @@ -23736,12 +19936,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -24010,15 +20204,6 @@ "object-keys": "^1.1.1" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -24176,12 +20361,6 @@ "no-case": "^2.2.0" } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -24204,15 +20383,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -25558,21 +21728,6 @@ "strip-hex-prefix": "1.0.0" } }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -25595,38 +21750,6 @@ "safe-buffer": "^5.1.1" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -25751,15 +21874,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -25771,62 +21885,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -25888,15 +21946,6 @@ "reusify": "^1.0.4" } }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -25923,42 +21972,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -25968,38 +21981,6 @@ "to-regex-range": "^5.0.1" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -26047,12 +22028,6 @@ "is-callable": "^1.1.3" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -26088,27 +22063,12 @@ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -26201,12 +22161,6 @@ "has-symbols": "^1.0.3" } }, - "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 - }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", @@ -26229,12 +22183,6 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -26313,17 +22261,36 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "glob-parent": { @@ -26401,6 +22368,20 @@ "slash": "^3.0.0" }, "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -26614,6 +22595,20 @@ "locate-path": "^2.0.0" } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -26835,64 +22830,6 @@ "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -26977,26 +22914,6 @@ "entities": "^4.3.0" } }, - "http-auth": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", - "integrity": "sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==", - "dev": true, - "requires": { - "apache-crypt": "^1.1.2", - "apache-md5": "^1.0.6", - "bcryptjs": "^2.3.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, "http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -27042,12 +22959,6 @@ "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, "http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -27096,12 +23007,6 @@ "debug": "4" } }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -27320,32 +23225,6 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -27411,32 +23290,6 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -27446,43 +23299,12 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true }, - "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 - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -27561,15 +23383,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-port-reachable": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", @@ -27662,18 +23475,6 @@ "call-bind": "^1.0.2" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -27686,48 +23487,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -27792,12 +23557,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -27946,305 +23705,6 @@ "type-check": "~0.4.0" } }, - "live-server": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.2.tgz", - "integrity": "sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==", - "dev": true, - "requires": { - "chokidar": "^2.0.4", - "colors": "1.4.0", - "connect": "^3.6.6", - "cors": "latest", - "event-stream": "3.3.4", - "faye-websocket": "0.11.x", - "http-auth": "3.1.x", - "morgan": "^1.9.1", - "object-assign": "latest", - "opn": "latest", - "proxy-middleware": "latest", - "send": "latest", - "serve-index": "^1.9.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "safe-buffer": { - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -28402,27 +23862,6 @@ "yallist": "^3.0.2" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -28616,27 +24055,6 @@ "minipass": "^2.9.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -28737,6 +24155,41 @@ "path-exists": "^4.0.0" } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "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", @@ -28860,36 +24313,6 @@ "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28944,13 +24367,6 @@ "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true - }, "nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -28969,85 +24385,6 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -29060,12 +24397,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -29248,34 +24579,6 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -29288,21 +24591,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -29327,15 +24615,6 @@ "es-abstract": "^1.20.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -29362,21 +24641,6 @@ "http-https": "^1.0.0" } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -29395,15 +24659,6 @@ "mimic-fn": "^1.0.0" } }, - "opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -29566,79 +24821,6 @@ "upper-case-first": "^1.1.0" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -29648,12 +24830,6 @@ "no-case": "^2.2.0" } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -29702,15 +24878,6 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -29757,12 +24924,6 @@ "pinkie": "^2.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -29874,12 +25035,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30107,52 +25262,12 @@ } } }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -30170,24 +25285,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, "req-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", @@ -30317,12 +25414,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -30350,12 +25441,6 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -30369,6 +25454,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ripemd160": { @@ -30449,15 +25550,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -30666,68 +25758,6 @@ "randombytes": "^2.1.0" } }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -30759,18 +25789,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -30854,6 +25872,22 @@ "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "side-channel": { @@ -30935,122 +25969,6 @@ "no-case": "^2.2.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "solc": { "version": "0.4.26", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", @@ -31112,6 +26030,20 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "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", @@ -31450,6 +26382,20 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -32153,130 +27099,13 @@ } }, "solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", + "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", "dev": true, "requires": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "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, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "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 - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - } + "handlebars": "^4.7.7", + "solidity-ast": "^0.4.31" } }, "source-map": { @@ -32289,19 +27118,6 @@ "amdefine": ">=0.0.4" } }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -32320,12 +27136,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -32358,45 +27168,6 @@ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -32445,37 +27216,12 @@ } } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, "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 }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -32568,16 +27314,6 @@ "has-flag": "^4.0.0" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -32864,110 +27600,12 @@ "os-tmpdir": "~1.0.2" } }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -33158,82 +27796,18 @@ "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "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 }, - "unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -33258,12 +27832,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -33279,12 +27847,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", @@ -33745,23 +28307,6 @@ } } }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -33823,55 +28368,6 @@ "string-width": "^1.0.2 || 2" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", diff --git a/package.json b/package.json index 84c978e9a..09fadfc70 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "scripts": { "compile": "hardhat compile", "coverage": "env COVERAGE=true hardhat coverage", - "docs": "oz-docs", - "docs:watch": "npm run docs watch contracts 'docs/*.hbs' docs/helpers.js", + "docs": "npm run prepare-docs && oz-docs", + "docs:watch": "oz-docs watch contracts 'docs/templates' docs/config.js", "prepare-docs": "scripts/prepare-docs.sh", "lint": "npm run lint:js && npm run lint:sol", "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix", @@ -56,7 +56,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/docs-utils": "^0.1.0", + "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", "eslint": "^7.32.0", @@ -68,6 +68,7 @@ "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", + "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", @@ -84,7 +85,7 @@ "solhint": "^3.3.6", "solidity-ast": "^0.4.25", "solidity-coverage": "^0.8.0", - "solidity-docgen": "^0.5.3", + "solidity-docgen": "^0.6.0-beta.29", "web3": "^1.3.0", "yargs": "^17.0.0" } diff --git a/scripts/gen-nav.js b/scripts/gen-nav.js index a03fbd696..b39d23e0d 100644 --- a/scripts/gen-nav.js +++ b/scripts/gen-nav.js @@ -1,14 +1,12 @@ #!/usr/bin/env node const path = require('path'); -const proc = require('child_process'); +const glob = require('glob'); const startCase = require('lodash.startcase'); const baseDir = process.argv[2]; -const files = proc.execFileSync( - 'find', [baseDir, '-type', 'f'], { encoding: 'utf8' }, -).split('\n').filter(s => s !== ''); +const files = glob.sync(baseDir + '/**/*.adoc').map(f => path.relative(baseDir, f)); console.log('.API'); diff --git a/scripts/generate/templates/EnumerableMap.js b/scripts/generate/templates/EnumerableMap.js index a628f869e..ca8e0e77d 100644 --- a/scripts/generate/templates/EnumerableMap.js +++ b/scripts/generate/templates/EnumerableMap.js @@ -154,10 +154,10 @@ function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns } /** - * @dev Same as {_get}, with a custom error message when \`key\` is not in the map. + * @dev Same as {get}, with a custom error message when \`key\` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {_tryGet}. + * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( Bytes32ToBytes32Map storage map, diff --git a/scripts/prepare-docs-solc.js b/scripts/prepare-docs-solc.js deleted file mode 100644 index 5c38383a4..000000000 --- a/scripts/prepare-docs-solc.js +++ /dev/null @@ -1,16 +0,0 @@ -const hre = require('hardhat'); - -const { getCompilersDir } = require('hardhat/internal/util/global-dir'); -const { CompilerDownloader } = require('hardhat/internal/solidity/compiler/downloader'); -const { Compiler } = require('hardhat/internal/solidity/compiler'); - -const [{ version }] = hre.config.solidity.compilers; - -async function getSolc () { - const downloader = new CompilerDownloader(await getCompilersDir(), { forceSolcJs: true }); - const { compilerPath } = await downloader.getDownloadedCompilerPath(version); - const compiler = new Compiler(compilerPath); - return compiler.getSolc(); -} - -module.exports = Object.assign(getSolc(), { __esModule: true }); diff --git a/scripts/prepare-docs.sh b/scripts/prepare-docs.sh index 0e5a0605a..53a996b17 100755 --- a/scripts/prepare-docs.sh +++ b/scripts/prepare-docs.sh @@ -2,7 +2,7 @@ set -o errexit -OUTDIR=docs/modules/api/pages/ +OUTDIR="$(node -p 'require("./docs/config.js").outputDir')" if [ ! -d node_modules ]; then npm ci @@ -10,14 +10,6 @@ fi rm -rf "$OUTDIR" -solidity-docgen \ - -t docs \ - -o "$OUTDIR" \ - -e contracts/mocks,contracts/examples \ - --output-structure readmes \ - --helpers ./docs/helpers.js \ - --solc-module ./scripts/prepare-docs-solc.js - -rm -f "$OUTDIR"/token/*/presets.md +hardhat docgen node scripts/gen-nav.js "$OUTDIR" > "$OUTDIR/../nav.adoc" From 0b3acb286a12a887b5008726514d59f8d058b4a2 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 27 Sep 2022 21:13:15 +0200 Subject: [PATCH 040/197] Recommended improvement to ERC721Consecutive (#3712) Co-authored-by: Francisco Giordano (cherry picked from commit c22db8104e0eb4609c0f84a0546b2919dc6c0cb3) --- contracts/token/ERC721/ERC721.sol | 9 ++-- .../ERC721/extensions/ERC721Consecutive.sol | 41 +++++++++++++------ .../extensions/ERC721Consecutive.test.js | 35 +++++++++++++++- 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 2974d4fd0..09a825fbc 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -488,11 +488,9 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { ) internal virtual {} /** - * @dev Hook that is called before consecutive token transfers. + * @dev Hook that is called before "consecutive token transfers" as defined in ERC2309 and implemented in + * {ERC721Consecutive}. * Calling conditions are similar to {_beforeTokenTransfer}. - * - * The default implementation include balances updates that extensions such as {ERC721Consecutive} cannot perform - * directly. */ function _beforeConsecutiveTokenTransfer( address from, @@ -509,7 +507,8 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { } /** - * @dev Hook that is called after consecutive token transfers. + * @dev Hook that is called after "consecutive token transfers" as defined in ERC2309 and implemented in + * {ERC721Consecutive}. * Calling conditions are similar to {_afterTokenTransfer}. */ function _afterConsecutiveTokenTransfer( diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 9b325b4c3..403b23971 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -6,17 +6,17 @@ pragma solidity ^0.8.0; import "../ERC721.sol"; import "../../../interfaces/IERC2309.sol"; import "../../../utils/Checkpoints.sol"; -import "../../../utils/math/SafeCast.sol"; import "../../../utils/structs/BitMaps.sol"; /** * @dev Implementation of the ERC2309 "Consecutive Transfer Extension" as defined in * https://eips.ethereum.org/EIPS/eip-2309[EIP-2309]. * - * This extension allows the minting of large batches of tokens during the contract construction. These batches are - * limited to 5000 tokens at a time to accommodate off-chain indexers. + * This extension allows the minting of large batches of tokens, during contract construction only. For upgradeable + * contracts this implies that batch minting is only available during proxy deployment, and not in subsequent upgrades. + * These batches are limited to 5000 tokens at a time by default to accommodate off-chain indexers. * - * Using this extension removes the ability to mint single tokens during the contract construction. This ability is + * Using this extension removes the ability to mint single tokens during contract construction. This ability is * regained after construction. During construction, only batch minting is allowed. * * IMPORTANT: This extension bypasses the hooks {_beforeTokenTransfer} and {_afterTokenTransfer} for tokens minted in @@ -36,6 +36,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { Checkpoints.Trace160 private _sequentialOwnership; BitMaps.BitMap private _sequentialBurn; + /** + * @dev Maximum size of a batch of consecutive tokens. This is designed to limit stress on off-chain indexing + * services that have to record one entry per token, and have protections against "unreasonably large" batches of + * tokens. + * + * NOTE: Overriding the default value of 5000 will not cause on-chain issues, but may result in the asset not being + * correctly supported by off-chain indexing services (including marketplaces). + */ + function _maxBatchSize() internal view virtual returns (uint96) { + return 5000; + } + /** * @dev See {ERC721-_ownerOf}. Override that checks the sequential ownership structure for tokens that have * been minted as part of a batch, and not yet transferred. @@ -54,13 +66,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { } /** - * @dev Mint a batch of tokens of length `batchSize` for `to`. + * @dev Mint a batch of tokens of length `batchSize` for `to`. Returns the token id of the first token minted in the + * batch; if `batchSize` is 0, returns the number of consecutive ids minted so far. * - * WARNING: Consecutive mint is only available during construction. ERC721 requires that any minting done after - * construction emits a `Transfer` event, which is not the case of mints performed using this function. + * Requirements: * - * WARNING: Consecutive mint is limited to batches of 5000 tokens. Further minting is possible from a contract's - * point of view but would cause indexing issues for off-chain services. + * - `batchSize` must not be greater than {_maxBatchSize}. + * - The function is called in the constructor of the contract (directly or indirectly). + * + * CAUTION: Does not emit a `Transfer` event. This is ERC721 compliant as long as it is done outside of the + * constructor, which is enforced by this function. + * + * CAUTION: Does not invoke `onERC721Received` on the receiver. * * Emits a {ConsecutiveTransfer} event. */ @@ -71,7 +88,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { if (batchSize > 0) { require(!Address.isContract(address(this)), "ERC721Consecutive: batch minting restricted to constructor"); require(to != address(0), "ERC721Consecutive: mint to the zero address"); - require(batchSize <= 5000, "ERC721Consecutive: batch too large"); + require(batchSize <= _maxBatchSize(), "ERC721Consecutive: batch too large"); // hook before _beforeConsecutiveTokenTransfer(address(0), to, first, batchSize); @@ -100,7 +117,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { } /** - * @dev See {ERC721-_afterTokenTransfer}. Burning of token that have been sequentially minted must be explicit. + * @dev See {ERC721-_afterTokenTransfer}. Burning of tokens that have been sequentially minted must be explicit. */ function _afterTokenTransfer( address from, @@ -109,7 +126,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { ) internal virtual override { if ( to == address(0) && // if we burn - tokenId <= _totalConsecutiveSupply() && // and the tokenId was minted is a batch + tokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch !_sequentialBurn.get(tokenId) // and the token was never marked as burnt ) { _sequentialBurn.set(tokenId); diff --git a/test/token/ERC721/extensions/ERC721Consecutive.test.js b/test/token/ERC721/extensions/ERC721Consecutive.test.js index de3af0a07..5e480abb8 100644 --- a/test/token/ERC721/extensions/ERC721Consecutive.test.js +++ b/test/token/ERC721/extensions/ERC721Consecutive.test.js @@ -122,7 +122,7 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.ownerOf(1)).to.be.equal(receiver); }); - it('tokens can be burned and re-minted', async function () { + it('tokens can be burned and re-minted #1', async function () { expectEvent( await this.token.burn(1, { from: user1 }), 'Transfer', @@ -139,6 +139,39 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.ownerOf(1)).to.be.equal(user2); }); + + it('tokens can be burned and re-minted #2', async function () { + const tokenId = batches.reduce((acc, { amount }) => acc.addn(amount), web3.utils.toBN(0)); + + expect(await this.token.exists(tokenId)).to.be.equal(false); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); + + // mint + await this.token.mint(user1, tokenId); + + expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.ownerOf(tokenId), user1); + + // burn + expectEvent( + await this.token.burn(tokenId, { from: user1 }), + 'Transfer', + { from: user1, to: constants.ZERO_ADDRESS, tokenId }, + ); + + expect(await this.token.exists(tokenId)).to.be.equal(false); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); + + // re-mint + expectEvent( + await this.token.mint(user2, tokenId), + 'Transfer', + { from: constants.ZERO_ADDRESS, to: user2, tokenId }, + ); + + expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.ownerOf(tokenId), user2); + }); }); }); From 16408a1dcfd02cf4993c064fae66b639fc8ac7c7 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 28 Sep 2022 19:46:48 +0200 Subject: [PATCH 041/197] Update Arbitrum's vendored contracts to Nitro (#3692) Co-authored-by: Francisco (cherry picked from commit 9938a85558e43bcadefe411d8e85e4a471de6a32) --- CHANGELOG.md | 1 + .../crosschain/arbitrum/LibArbitrumL1.sol | 1 - contracts/vendor/arbitrum/IArbSys.sol | 123 ++++++++---- contracts/vendor/arbitrum/IBridge.sol | 114 +++++++---- .../arbitrum/IDelayedMessageProvider.sol | 15 ++ contracts/vendor/arbitrum/IInbox.sol | 183 ++++++++++++------ .../vendor/arbitrum/IMessageProvider.sol | 26 --- contracts/vendor/arbitrum/IOutbox.sol | 129 +++++++++--- 8 files changed, 396 insertions(+), 196 deletions(-) create mode 100644 contracts/vendor/arbitrum/IDelayedMessageProvider.sol delete mode 100644 contracts/vendor/arbitrum/IMessageProvider.sol diff --git a/CHANGELOG.md b/CHANGELOG.md index bb527f06e..6ca9cc5c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ * `Ownable2Step`: extension of `Ownable` that makes the ownership transfers a two step process. ([#3620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3620)) * `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679)) * `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670)) + * Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692)) ### Breaking changes diff --git a/contracts/crosschain/arbitrum/LibArbitrumL1.sol b/contracts/crosschain/arbitrum/LibArbitrumL1.sol index 6b591cac4..8947f906d 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL1.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL1.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.4; import {IBridge as ArbitrumL1_Bridge} from "../../vendor/arbitrum/IBridge.sol"; -import {IInbox as ArbitrumL1_Inbox} from "../../vendor/arbitrum/IInbox.sol"; import {IOutbox as ArbitrumL1_Outbox} from "../../vendor/arbitrum/IOutbox.sol"; import "../errors.sol"; diff --git a/contracts/vendor/arbitrum/IArbSys.sol b/contracts/vendor/arbitrum/IArbSys.sol index 15a10451a..eb02432d2 100644 --- a/contracts/vendor/arbitrum/IArbSys.sol +++ b/contracts/vendor/arbitrum/IArbSys.sol @@ -1,19 +1,15 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IArbSys.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + pragma solidity >=0.4.21 <0.9.0; /** - * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality. + * @title System level functionality + * @notice For use by contracts to interact with core L2-specific functionality. + * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. */ interface IArbSys { - /** - * @notice Get internal version number identifying an ArbOS build - * @return version number as int - */ - function arbOSVersion() external pure returns (uint256); - - function arbChainID() external view returns (uint256); - /** * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0) * @return block number as int @@ -21,43 +17,44 @@ interface IArbSys { function arbBlockNumber() external view returns (uint256); /** - * @notice Send given amount of Eth to dest from sender. - * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1. - * @param destination recipient address on L1 - * @return unique identifier for this L2-to-L1 transaction. + * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum) + * @return block hash */ - function withdrawEth(address destination) external payable returns (uint256); + function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32); /** - * @notice Send a transaction to L1 - * @param destination recipient address on L1 - * @param calldataForL1 (optional) calldata for L1 contract call - * @return a unique identifier for this L2-to-L1 transaction. + * @notice Gets the rollup's unique chain identifier + * @return Chain identifier as int */ - function sendTxToL1(address destination, bytes calldata calldataForL1) external payable returns (uint256); + function arbChainID() external view returns (uint256); /** - * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract - * @param account target account - * @return the number of transactions issued by the given external account or the account sequence number of the given contract + * @notice Get internal version number identifying an ArbOS build + * @return version number as int */ - function getTransactionCount(address account) external view returns (uint256); + function arbOSVersion() external view returns (uint256); /** - * @notice get the value of target L2 storage slot - * This function is only callable from address 0 to prevent contracts from being able to call it - * @param account target account - * @param index target index of storage slot - * @return stotage value for the given account at the given index + * @notice Returns 0 since Nitro has no concept of storage gas + * @return uint 0 */ - function getStorageAt(address account, uint256 index) external view returns (uint256); + function getStorageGasAvailable() external view returns (uint256); /** - * @notice check if current call is coming from l1 - * @return true if the caller of this was called directly from L1 + * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract) + * @dev this call has been deprecated and may be removed in a future release + * @return true if current execution frame is not a call by another L2 contract */ function isTopLevelCall() external view returns (bool); + /** + * @notice map L1 sender contract address to its L2 alias + * @param sender sender address + * @param unused argument no longer used + * @return aliased sender address + */ + function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address); + /** * @notice check if the caller (of this caller of this) is an aliased L1 contract address * @return true iff the caller's address is an alias for an L1 contract address @@ -71,19 +68,55 @@ interface IArbSys { function myCallersAddressWithoutAliasing() external view returns (address); /** - * @notice map L1 sender contract address to its L2 alias - * @param sender sender address - * @param dest destination address - * @return aliased sender address + * @notice Send given amount of Eth to dest from sender. + * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data. + * @param destination recipient address on L1 + * @return unique identifier for this L2-to-L1 transaction. */ - function mapL1SenderContractAddressToL2Alias(address sender, address dest) external pure returns (address); + function withdrawEth(address destination) external payable returns (uint256); /** - * @notice get the caller's amount of available storage gas - * @return amount of storage gas available to the caller + * @notice Send a transaction to L1 + * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data + * to a contract address without any code (as enforced by the Bridge contract). + * @param destination recipient address on L1 + * @param data (optional) calldata for L1 contract call + * @return a unique identifier for this L2-to-L1 transaction. */ - function getStorageGasAvailable() external view returns (uint256); + function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256); + /** + * @notice Get send Merkle tree state + * @return size number of sends in the history + * @return root root hash of the send history + * @return partials hashes of partial subtrees in the send history tree + */ + function sendMerkleTreeState() + external + view + returns ( + uint256 size, + bytes32 root, + bytes32[] memory partials + ); + + /** + * @notice creates a send txn from L2 to L1 + * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf + */ + event L2ToL1Tx( + address caller, + address indexed destination, + uint256 indexed hash, + uint256 indexed position, + uint256 arbBlockNum, + uint256 ethBlockNum, + uint256 timestamp, + uint256 callvalue, + bytes data + ); + + /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade event L2ToL1Transaction( address caller, address indexed destination, @@ -96,4 +129,12 @@ interface IArbSys { uint256 callvalue, bytes data ); + + /** + * @notice logs a merkle branch for proof synthesis + * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event + * @param hash the merkle hash + * @param position = (level << 192) + leaf + */ + event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position); } diff --git a/contracts/vendor/arbitrum/IBridge.sol b/contracts/vendor/arbitrum/IBridge.sol index 88d5013b1..7982fb95b 100644 --- a/contracts/vendor/arbitrum/IBridge.sol +++ b/contracts/vendor/arbitrum/IBridge.sol @@ -1,23 +1,9 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IBridge.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; interface IBridge { event MessageDelivered( @@ -26,41 +12,97 @@ interface IBridge { address inbox, uint8 kind, address sender, - bytes32 messageDataHash + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp ); - event BridgeCallTriggered(address indexed outbox, address indexed destAddr, uint256 amount, bytes data); + event BridgeCallTriggered(address indexed outbox, address indexed to, uint256 value, bytes data); event InboxToggle(address indexed inbox, bool enabled); event OutboxToggle(address indexed outbox, bool enabled); - function deliverMessageToInbox( + event SequencerInboxUpdated(address newSequencerInbox); + + function allowedDelayedInboxList(uint256) external returns (address); + + function allowedOutboxList(uint256) external returns (address); + + /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function delayedInboxAccs(uint256) external view returns (bytes32); + + /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. + function sequencerInboxAccs(uint256) external view returns (bytes32); + + // OpenZeppelin: changed return type from IOwnable + function rollup() external view returns (address); + + function sequencerInbox() external view returns (address); + + function activeOutbox() external view returns (address); + + function allowedDelayedInboxes(address inbox) external view returns (bool); + + function allowedOutboxes(address outbox) external view returns (bool); + + function sequencerReportedSubMessageCount() external view returns (uint256); + + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256); function executeCall( - address destAddr, - uint256 amount, + address to, + uint256 value, bytes calldata data ) external returns (bool success, bytes memory returnData); - // These are only callable by the admin - function setInbox(address inbox, bool enabled) external; + function delayedMessageCount() external view returns (uint256); + + function sequencerMessageCount() external view returns (uint256); + + // ---------- onlySequencerInbox functions ---------- + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ); + + /** + * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type + * This is done through a separate function entrypoint instead of allowing the sequencer inbox + * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either + * every delayed inbox or every sequencer inbox call. + */ + function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) external returns (uint256 msgNum); + + // ---------- onlyRollupOrOwner functions ---------- + + function setSequencerInbox(address _sequencerInbox) external; + + function setDelayedInbox(address inbox, bool enabled) external; function setOutbox(address inbox, bool enabled) external; - // View functions + // ---------- initializer ---------- - function activeOutbox() external view returns (address); - - function allowedInboxes(address inbox) external view returns (bool); - - function allowedOutboxes(address outbox) external view returns (bool); - - function inboxAccs(uint256 index) external view returns (bytes32); - - function messageCount() external view returns (uint256); + // OpenZeppelin: changed rollup_ type from IOwnable + function initialize(address rollup_) external; } diff --git a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol new file mode 100644 index 000000000..9e650c872 --- /dev/null +++ b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol @@ -0,0 +1,15 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +interface IDelayedMessageProvider { + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + + /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator + /// same as InboxMessageDelivered but the batch data is available in tx.input + event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); +} diff --git a/contracts/vendor/arbitrum/IInbox.sol b/contracts/vendor/arbitrum/IInbox.sol index 75f93ed86..4396dc18f 100644 --- a/contracts/vendor/arbitrum/IInbox.sol +++ b/contracts/vendor/arbitrum/IInbox.sol @@ -1,92 +1,151 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IInbox.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; -pragma solidity ^0.8.0; +import "./IBridge.sol"; +import "./IDelayedMessageProvider.sol"; -import "./IMessageProvider.sol"; +interface IInbox is IDelayedMessageProvider { + function bridge() external view returns (IBridge); -interface IInbox is IMessageProvider { + // OpenZeppelin: changed return type from ISequencerInbox + function sequencerInbox() external view returns (address); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input + * @param messageData Data of the message being sent + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method can be used to send any type of message that doesn't require L1 validation + * @param messageData Data of the message being sent + */ function sendL2Message(bytes calldata messageData) external returns (uint256); - function sendUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, - uint256 nonce, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - - function sendContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - function sendL1FundedUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, + uint256 gasLimit, + uint256 maxFeePerGas, uint256 nonce, - address destAddr, + address to, bytes calldata data ) external payable returns (uint256); function sendL1FundedContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, + uint256 gasLimit, + uint256 maxFeePerGas, + address to, bytes calldata data ) external payable returns (uint256); + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Get the L1 fee for submitting a retryable + * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value + * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! + * @param dataLength The length of the retryable's calldata, in bytes + * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used + */ + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) external view returns (uint256); + + /** + * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositEth() external payable returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all msg.value will deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ function createRetryableTicket( - address destAddr, - uint256 arbTxCallValue, + address to, + uint256 l2CallValue, uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); - function createRetryableTicketNoRefundAliasRewrite( - address destAddr, - uint256 arbTxCallValue, + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, bytes calldata data ) external payable returns (uint256); - function depositEth(uint256 maxSubmissionCost) external payable returns (uint256); + // ---------- onlyRollupOrOwner functions ---------- - function bridge() external view returns (address); + /// @notice pauses all inbox functionality + function pause() external; - function pauseCreateRetryables() external; + /// @notice unpauses all inbox functionality + function unpause() external; - function unpauseCreateRetryables() external; + // ---------- initializer ---------- - function startRewriteAddress() external; + /** + * @dev function to be called one time during the inbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit(IBridge _bridge) external; - function stopRewriteAddress() external; + // OpenZeppelin: changed _sequencerInbox type from ISequencerInbox + function initialize(IBridge _bridge, address _sequencerInbox) external; } diff --git a/contracts/vendor/arbitrum/IMessageProvider.sol b/contracts/vendor/arbitrum/IMessageProvider.sol deleted file mode 100644 index 88d9ba4fc..000000000 --- a/contracts/vendor/arbitrum/IMessageProvider.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IMessageProvider.sol) - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -interface IMessageProvider { - event InboxMessageDelivered(uint256 indexed messageNum, bytes data); - - event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); -} diff --git a/contracts/vendor/arbitrum/IOutbox.sol b/contracts/vendor/arbitrum/IOutbox.sol index 95c10800b..13dd5719d 100644 --- a/contracts/vendor/arbitrum/IOutbox.sol +++ b/contracts/vendor/arbitrum/IOutbox.sol @@ -1,51 +1,120 @@ -// SPDX-License-Identifier: Apache-2.0 -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/arbitrum/IOutbox.sol) +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; -pragma solidity ^0.8.0; +import "./IBridge.sol"; interface IOutbox { - event OutboxEntryCreated( - uint256 indexed batchNum, - uint256 outboxEntryIndex, - bytes32 outputRoot, - uint256 numInBatch - ); + event SendRootUpdated(bytes32 indexed blockHash, bytes32 indexed outputRoot); event OutBoxTransactionExecuted( - address indexed destAddr, + address indexed to, address indexed l2Sender, - uint256 indexed outboxEntryIndex, + uint256 indexed zero, uint256 transactionIndex ); + function rollup() external view returns (address); // the rollup contract + + function bridge() external view returns (IBridge); // the bridge contract + + function spent(uint256) external view returns (bytes32); // packed spent bitmap + + function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash + + // solhint-disable-next-line func-name-mixedcase + function OUTBOX_VERSION() external view returns (uint128); // the outbox version + + function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external; + + /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account + /// When the return value is zero, that means this is a system message + /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies function l2ToL1Sender() external view returns (address); + /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1Block() external view returns (uint256); + /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1EthBlock() external view returns (uint256); + /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active function l2ToL1Timestamp() external view returns (uint256); - function l2ToL1BatchNum() external view returns (uint256); - + /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active function l2ToL1OutputId() external view returns (bytes32); - function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths) external; + /** + * @notice Executes a messages in an Outbox entry. + * @dev Reverts if dispute period hasn't expired, since the outbox entry + * is only created once the rollup confirms the respective assertion. + * @dev it is not possible to execute any L2-to-L1 transaction which contains data + * to a contract address without any code (as enforced by the Bridge contract). + * @param proof Merkle proof of message inclusion in send root + * @param index Merkle path to message + * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1) + * @param to destination address for L1 contract call + * @param l2Block l2 block number at which sendTxToL1 call was made + * @param l1Block l1 block number at which sendTxToL1 call was made + * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made + * @param value wei in L1 message + * @param data abi-encoded L1 message data + */ + function executeTransaction( + bytes32[] calldata proof, + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external; - function outboxEntryExists(uint256 batchNum) external view returns (bool); + /** + * @dev function used to simulate the result of a particular function call from the outbox + * it is useful for things such as gas estimates. This function includes all costs except for + * proof validation (which can be considered offchain as a somewhat of a fixed cost - it's + * not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation). + * We can't include the cost of proof validation since this is intended to be used to simulate txs + * that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend + * to confirm a pending merkle root, but that would be less practical for integrating with tooling. + * It is only possible to trigger it when the msg sender is address zero, which should be impossible + * unless under simulation in an eth_call or eth_estimateGas + */ + function executeTransactionSimulation( + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external; + + /** + * @param index Merkle path to message + * @return true if the message has been spent + */ + function isSpent(uint256 index) external view returns (bool); + + function calculateItemHash( + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external pure returns (bytes32); + + function calculateMerkleRoot( + bytes32[] memory proof, + uint256 path, + bytes32 item + ) external pure returns (bytes32); } From f0de978a9e4826d87dc561dbb41d962d1f68e9df Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 28 Sep 2022 15:42:55 -0300 Subject: [PATCH 042/197] Improve handling and docs for ERC4626.decimals (#3733) (cherry picked from commit 14f98dbb581a5365ce3f0c50bd850e499c554f72) --- contracts/token/ERC20/extensions/ERC4626.sol | 33 ++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 8e14f776a..824f2075b 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -33,18 +33,33 @@ abstract contract ERC4626 is ERC20, IERC4626 { * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC20 or ERC777). */ constructor(IERC20 asset_) { - uint8 decimals_; - try IERC20Metadata(address(asset_)).decimals() returns (uint8 value) { - decimals_ = value; - } catch { - decimals_ = super.decimals(); - } - + (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_); + _decimals = success ? assetDecimals : super.decimals(); _asset = asset_; - _decimals = decimals_; } - /** @dev See {IERC20Metadata-decimals}. */ + /** + * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way. + */ + function _tryGetAssetDecimals(IERC20 asset_) private returns (bool, uint8) { + (bool success, bytes memory encodedDecimals) = address(asset_).call( + abi.encodeWithSelector(IERC20Metadata.decimals.selector) + ); + if (success && encodedDecimals.length >= 32) { + uint256 returnedDecimals = abi.decode(encodedDecimals, (uint256)); + if (returnedDecimals <= type(uint8).max) { + return (true, uint8(returnedDecimals)); + } + } + return (false, 0); + } + + /** + * @dev Decimals are read from the underlying asset in the constructor and cached. If this fails (e.g., the asset + * has not been created yet), the cached value is set to a default obtained by `super.decimals()` (which depends on + * inheritance but is most likely 18). Override this function in order to set a guaranteed hardcoded value. + * See {IERC20Metadata-decimals}. + */ function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) { return _decimals; } From 50501a751e319a37e9cc85f986d7dcea46ab926a Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 30 Sep 2022 12:52:45 -0300 Subject: [PATCH 043/197] Update docs pipeline to solidity-docgen@0.6 (#3707) (cherry picked from commit c52625018b2afb7bd015cf7f3be20753123b437b) --- contracts/governance/utils/Votes.sol | 2 +- .../token/ERC20/extensions/ERC20FlashMint.sol | 2 +- .../token/ERC20/extensions/ERC20Votes.sol | 4 +- contracts/token/ERC20/utils/SafeERC20.sol | 2 +- .../ERC721/extensions/ERC721Consecutive.sol | 2 +- .../token/ERC721/extensions/ERC721Royalty.sol | 4 +- .../token/ERC721/extensions/ERC721Votes.sol | 4 +- contracts/token/ERC777/ERC777.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 4 +- docs/config.js | 21 + docs/contract.hbs | 91 - docs/helpers.js | 10 - docs/prelude.hbs | 6 - docs/templates/contract.hbs | 85 + docs/templates/helpers.js | 46 + docs/templates/page.hbs | 4 + docs/templates/properties.js | 49 + hardhat.config.js | 3 + package-lock.json | 6260 +---------------- package.json | 9 +- scripts/gen-nav.js | 6 +- scripts/generate/templates/EnumerableMap.js | 4 +- scripts/prepare-docs-solc.js | 16 - scripts/prepare-docs.sh | 12 +- 24 files changed, 610 insertions(+), 6038 deletions(-) create mode 100644 docs/config.js delete mode 100644 docs/contract.hbs delete mode 100644 docs/helpers.js delete mode 100644 docs/prelude.hbs create mode 100644 docs/templates/contract.hbs create mode 100644 docs/templates/helpers.js create mode 100644 docs/templates/page.hbs create mode 100644 docs/templates/properties.js delete mode 100644 scripts/prepare-docs-solc.js diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 631563996..2ab8ddca0 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -122,7 +122,7 @@ abstract contract Votes is IVotes, Context, EIP712 { /** * @dev Delegate all of `account`'s voting units to `delegatee`. * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. + * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. */ function _delegate(address account, address delegatee) internal virtual { address oldDelegate = delegates(account); diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index b8a1c7b62..db3ee087a 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -73,7 +73,7 @@ abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { * amount + fee tokens and have them approved back to the token contract itself so * they can be burned. * @param receiver The receiver of the flash loan. Should implement the - * {IERC3156FlashBorrower.onFlashLoan} interface. + * {IERC3156FlashBorrower-onFlashLoan} interface. * @param token The token to be flash loaned. Only `address(this)` is * supported. * @param amount The amount of tokens to be loaned. diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 6dac80d5a..944596770 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -191,7 +191,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { /** * @dev Move voting power when tokens are transferred. * - * Emits a {DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, @@ -206,7 +206,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { /** * @dev Change delegation for `delegator` to `delegatee`. * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. + * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index 37d25f58a..f7f3653dc 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -104,7 +104,7 @@ library SafeERC20 { */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 403b23971..f039ac2d6 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -79,7 +79,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { * * CAUTION: Does not invoke `onERC721Received` on the receiver. * - * Emits a {ConsecutiveTransfer} event. + * Emits a {IERC2309-ConsecutiveTransfer} event. */ function _mintConsecutive(address to, uint96 batchSize) internal virtual returns (uint96) { uint96 first = _totalConsecutiveSupply(); diff --git a/contracts/token/ERC721/extensions/ERC721Royalty.sol b/contracts/token/ERC721/extensions/ERC721Royalty.sol index f9414da05..9addb9c5b 100644 --- a/contracts/token/ERC721/extensions/ERC721Royalty.sol +++ b/contracts/token/ERC721/extensions/ERC721Royalty.sol @@ -11,8 +11,8 @@ import "../../../utils/introspection/ERC165.sol"; * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * - * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for - * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. + * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for + * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index 494fcae51..7c81cdf97 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -20,7 +20,7 @@ abstract contract ERC721Votes is ERC721, Votes { /** * @dev Adjusts votes when tokens are transferred. * - * Emits a {Votes-DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, @@ -34,7 +34,7 @@ abstract contract ERC721Votes is ERC721, Votes { /** * @dev Adjusts votes when a batch of tokens is transferred. * - * Emits a {Votes-DelegateVotesChanged} event. + * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterConsecutiveTokenTransfer( address from, diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index a46100437..96f2ae4c5 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -508,7 +508,7 @@ contract ERC777 is Context, IERC777, IERC20 { * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * - * Might emit an {Approval} event. + * Might emit an {IERC20-Approval} event. */ function _spendAllowance( address owner, diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index 962e96979..e1687c9a5 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -145,10 +145,10 @@ library EnumerableMap { } /** - * @dev Same as {_get}, with a custom error message when `key` is not in the map. + * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {_tryGet}. + * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( Bytes32ToBytes32Map storage map, diff --git a/docs/config.js b/docs/config.js new file mode 100644 index 000000000..f0af66390 --- /dev/null +++ b/docs/config.js @@ -0,0 +1,21 @@ +const path = require('path'); +const fs = require('fs'); + +/** @type import('solidity-docgen/dist/config').UserConfig */ +module.exports = { + outputDir: 'docs/modules/api/pages', + templates: 'docs/templates', + exclude: ['mocks'], + pageExtension: '.adoc', + pages: (_, file, config) => { + // For each contract file, find the closest README.adoc and return its location as the output page path. + const sourcesDir = path.resolve(config.root, config.sourcesDir); + let dir = path.resolve(config.root, file.absolutePath); + while (dir.startsWith(sourcesDir)) { + dir = path.dirname(dir); + if (fs.existsSync(path.join(dir, 'README.adoc'))) { + return path.relative(sourcesDir, dir) + config.pageExtension; + } + } + }, +}; diff --git a/docs/contract.hbs b/docs/contract.hbs deleted file mode 100644 index 8690cf8a2..000000000 --- a/docs/contract.hbs +++ /dev/null @@ -1,91 +0,0 @@ -{{~#*inline "typed-variable-array"~}} -{{#each .}}{{typeName}}{{#if name}} {{name}}{{/if}}{{#unless @last}}, {{/unless}}{{/each}} -{{~/inline~}} - -{{#each linkable}} -:{{name}}: pass:normal[xref:#{{anchor}}[`++{{name}}++`]] -{{/each}} - -[.contract] -[[{{anchor}}]] -=== `++{{name}}++` link:{{github-link file.path}}[{github-icon},role=heading-link] - -[.hljs-theme-light.nopadding] -```solidity -import "@openzeppelin/contracts/{{file.path}}"; -``` - -{{natspec.devdoc}} - -{{#if ownModifiers}} -[.contract-index] -.Modifiers --- -{{#each ownModifiers}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} --- -{{/if}} - -{{#if functions}} -[.contract-index] -.Functions --- -{{#each inheritedItems}} -{{#if (or @first (ne contract.name "Context"))}} -{{#unless @first}} -[.contract-subindex-inherited] -.{{contract.name}} -{{/unless}} -{{#each functions}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} - -{{/if}} -{{/each}} --- -{{/if}} - -{{#if events}} -[.contract-index] -.Events --- -{{#each inheritedItems}} -{{#unless @first}} -[.contract-subindex-inherited] -.{{contract.name}} -{{/unless}} -{{#each events}} -* {xref-{{slug anchor~}} }[`++{{name}}({{args.names}})++`] -{{/each}} - -{{/each}} --- -{{/if}} - -{{#each ownModifiers}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}})++` [.item-kind]#modifier# - -{{natspec.devdoc}} - -{{/each}} - -{{#each ownFunctions}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}}){{#if outputs}} → {{> typed-variable-array outputs}}{{/if}}++` [.item-kind]#{{visibility}}# - -{{natspec.devdoc}} - -{{/each}} - -{{#each ownEvents}} -[.contract-item] -[[{{anchor}}]] -==== `[.contract-item-name]#++{{name}}++#++({{> typed-variable-array args}})++` [.item-kind]#event# - -{{natspec.devdoc}} - -{{/each}} diff --git a/docs/helpers.js b/docs/helpers.js deleted file mode 100644 index 9b71f44f3..000000000 --- a/docs/helpers.js +++ /dev/null @@ -1,10 +0,0 @@ -const { version } = require('../package.json'); - -module.exports = { - 'github-link': (contractPath) => { - if (typeof contractPath !== 'string') { - throw new Error('Missing argument'); - } - return `https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v${version}/contracts/${contractPath}`; - }, -}; diff --git a/docs/prelude.hbs b/docs/prelude.hbs deleted file mode 100644 index f531d72f0..000000000 --- a/docs/prelude.hbs +++ /dev/null @@ -1,6 +0,0 @@ -:github-icon: pass:[] - -{{#links}} -:{{slug target.fullName}}: pass:normal[xref:{{path}}#{{target.anchor}}[`{{target.fullName}}`]] -:xref-{{slug target.anchor}}: xref:{{path}}#{{target.anchor}} -{{/links}} diff --git a/docs/templates/contract.hbs b/docs/templates/contract.hbs new file mode 100644 index 000000000..d97e7fd0d --- /dev/null +++ b/docs/templates/contract.hbs @@ -0,0 +1,85 @@ +{{#each items}} +:{{name}}: pass:normal[xref:#{{anchor}}[`++{{name}}++`]] +{{/each}} + +[.contract] +[[{{anchor}}]] +=== `++{{name}}++` link:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v{{oz-version}}/{{__item_context.file.absolutePath}}[{github-icon},role=heading-link] + +[.hljs-theme-light.nopadding] +```solidity +import "@openzeppelin/{{__item_context.file.absolutePath}}"; +``` + +{{{natspec.dev}}} + +{{#if modifiers}} +[.contract-index] +.Modifiers +-- +{{#each modifiers}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} +-- +{{/if}} + +{{#if has-functions}} +[.contract-index] +.Functions +-- +{{#each inherited-functions}} +{{#unless @first}} +[.contract-subindex-inherited] +.{{contract.name}} +{{/unless}} +{{#each functions}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} + +{{/each}} +-- +{{/if}} + +{{#if has-events}} +[.contract-index] +.Events +-- +{{#each inheritance}} +{{#unless @first}} +[.contract-subindex-inherited] +.{{name}} +{{/unless}} +{{#each events}} +* {xref-{{anchor~}} }[`++{{name}}({{names params}})++`] +{{/each}} + +{{/each}} +-- +{{/if}} + +{{#each modifiers}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#modifier# + +{{{natspec.dev}}} + +{{/each}} + +{{#each functions}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}}){{#if returns}} → {{typed-params returns}}{{/if}}++` [.item-kind]#{{visibility}}# + +{{{natspec.dev}}} + +{{/each}} + +{{#each events}} +[.contract-item] +[[{{anchor}}]] +==== `[.contract-item-name]#++{{name}}++#++({{typed-params params}})++` [.item-kind]#event# + +{{{natspec.dev}}} + +{{/each}} diff --git a/docs/templates/helpers.js b/docs/templates/helpers.js new file mode 100644 index 000000000..8c94d757c --- /dev/null +++ b/docs/templates/helpers.js @@ -0,0 +1,46 @@ +const { version } = require('../../package.json'); + +module.exports['oz-version'] = () => version; + +module.exports['readme-path'] = (opts) => { + return 'contracts/' + opts.data.root.id.replace(/\.adoc$/, '') + '/README.adoc'; +}; + +module.exports.names = (params) => params.map(p => p.name).join(', '); + +module.exports['typed-params'] = (params) => { + return params.map(p => `${p.type}${p.name ? ' ' + p.name : ''}`).join(', '); +}; + +const slug = module.exports.slug = (str) => { + if (str === undefined) { + throw new Error('Missing argument'); + } + return str.replace(/\W/g, '-'); +}; + +const linksCache = new WeakMap(); + +function getAllLinks (items) { + if (linksCache.has(items)) { + return linksCache.get(items); + } + const res = {}; + linksCache.set(items, res); + for (const item of items) { + res[`xref-${item.anchor}`] = `xref:${item.__item_context.page}#${item.anchor}`; + res[slug(item.fullName)] = `pass:normal[xref:${item.__item_context.page}#${item.anchor}[\`${item.fullName}\`]]`; + } + return res; +} + +module.exports['with-prelude'] = (opts) => { + const links = getAllLinks(opts.data.site.items); + const contents = opts.fn(); + const neededLinks = contents + .match(/\{[-._a-z0-9]+\}/ig) + .map(m => m.replace(/^\{(.+)\}$/, '$1')) + .filter(k => k in links); + const prelude = neededLinks.map(k => `:${k}: ${links[k]}`).join('\n'); + return prelude + '\n' + contents; +}; diff --git a/docs/templates/page.hbs b/docs/templates/page.hbs new file mode 100644 index 000000000..cab050acb --- /dev/null +++ b/docs/templates/page.hbs @@ -0,0 +1,4 @@ +:github-icon: pass:[] +{{#with-prelude}} +{{readme (readme-path)}} +{{/with-prelude}} diff --git a/docs/templates/properties.js b/docs/templates/properties.js new file mode 100644 index 000000000..5dde3a471 --- /dev/null +++ b/docs/templates/properties.js @@ -0,0 +1,49 @@ +const { isNodeType } = require('solidity-ast/utils'); +const { slug } = require('./helpers'); + +module.exports.anchor = function anchor ({ item, contract }) { + let res = ''; + if (contract) { + res += contract.name + '-'; + } + res += item.name; + if ('parameters' in item) { + const signature = item.parameters.parameters.map(v => v.typeName.typeDescriptions.typeString).join(','); + res += slug('(' + signature + ')'); + } + if (isNodeType('VariableDeclaration', item)) { + res += '-' + slug(item.typeName.typeDescriptions.typeString); + } + return res; +}; + +module.exports.inheritance = function ({ item, build }) { + if (!isNodeType('ContractDefinition', item)) { + throw new Error('used inherited-items on non-contract'); + } + + return item.linearizedBaseContracts + .map(id => build.deref('ContractDefinition', id)) + .filter((c, i) => c.name !== 'Context' || i === 0); +}; + +module.exports['has-functions'] = function ({ item }) { + return item.inheritance.some(c => c.functions.length > 0); +}; + +module.exports['has-events'] = function ({ item }) { + return item.inheritance.some(c => c.events.length > 0); +}; + +module.exports['inherited-functions'] = function ({ item }) { + const { inheritance } = item; + const baseFunctions = new Set( + inheritance.flatMap(c => c.functions.flatMap(f => f.baseFunctions ?? [])), + ); + return inheritance.map((contract, i) => ({ + contract, + functions: contract.functions.filter(f => + !baseFunctions.has(f.id) && (f.name !== 'constructor' || i === 0), + ), + })); +}; diff --git a/hardhat.config.js b/hardhat.config.js index fb28b5484..4dbff0e4e 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -52,6 +52,8 @@ const argv = require('yargs/yargs')() require('@nomiclabs/hardhat-truffle5'); require('hardhat-ignore-warnings'); +require('solidity-docgen'); + if (argv.gas) { require('hardhat-gas-reporter'); } @@ -95,6 +97,7 @@ module.exports = { outputFile: argv.gasReport, coinmarketcap: argv.coinmarketcap, }, + docgen: require('./docs/config'), }; if (argv.coverage) { diff --git a/package-lock.json b/package-lock.json index 5e313e24c..8a4fcb181 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/docs-utils": "^0.1.0", + "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", "eslint": "^7.32.0", @@ -27,6 +27,7 @@ "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", + "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", @@ -43,7 +44,7 @@ "solhint": "^3.3.6", "solidity-ast": "^0.4.25", "solidity-coverage": "^0.8.0", - "solidity-docgen": "^0.5.3", + "solidity-docgen": "^0.6.0-beta.29", "web3": "^1.3.0", "yargs": "^17.0.0" } @@ -1043,6 +1044,16 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@frangio/servbot": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", + "dev": true, + "engines": { + "node": ">=12.x", + "pnpm": "7.5.1" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -1594,614 +1605,6 @@ "web3-utils": "^1.2.1" } }, - "node_modules/@oclif/command": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.16.tgz", - "integrity": "sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==", - "dev": true, - "dependencies": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.5", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.6", - "debug": "^4.1.1", - "semver": "^7.3.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@oclif/config": "^1" - } - }, - "node_modules/@oclif/config": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.3.tgz", - "integrity": "sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.5", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/config/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/@oclif/config/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/config/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/config/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", - "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", - "dev": true, - "dependencies": { - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^3.0.2", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.10.0", - "debug": "^4.3.4", - "ejs": "^3.1.6", - "fs-extra": "^9.1.0", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "semver": "^7.3.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "tslib": "^2.3.1", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oclif/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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/@oclif/core/node_modules/chalk/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": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/core/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/@oclif/core/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/@oclif/core/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/@oclif/core/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/core/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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/@oclif/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/core/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/@oclif/errors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", - "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", - "dev": true, - "dependencies": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/errors/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/errors/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/errors/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": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/errors/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.1.tgz", - "integrity": "sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw==", - "dev": true, - "dependencies": { - "@oclif/config": "1.18.2", - "@oclif/errors": "1.3.5", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/@oclif/config": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz", - "integrity": "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/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/@oclif/help/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/@oclif/help/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/@oclif/help/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@oclif/help/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/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": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/help/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "node_modules/@oclif/parser": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.7.tgz", - "integrity": "sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q==", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.5", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/parser/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/@oclif/parser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/@oclif/plugin-help": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.1.12.tgz", - "integrity": "sha512-HvH/RubJxqCinP0vUWQLTOboT+SfjfL8h40s+PymkWaldIcXlpoRaJX50vz+SjZIs7uewZwEk8fzLqpF/BWXlg==", - "dev": true, - "dependencies": { - "@oclif/core": "^1.3.6" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@oclif/screen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.2.tgz", - "integrity": "sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@openzeppelin/contract-loader": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", @@ -2227,18 +1630,18 @@ } }, "node_modules/@openzeppelin/docs-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.2.tgz", - "integrity": "sha512-oBchkfFlpqHCee/HaNXPvFy8py9Yi/LTnaE2Vsf+eO4j/FSaupzBsFIgxESjdTScSvJcIOWZFsbZDDRKscg2DQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", "dev": true, "dependencies": { + "@frangio/servbot": "^0.2.5", "chalk": "^3.0.0", - "chokidar": "^3.3.0", + "chokidar": "^3.5.3", "env-paths": "^2.2.0", "find-up": "^4.1.0", "is-port-reachable": "^3.0.0", "js-yaml": "^3.13.1", - "live-server": "^1.2.1", "lodash.startcase": "^4.4.0", "minimist": "^1.2.0" }, @@ -4257,12 +3660,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, "node_modules/antlr4": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", @@ -4288,27 +3685,6 @@ "node": ">= 8" } }, - "node_modules/apache-crypt": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", - "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", - "dev": true, - "dependencies": { - "unix-crypt-td-js": "^1.1.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/apache-md5": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", - "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4318,33 +3694,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -4388,15 +3737,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -4479,15 +3819,6 @@ "node": "*" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ast-parents": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", @@ -4512,12 +3843,6 @@ "lodash": "^4.17.14" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "node_modules/async-eventemitter": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", @@ -4539,27 +3864,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -4593,24 +3897,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -4620,56 +3906,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4690,30 +3926,6 @@ } ] }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "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 - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -4729,12 +3941,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -4802,16 +4008,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -5114,26 +4310,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cacheable-lookup": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", @@ -5259,19 +4435,6 @@ "node": ">=4" } }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -5522,21 +4685,6 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", @@ -5575,68 +4723,6 @@ "node": ">=4" } }, - "node_modules/cli-progress": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", - "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", - "dev": true, - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-progress/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/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/cli-progress/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -5741,19 +4827,6 @@ "node": ">=0.10.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5805,12 +4878,6 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5862,36 +4929,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/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/connect/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/constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", @@ -5955,15 +4992,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6308,18 +5336,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6525,12 +5541,6 @@ "no-case": "^2.2.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -6553,21 +5563,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -8225,21 +7220,6 @@ "npm": ">=3" } }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -8265,39 +7245,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/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/expand-brackets/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/express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -8439,18 +7386,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -8465,75 +7400,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -8608,18 +7474,6 @@ "reusify": "^1.0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -8653,43 +7507,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8702,39 +7519,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/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/finalhandler/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/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -8805,15 +7589,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -8858,18 +7633,6 @@ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -8879,12 +7642,6 @@ "node": ">= 0.6" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -9005,15 +7762,6 @@ "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", @@ -9051,15 +7799,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -9154,20 +7893,19 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9185,6 +7923,27 @@ "node": ">= 6" } }, + "node_modules/glob/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -9267,6 +8026,26 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globby/node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -9582,6 +8361,26 @@ "node": ">=4" } }, + "node_modules/hardhat/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/hardhat/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -9823,75 +8622,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -9992,31 +8722,6 @@ "entities": "^4.3.0" } }, - "node_modules/http-auth": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", - "integrity": "sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==", - "dev": true, - "dependencies": { - "apache-crypt": "^1.1.2", - "apache-md5": "^1.0.6", - "bcryptjs": "^2.3.0", - "uuid": "^3.0.0" - }, - "engines": { - "node": ">=4.6.1" - } - }, - "node_modules/http-auth/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/http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -10069,12 +8774,6 @@ "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -10131,15 +8830,6 @@ "node": ">= 6" } }, - "node_modules/hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10430,36 +9120,6 @@ "node": ">= 0.10" } }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -10569,36 +9229,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -10614,29 +9244,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -10646,30 +9253,6 @@ "node": ">=0.10.0" } }, - "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, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -10785,18 +9368,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-port-reachable": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", @@ -10928,24 +9499,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -10958,61 +9511,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.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/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/jake/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/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -11080,18 +9584,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11296,363 +9788,6 @@ "node": ">= 0.8.0" } }, - "node_modules/live-server": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.2.tgz", - "integrity": "sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==", - "dev": true, - "dependencies": { - "chokidar": "^2.0.4", - "colors": "1.4.0", - "connect": "^3.6.6", - "cors": "latest", - "event-stream": "3.3.4", - "faye-websocket": "0.11.x", - "http-auth": "3.1.x", - "morgan": "^1.9.1", - "object-assign": "latest", - "opn": "latest", - "proxy-middleware": "latest", - "send": "latest", - "serve-index": "^1.9.1" - }, - "bin": { - "live-server": "live-server.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/live-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/live-server/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/live-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/live-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/live-server/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/live-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/live-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/live-server/node_modules/safe-buffer": { - "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 - }, - "node_modules/live-server/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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/live-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -11839,33 +9974,6 @@ "yallist": "^3.0.2" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "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", @@ -12108,31 +10216,6 @@ "minipass": "^2.9.0" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -12263,6 +10346,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/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/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/glob/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": "*" + } + }, "node_modules/mocha/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", @@ -12421,37 +10546,6 @@ "node": ">=10" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/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/morgan/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/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12507,13 +10601,6 @@ "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true - }, "node_modules/nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -12538,104 +10625,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -12648,15 +10637,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -12892,38 +10872,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -12942,27 +10890,6 @@ "node": ">= 0.4" } }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -12999,18 +10926,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -13043,27 +10958,6 @@ "http-https": "^1.0.0" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -13085,19 +10979,6 @@ "node": ">=4" } }, - "node_modules/opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "deprecated": "The package has been renamed to `open`", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -13305,101 +11186,6 @@ "upper-case-first": "^1.1.0" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - } - }, - "node_modules/password-prompt/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/password-prompt/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/password-prompt/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/password-prompt/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/password-prompt/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/password-prompt/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/path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -13409,12 +11195,6 @@ "no-case": "^2.2.0" } }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13478,15 +11258,6 @@ "node": "*" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -13551,15 +11322,6 @@ "node": ">=0.10.0" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13709,15 +11471,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14014,59 +11767,12 @@ "node": "*" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -14096,30 +11802,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/req-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", @@ -14293,13 +11975,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -14334,15 +12009,6 @@ "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -14368,6 +12034,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -14498,15 +12184,6 @@ } ] }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -14751,75 +12428,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/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/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/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/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -14857,21 +12465,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -14987,6 +12580,26 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -15094,143 +12707,6 @@ "no-case": "^2.2.0" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/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/snapdragon/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/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/solc": { "version": "0.4.26", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", @@ -15304,6 +12780,26 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "node_modules/solc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/solc/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", @@ -15713,6 +13209,26 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "node_modules/solhint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/solhint/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -16685,156 +14201,16 @@ } }, "node_modules/solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", + "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", "dev": true, "dependencies": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" + "handlebars": "^4.7.7", + "solidity-ast": "^0.4.31" }, - "bin": { - "solidity-docgen": "dist/cli.js" - } - }, - "node_modules/solidity-docgen/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/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": { - "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/solidity-docgen/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/solidity-docgen/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-docgen/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/solidity-docgen/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/solidity-docgen/node_modules/solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solidity-docgen/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==", - "dev": true, - "bin": { - "semver": "bin/semver" + "peerDependencies": { + "hardhat": "^2.8.0" } }, "node_modules/source-map": { @@ -16850,20 +14226,6 @@ "node": ">=0.8.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -16883,13 +14245,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -16922,55 +14277,6 @@ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, - "node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17029,28 +14335,6 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -17060,15 +14344,6 @@ "node": ">=0.10.0" } }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -17195,19 +14470,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -17553,36 +14815,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -17592,21 +14824,6 @@ "node": ">=6" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17619,82 +14836,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -17917,21 +15058,6 @@ "node": ">=12.18" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -17941,12 +15067,6 @@ "node": ">= 4.0.0" } }, - "node_modules/unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -17956,64 +15076,6 @@ "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -18038,13 +15100,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -18063,15 +15118,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", @@ -18595,29 +15641,6 @@ "node": ">=4.0.0" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/websocket/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -18709,68 +15732,6 @@ "string-width": "^1.0.2 || 2" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/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/widest-line/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -19778,6 +16739,12 @@ "@ethersproject/strings": "^5.7.0" } }, + "@frangio/servbot": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -20162,477 +17129,6 @@ "source-map-support": "^0.5.19" } }, - "@oclif/command": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.16.tgz", - "integrity": "sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w==", - "dev": true, - "requires": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.5", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.6", - "debug": "^4.1.1", - "semver": "^7.3.2" - } - }, - "@oclif/config": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.3.tgz", - "integrity": "sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.5", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.3.1" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "@oclif/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-1.16.1.tgz", - "integrity": "sha512-MfzgqcWzWymndd934pd52JAwy0RIgWWYnC0Ed7bxUVYWF4HFb3KmsE7x9/QBP9392Q14vxXi2GNLHboM/5vaDA==", - "dev": true, - "requires": { - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^3.0.2", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.10.0", - "debug": "^4.3.4", - "ejs": "^3.1.6", - "fs-extra": "^9.1.0", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "semver": "^7.3.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "tslib": "^2.3.1", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "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 - }, - "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, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@oclif/errors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", - "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", - "dev": true, - "requires": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "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, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "@oclif/help": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.1.tgz", - "integrity": "sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw==", - "dev": true, - "requires": { - "@oclif/config": "1.18.2", - "@oclif/errors": "1.3.5", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "@oclif/config": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz", - "integrity": "sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-wsl": "^2.1.1", - "tslib": "^2.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-docker": "^2.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "@oclif/parser": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.7.tgz", - "integrity": "sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.5", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "@oclif/plugin-help": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.1.12.tgz", - "integrity": "sha512-HvH/RubJxqCinP0vUWQLTOboT+SfjfL8h40s+PymkWaldIcXlpoRaJX50vz+SjZIs7uewZwEk8fzLqpF/BWXlg==", - "dev": true, - "requires": { - "@oclif/core": "^1.3.6" - } - }, - "@oclif/screen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-3.0.2.tgz", - "integrity": "sha512-S/SF/XYJeevwIgHFmVDAFRUvM3m+OjhvCAYMk78ZJQCYCQ5wS7j+LTt1ZEv2jpEEGg2tx/F6TYYWxddNAYHrFQ==", - "dev": true - }, "@openzeppelin/contract-loader": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", @@ -20657,18 +17153,18 @@ } }, "@openzeppelin/docs-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.2.tgz", - "integrity": "sha512-oBchkfFlpqHCee/HaNXPvFy8py9Yi/LTnaE2Vsf+eO4j/FSaupzBsFIgxESjdTScSvJcIOWZFsbZDDRKscg2DQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", "dev": true, "requires": { + "@frangio/servbot": "^0.2.5", "chalk": "^3.0.0", - "chokidar": "^3.3.0", + "chokidar": "^3.5.3", "env-paths": "^2.2.0", "find-up": "^4.1.0", "is-port-reachable": "^3.0.0", "js-yaml": "^3.13.1", - "live-server": "^1.2.1", "lodash.startcase": "^4.4.0", "minimist": "^1.2.0" } @@ -22334,12 +18830,6 @@ "color-convert": "^2.0.1" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, "antlr4": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", @@ -22362,21 +18852,6 @@ "picomatch": "^2.0.4" } }, - "apache-crypt": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", - "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", - "dev": true, - "requires": { - "unix-crypt-td-js": "^1.1.4" - } - }, - "apache-md5": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", - "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -22386,24 +18861,6 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -22435,12 +18892,6 @@ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, "array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -22505,12 +18956,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, "ast-parents": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", @@ -22532,12 +18977,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "async-eventemitter": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", @@ -22559,18 +18998,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -22595,61 +19022,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -22665,29 +19037,6 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "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 - } - } - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -22705,12 +19054,6 @@ } } }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -22756,16 +19099,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -23037,23 +19370,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-lookup": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", @@ -23150,16 +19466,6 @@ "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -23364,18 +19670,6 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - } - }, "classic-level": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", @@ -23404,55 +19698,6 @@ "restore-cursor": "^2.0.0" } }, - "cli-progress": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", - "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", - "dev": true, - "requires": { - "string-width": "^4.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -23536,16 +19781,6 @@ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -23588,12 +19823,6 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -23644,35 +19873,6 @@ } } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "constant-case": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", @@ -23727,12 +19927,6 @@ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -24001,15 +20195,6 @@ "object-keys": "^1.1.1" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -24167,12 +20352,6 @@ "no-case": "^2.2.0" } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -24195,15 +20374,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -25549,21 +21719,6 @@ "strip-hex-prefix": "1.0.0" } }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -25586,38 +21741,6 @@ "safe-buffer": "^5.1.1" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "express": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", @@ -25742,15 +21865,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -25762,62 +21876,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -25879,15 +21937,6 @@ "reusify": "^1.0.4" } }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -25914,42 +21963,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -25959,38 +21972,6 @@ "to-regex-range": "^5.0.1" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -26038,12 +22019,6 @@ "is-callable": "^1.1.3" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -26079,27 +22054,12 @@ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -26192,12 +22152,6 @@ "has-symbols": "^1.0.3" } }, - "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 - }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", @@ -26220,12 +22174,6 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -26304,17 +22252,36 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "glob-parent": { @@ -26392,6 +22359,20 @@ "slash": "^3.0.0" }, "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -26605,6 +22586,20 @@ "locate-path": "^2.0.0" } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -26826,64 +22821,6 @@ "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -26968,26 +22905,6 @@ "entities": "^4.3.0" } }, - "http-auth": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", - "integrity": "sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==", - "dev": true, - "requires": { - "apache-crypt": "^1.1.2", - "apache-md5": "^1.0.6", - "bcryptjs": "^2.3.0", - "uuid": "^3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, "http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", @@ -27033,12 +22950,6 @@ "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, "http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -27087,12 +22998,6 @@ "debug": "4" } }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -27311,32 +23216,6 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -27402,32 +23281,6 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -27437,43 +23290,12 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true }, - "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 - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -27552,15 +23374,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-port-reachable": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", @@ -27653,18 +23466,6 @@ "call-bind": "^1.0.2" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -27677,48 +23478,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -27783,12 +23548,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -27937,305 +23696,6 @@ "type-check": "~0.4.0" } }, - "live-server": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.2.tgz", - "integrity": "sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==", - "dev": true, - "requires": { - "chokidar": "^2.0.4", - "colors": "1.4.0", - "connect": "^3.6.6", - "cors": "latest", - "event-stream": "3.3.4", - "faye-websocket": "0.11.x", - "http-auth": "3.1.x", - "morgan": "^1.9.1", - "object-assign": "latest", - "opn": "latest", - "proxy-middleware": "latest", - "send": "latest", - "serve-index": "^1.9.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "safe-buffer": { - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -28393,27 +23853,6 @@ "yallist": "^3.0.2" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -28607,27 +24046,6 @@ "minipass": "^2.9.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -28728,6 +24146,41 @@ "path-exists": "^4.0.0" } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "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", @@ -28843,36 +24296,6 @@ "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28927,13 +24350,6 @@ "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", - "dev": true, - "optional": true - }, "nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -28952,85 +24368,6 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -29043,12 +24380,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -29231,34 +24562,6 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -29271,21 +24574,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -29310,15 +24598,6 @@ "es-abstract": "^1.20.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -29345,21 +24624,6 @@ "http-https": "^1.0.0" } }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -29378,15 +24642,6 @@ "mimic-fn": "^1.0.0" } }, - "opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -29549,79 +24804,6 @@ "upper-case-first": "^1.1.0" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -29631,12 +24813,6 @@ "no-case": "^2.2.0" } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -29685,15 +24861,6 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -29740,12 +24907,6 @@ "pinkie": "^2.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -29857,12 +25018,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30090,52 +25245,12 @@ } } }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -30153,24 +25268,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, "req-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", @@ -30300,12 +25397,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -30333,12 +25424,6 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -30352,6 +25437,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ripemd160": { @@ -30432,15 +25533,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -30649,68 +25741,6 @@ "randombytes": "^2.1.0" } }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -30742,18 +25772,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -30837,6 +25855,22 @@ "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "side-channel": { @@ -30918,122 +25952,6 @@ "no-case": "^2.2.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "solc": { "version": "0.4.26", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", @@ -31095,6 +26013,20 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "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", @@ -31433,6 +26365,20 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -32136,130 +27082,13 @@ } }, "solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", + "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", "dev": true, "requires": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "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, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "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 - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - } + "handlebars": "^4.7.7", + "solidity-ast": "^0.4.31" } }, "source-map": { @@ -32272,19 +27101,6 @@ "amdefine": ">=0.0.4" } }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -32303,12 +27119,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -32341,45 +27151,6 @@ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -32428,37 +27199,12 @@ } } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, "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 }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -32551,16 +27297,6 @@ "has-flag": "^4.0.0" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -32847,110 +27583,12 @@ "os-tmpdir": "~1.0.2" } }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -33141,82 +27779,18 @@ "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "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 }, - "unix-crypt-td-js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", - "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -33241,12 +27815,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -33262,12 +27830,6 @@ "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", @@ -33728,23 +28290,6 @@ } } }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -33806,55 +28351,6 @@ "string-width": "^1.0.2 || 2" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", diff --git a/package.json b/package.json index 48926d9ff..8dc72dd7c 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "scripts": { "compile": "hardhat compile", "coverage": "env COVERAGE=true hardhat coverage", - "docs": "oz-docs", - "docs:watch": "npm run docs watch contracts 'docs/*.hbs' docs/helpers.js", + "docs": "npm run prepare-docs && oz-docs", + "docs:watch": "oz-docs watch contracts 'docs/templates' docs/config.js", "prepare-docs": "scripts/prepare-docs.sh", "lint": "npm run lint:js && npm run lint:sol", "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix", @@ -56,7 +56,7 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/docs-utils": "^0.1.0", + "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", "eslint": "^7.32.0", @@ -68,6 +68,7 @@ "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", + "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", "hardhat-gas-reporter": "^1.0.4", @@ -84,7 +85,7 @@ "solhint": "^3.3.6", "solidity-ast": "^0.4.25", "solidity-coverage": "^0.8.0", - "solidity-docgen": "^0.5.3", + "solidity-docgen": "^0.6.0-beta.29", "web3": "^1.3.0", "yargs": "^17.0.0" } diff --git a/scripts/gen-nav.js b/scripts/gen-nav.js index a03fbd696..b39d23e0d 100644 --- a/scripts/gen-nav.js +++ b/scripts/gen-nav.js @@ -1,14 +1,12 @@ #!/usr/bin/env node const path = require('path'); -const proc = require('child_process'); +const glob = require('glob'); const startCase = require('lodash.startcase'); const baseDir = process.argv[2]; -const files = proc.execFileSync( - 'find', [baseDir, '-type', 'f'], { encoding: 'utf8' }, -).split('\n').filter(s => s !== ''); +const files = glob.sync(baseDir + '/**/*.adoc').map(f => path.relative(baseDir, f)); console.log('.API'); diff --git a/scripts/generate/templates/EnumerableMap.js b/scripts/generate/templates/EnumerableMap.js index a628f869e..ca8e0e77d 100644 --- a/scripts/generate/templates/EnumerableMap.js +++ b/scripts/generate/templates/EnumerableMap.js @@ -154,10 +154,10 @@ function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns } /** - * @dev Same as {_get}, with a custom error message when \`key\` is not in the map. + * @dev Same as {get}, with a custom error message when \`key\` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {_tryGet}. + * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( Bytes32ToBytes32Map storage map, diff --git a/scripts/prepare-docs-solc.js b/scripts/prepare-docs-solc.js deleted file mode 100644 index 5c38383a4..000000000 --- a/scripts/prepare-docs-solc.js +++ /dev/null @@ -1,16 +0,0 @@ -const hre = require('hardhat'); - -const { getCompilersDir } = require('hardhat/internal/util/global-dir'); -const { CompilerDownloader } = require('hardhat/internal/solidity/compiler/downloader'); -const { Compiler } = require('hardhat/internal/solidity/compiler'); - -const [{ version }] = hre.config.solidity.compilers; - -async function getSolc () { - const downloader = new CompilerDownloader(await getCompilersDir(), { forceSolcJs: true }); - const { compilerPath } = await downloader.getDownloadedCompilerPath(version); - const compiler = new Compiler(compilerPath); - return compiler.getSolc(); -} - -module.exports = Object.assign(getSolc(), { __esModule: true }); diff --git a/scripts/prepare-docs.sh b/scripts/prepare-docs.sh index 0e5a0605a..53a996b17 100755 --- a/scripts/prepare-docs.sh +++ b/scripts/prepare-docs.sh @@ -2,7 +2,7 @@ set -o errexit -OUTDIR=docs/modules/api/pages/ +OUTDIR="$(node -p 'require("./docs/config.js").outputDir')" if [ ! -d node_modules ]; then npm ci @@ -10,14 +10,6 @@ fi rm -rf "$OUTDIR" -solidity-docgen \ - -t docs \ - -o "$OUTDIR" \ - -e contracts/mocks,contracts/examples \ - --output-structure readmes \ - --helpers ./docs/helpers.js \ - --solc-module ./scripts/prepare-docs-solc.js - -rm -f "$OUTDIR"/token/*/presets.md +hardhat docgen node scripts/gen-nav.js "$OUTDIR" > "$OUTDIR/../nav.adoc" From 561d1061fc568f04c7a65853538e834a889751e8 Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Sat, 1 Oct 2022 07:13:19 +0800 Subject: [PATCH 044/197] Fix typos, improve wording and punctuation. (#3741) --- docs/modules/ROOT/pages/access-control.adoc | 2 +- docs/modules/ROOT/pages/erc1155.adoc | 4 ++-- docs/modules/ROOT/pages/erc20-supply.adoc | 6 +++--- docs/modules/ROOT/pages/releases-stability.adoc | 4 ++-- docs/modules/ROOT/pages/utilities.adoc | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/modules/ROOT/pages/access-control.adoc b/docs/modules/ROOT/pages/access-control.adoc index efa25ff96..f3ddb6234 100644 --- a/docs/modules/ROOT/pages/access-control.adoc +++ b/docs/modules/ROOT/pages/access-control.adoc @@ -39,7 +39,7 @@ WARNING: Removing the owner altogether will mean that administrative tasks that Note that *a contract can also be the owner of another one*! This opens the door to using, for example, a https://gnosis-safe.io[Gnosis Safe], an https://aragon.org[Aragon DAO], or a totally custom contract that _you_ create. -In this way you can use _composability_ to add additional layers of access control complexity to your contracts. Instead of having a single regular Ethereum account (Externally Owned Account, or EOA) as the owner, you could use a 2-of-3 multisig run by your project leads, for example. Prominent projects in the space, such as https://makerdao.com[MakerDAO], use systems similar to this one. +In this way, you can use _composability_ to add additional layers of access control complexity to your contracts. Instead of having a single regular Ethereum account (Externally Owned Account, or EOA) as the owner, you could use a 2-of-3 multisig run by your project leads, for example. Prominent projects in the space, such as https://makerdao.com[MakerDAO], use systems similar to this one. [[role-based-access-control]] == Role-Based Access Control diff --git a/docs/modules/ROOT/pages/erc1155.adoc b/docs/modules/ROOT/pages/erc1155.adoc index 7ff42621c..0ca933865 100644 --- a/docs/modules/ROOT/pages/erc1155.adoc +++ b/docs/modules/ROOT/pages/erc1155.adoc @@ -24,9 +24,9 @@ In the spirit of the standard, we've also included batch operations in the non-s We'll use ERC1155 to track multiple items in our game, which will each have their own unique attributes. We mint all items to the deployer of the contract, which we can later transfer to players. Players are free to keep their tokens or trade them with other people as they see fit, as they would any other asset on the blockchain! -For simplicity we will mint all items in the constructor but you could add minting functionality to the contract to mint on demand to players. +For simplicity, we will mint all items in the constructor, but you could add minting functionality to the contract to mint on demand to players. -TIP: For an overview of minting mechanisms check out xref:erc20-supply.adoc[Creating ERC20 Supply]. +TIP: For an overview of minting mechanisms, check out xref:erc20-supply.adoc[Creating ERC20 Supply]. Here's what a contract for tokenized items might look like: diff --git a/docs/modules/ROOT/pages/erc20-supply.adoc b/docs/modules/ROOT/pages/erc20-supply.adoc index 60052fd18..31b0cd956 100644 --- a/docs/modules/ROOT/pages/erc20-supply.adoc +++ b/docs/modules/ROOT/pages/erc20-supply.adoc @@ -1,6 +1,6 @@ = Creating ERC20 Supply -In this guide you will learn how to create an ERC20 token with a custom supply mechanism. We will showcase two idiomatic ways to use OpenZeppelin Contracts for this purpose that you will be able to apply to your smart contract development practice. +In this guide, you will learn how to create an ERC20 token with a custom supply mechanism. We will showcase two idiomatic ways to use OpenZeppelin Contracts for this purpose that you will be able to apply to your smart contract development practice. The standard interface implemented by tokens built on Ethereum is called ERC20, and Contracts includes a widely used implementation of it: the aptly named xref:api:token/ERC20.adoc[`ERC20`] contract. This contract, like the standard itself, is quite simple and bare-bones. In fact, if you try to deploy an instance of `ERC20` as-is it will be quite literally useless... it will have no supply! What use is a token with no supply? @@ -21,7 +21,7 @@ contract ERC20FixedSupply is ERC20 { } ---- -Starting with Contracts v2 this pattern is not only discouraged, but disallowed. The variables `totalSupply` and `balances` are now private implementation details of `ERC20`, and you can't directly write to them. Instead, there is an internal xref:api:token/ERC20.adoc#ERC20-_mint-address-uint256-[`_mint`] function that will do exactly this: +Starting with Contracts v2, this pattern is not only discouraged, but disallowed. The variables `totalSupply` and `balances` are now private implementation details of `ERC20`, and you can't directly write to them. Instead, there is an internal xref:api:token/ERC20.adoc#ERC20-_mint-address-uint256-[`_mint`] function that will do exactly this: [source,solidity] ---- @@ -39,7 +39,7 @@ Encapsulating state like this makes it safer to extend contracts. For instance, The internal xref:api:token/ERC20.adoc#ERC20-_mint-address-uint256-[`_mint`] function is the key building block that allows us to write ERC20 extensions that implement a supply mechanism. -The mechanism we will implement is a token reward for the miners that produce Ethereum blocks. In Solidity we can access the address of the current block's miner in the global variable `block.coinbase`. We will mint a token reward to this address whenever someone calls the function `mintMinerReward()` on our token. The mechanism may sound silly, but you never know what kind of dynamic this might result in, and it's worth analyzing and experimenting with! +The mechanism we will implement is a token reward for the miners that produce Ethereum blocks. In Solidity, we can access the address of the current block's miner in the global variable `block.coinbase`. We will mint a token reward to this address whenever someone calls the function `mintMinerReward()` on our token. The mechanism may sound silly, but you never know what kind of dynamic this might result in, and it's worth analyzing and experimenting with! [source,solidity] ---- diff --git a/docs/modules/ROOT/pages/releases-stability.adoc b/docs/modules/ROOT/pages/releases-stability.adoc index 65b127fc5..9a3310377 100644 --- a/docs/modules/ROOT/pages/releases-stability.adoc +++ b/docs/modules/ROOT/pages/releases-stability.adoc @@ -19,7 +19,7 @@ Before every release, we publish a feature-frozen release candidate. The purpose [[major-releases]] === Major Releases -After several months or a year a new major release may come out. These are not scheduled, but will be based on the need to release breaking changes such as a redesign of a core feature of the library (e.g. https://github.com/OpenZeppelin/openzeppelin-contracts/pulls/2112[access control] in 3.0). Since we value stability, we aim for these to happen infrequently (expect no less than six months between majors). However, we may be forced to release one when there are big changes to the Solidity language. +After several months or a year, a new major release may come out. These are not scheduled, but will be based on the need to release breaking changes such as a redesign of a core feature of the library (e.g. https://github.com/OpenZeppelin/openzeppelin-contracts/pulls/2112[access control] in 3.0). Since we value stability, we aim for these to happen infrequently (expect no less than six months between majors). However, we may be forced to release one when there are big changes to the Solidity language. [[api-stability]] == API Stability @@ -38,7 +38,7 @@ We follow https://semver.org/[SemVer], which means API breakage may occur betwee While the internal implementation of functions may change, their semantics and signature will remain the same. The domain of their arguments will not be less restrictive (e.g. if transferring a value of 0 is disallowed, it will remain disallowed), nor will general state restrictions be lifted (e.g. `whenPaused` modifiers). -If new functions are added to a contract, it will be in a backwards-compatible way: their usage won't be mandatory, and they won't extend functionality in ways that may foreseeable break an application (e.g. https://github.com/OpenZeppelin/openzeppelin-contracts/issues/1512[an `internal` method may be added to make it easier to retrieve information that was already available]). +If new functions are added to a contract, it will be in a backwards-compatible way: their usage won't be mandatory, and they won't extend functionality in ways that may foreseeably break an application (e.g. https://github.com/OpenZeppelin/openzeppelin-contracts/issues/1512[an `internal` method may be added to make it easier to retrieve information that was already available]). [[internal]] ==== `internal` diff --git a/docs/modules/ROOT/pages/utilities.adoc b/docs/modules/ROOT/pages/utilities.adoc index 33fcaf0dd..4231a6a74 100644 --- a/docs/modules/ROOT/pages/utilities.adoc +++ b/docs/modules/ROOT/pages/utilities.adoc @@ -107,9 +107,9 @@ Want to keep track of some numbers that increment by 1 every time you want anoth xref:api:utils.adoc#Base64[`Base64`] util allows you to transform `bytes32` data into its Base64 `string` representation. -This is specially useful to build URL-safe tokenURIs for both xref:api:token/ERC721.adoc#IERC721Metadata-tokenURI-uint256-[`ERC721`] or xref:api:token/ERC1155.adoc#IERC1155MetadataURI-uri-uint256-[`ERC1155`]. This library provides a clever way to serve URL-safe https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs/[Data URI] compliant strings to serve on-chain data structures. +This is especially useful for building URL-safe tokenURIs for both xref:api:token/ERC721.adoc#IERC721Metadata-tokenURI-uint256-[`ERC721`] or xref:api:token/ERC1155.adoc#IERC1155MetadataURI-uri-uint256-[`ERC1155`]. This library provides a clever way to serve URL-safe https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs/[Data URI] compliant strings to serve on-chain data structures. -Consider this is an example to send JSON Metadata through a Base64 Data URI using an ERC721: +Here is an example to send JSON Metadata through a Base64 Data URI using an ERC721: [source, solidity] ---- From 7201e6707f6631d9499a569f492870ebdd4133cf Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Mon, 3 Oct 2022 16:06:44 +0800 Subject: [PATCH 045/197] Fix typo in a comment (#3747) --- test/utils/math/Math.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils/math/Math.t.sol b/test/utils/math/Math.t.sol index fa682149f..c1c6f447d 100644 --- a/test/utils/math/Math.t.sol +++ b/test/utils/math/Math.t.sol @@ -154,7 +154,7 @@ contract MathTest is Test { // Full precision for q * d (uint256 qdHi, uint256 qdLo) = _mulHighLow(q, d); - // Add reminder of x * y / d (computed as rem = (x * y % d)) + // Add remainder of x * y / d (computed as rem = (x * y % d)) (uint256 qdRemLo, uint256 c) = _addCarry(qdLo, _mulmod(x, y, d)); uint256 qdRemHi = qdHi + c; From 9a11de924d14ccc5b704d76a99f13d49e1c4ae7a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 16:24:21 -0300 Subject: [PATCH 046/197] Update crytic/slither-action action to v0.2.0 (#3751) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 780935493..4e92c1043 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,7 +76,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup - - uses: crytic/slither-action@v0.1.1 + - uses: crytic/slither-action@v0.2.0 codespell: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' From b7aff6363f3f8c4505d77d337b3e1262464025f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Oct 2022 16:26:04 -0300 Subject: [PATCH 047/197] Update lockfile (#3746) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 1197 +++++++++++++++++++++------------------------ 1 file changed, 555 insertions(+), 642 deletions(-) diff --git a/package-lock.json b/package-lock.json index f133d1de9..05010fa86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,9 +59,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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==", "dev": true, "engines": { "node": ">=6.9.0" @@ -210,9 +210,9 @@ } }, "node_modules/@ensdomains/ensjs/node_modules/ethers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", - "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.1.tgz", + "integrity": "sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q==", "dev": true, "funding": [ { @@ -240,10 +240,10 @@ "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.0", + "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.0", + "@ethersproject/providers": "5.7.1", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", @@ -253,7 +253,7 @@ "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.0", + "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } }, @@ -665,9 +665,9 @@ ] }, "node_modules/@ethersproject/networks": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", - "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, "funding": [ { @@ -723,9 +723,9 @@ } }, "node_modules/@ethersproject/providers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", - "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.1.tgz", + "integrity": "sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ==", "dev": true, "funding": [ { @@ -999,9 +999,9 @@ } }, "node_modules/@ethersproject/web": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", - "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, "funding": [ { @@ -3381,9 +3381,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, "node_modules/@types/pbkdf2": { @@ -4065,18 +4065,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -5384,37 +5372,19 @@ } }, "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "dependencies": { "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "4" }, "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, - "node_modules/detect-port/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/detect-port/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/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -5579,9 +5549,9 @@ } }, "node_modules/emoji-regex": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", - "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "node_modules/encodeurl": { @@ -5654,22 +5624,22 @@ } }, "node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -5679,6 +5649,7 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -7305,42 +7276,12 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/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/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -7356,15 +7297,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -7519,6 +7451,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/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/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -7561,9 +7526,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "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": [ { @@ -8160,23 +8125,23 @@ } }, "node_modules/hardhat": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", - "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.2.tgz", + "integrity": "sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", - "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", - "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -8250,9 +8215,9 @@ } }, "node_modules/hardhat-ignore-warnings": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", - "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.4.tgz", + "integrity": "sha512-VNp02DboptFNi2oGboMl+rR2WH3t8yfwm3DWWzVUpgX7wl8o6LScLOATsN7t5+aquYXcpN1h7QJvD0R9EnABXg==", "dev": true, "dependencies": { "minimatch": "^5.1.0", @@ -8759,15 +8724,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", @@ -9206,9 +9162,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "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, "engines": { "node": ">= 0.4" @@ -9584,6 +9540,18 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -10315,15 +10283,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "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": { - "balanced-match": "^1.0.0" - } - }, "node_modules/mocha/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -10366,16 +10325,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10436,6 +10385,15 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/minimatch/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": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10531,15 +10489,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -10967,6 +10916,18 @@ "http-https": "^1.0.0" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12193,6 +12154,20 @@ } ] }, + "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": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12397,27 +12372,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", @@ -14344,6 +14298,15 @@ "node": ">=8" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -14903,18 +14866,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -15019,9 +14970,9 @@ } }, "node_modules/uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.2.tgz", + "integrity": "sha512-bbxglRjsGQMchfvXZNusUcYgiB9Hx2K4AHYXQy2DITZ9Rd+JzhX7+hoocE5Winr7z2oHvPsekkBwXtigvxevXg==", "dev": true, "optional": true, "bin": { @@ -15053,9 +15004,9 @@ } }, "node_modules/underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "node_modules/undici": { @@ -15230,28 +15181,28 @@ } }, "node_modules/web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.0.tgz", + "integrity": "sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" + "web3-bzz": "1.8.0", + "web3-core": "1.8.0", + "web3-eth": "1.8.0", + "web3-eth-personal": "1.8.0", + "web3-net": "1.8.0", + "web3-shh": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.0.tgz", + "integrity": "sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15270,56 +15221,56 @@ "dev": true }, "node_modules/web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.0.tgz", + "integrity": "sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-requestmanager": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz", + "integrity": "sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw==", "dev": true, "dependencies": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" + "web3-eth-iban": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.0.tgz", + "integrity": "sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA==", "dev": true, "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz", + "integrity": "sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ==", "dev": true, "dependencies": { "eventemitter3": "4.0.4" @@ -15329,29 +15280,29 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz", + "integrity": "sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg==", "dev": true, "dependencies": { "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-providers-http": "1.8.0", + "web3-providers-ipc": "1.8.0", + "web3-providers-ws": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz", + "integrity": "sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" }, "engines": { "node": ">=8.0.0" @@ -15373,45 +15324,45 @@ } }, "node_modules/web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.0.tgz", + "integrity": "sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw==", "dev": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-eth-accounts": "1.8.0", + "web3-eth-contract": "1.8.0", + "web3-eth-ens": "1.8.0", + "web3-eth-iban": "1.8.0", + "web3-eth-personal": "1.8.0", + "web3-net": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz", + "integrity": "sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz", + "integrity": "sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw==", "dev": true, "dependencies": { "@ethereumjs/common": "^2.5.0", @@ -15421,10 +15372,10 @@ "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" @@ -15452,51 +15403,51 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz", + "integrity": "sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz", + "integrity": "sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA==", "dev": true, "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-eth-contract": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz", + "integrity": "sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg==", "dev": true, "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" @@ -15509,17 +15460,17 @@ "dev": true }, "node_modules/web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz", + "integrity": "sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A==", "dev": true, "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-net": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" @@ -15532,55 +15483,55 @@ "dev": true }, "node_modules/web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.0.tgz", + "integrity": "sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw==", "dev": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-method": "1.8.0", + "web3-utils": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.0.tgz", + "integrity": "sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw==", "dev": true, "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz", + "integrity": "sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg==", "dev": true, "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz", + "integrity": "sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", + "web3-core-helpers": "1.8.0", "websocket": "^1.0.32" }, "engines": { @@ -15588,25 +15539,25 @@ } }, "node_modules/web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.0.tgz", + "integrity": "sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "web3-core": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-net": "1.8.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.0.tgz", + "integrity": "sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ==", "dev": true, "dependencies": { "bn.js": "^5.2.1", @@ -16104,9 +16055,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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==", "dev": true }, "@babel/highlight": { @@ -16232,9 +16183,9 @@ }, "dependencies": { "ethers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", - "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.1.tgz", + "integrity": "sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q==", "dev": true, "requires": { "@ethersproject/abi": "5.7.0", @@ -16252,10 +16203,10 @@ "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.0", + "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.0", + "@ethersproject/providers": "5.7.1", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", @@ -16265,7 +16216,7 @@ "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.0", + "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } } @@ -16529,9 +16480,9 @@ "dev": true }, "@ethersproject/networks": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", - "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" @@ -16557,9 +16508,9 @@ } }, "@ethersproject/providers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", - "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.1.tgz", + "integrity": "sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ==", "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", @@ -16723,9 +16674,9 @@ } }, "@ethersproject/web": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", - "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", @@ -18630,9 +18581,9 @@ "dev": true }, "@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", "dev": true }, "@types/pbkdf2": { @@ -19161,15 +19112,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -20239,30 +20181,13 @@ "dev": true }, "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "requires": { "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "debug": "4" } }, "diff": { @@ -20399,9 +20324,9 @@ } }, "emoji-regex": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", - "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "encodeurl": { @@ -20458,22 +20383,22 @@ } }, "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -20483,6 +20408,7 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -21804,36 +21730,12 @@ "ms": "2.0.0" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -21842,12 +21744,6 @@ "requires": { "side-channel": "^1.0.4" } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true } } }, @@ -21981,6 +21877,38 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -22014,9 +21942,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { @@ -22470,23 +22398,23 @@ } }, "hardhat": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", - "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.2.tgz", + "integrity": "sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", - "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", - "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", "@nomicfoundation/solidity-analyzer": "^0.0.3", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -22755,9 +22683,9 @@ } }, "hardhat-ignore-warnings": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", - "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.4.tgz", + "integrity": "sha512-VNp02DboptFNi2oGboMl+rR2WH3t8yfwm3DWWzVUpgX7wl8o6LScLOATsN7t5+aquYXcpN1h7QJvD0R9EnABXg==", "dev": true, "requires": { "minimatch": "^5.1.0", @@ -22943,14 +22871,6 @@ "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } } }, "http-https": { @@ -23276,9 +23196,9 @@ "dev": true }, "is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "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 }, "is-core-module": { @@ -23557,6 +23477,15 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -24130,15 +24059,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -24169,16 +24089,6 @@ "path-is-absolute": "^1.0.0" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -24221,6 +24131,17 @@ "dev": true, "requires": { "brace-expansion": "^2.0.1" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + } } }, "ms": { @@ -24289,14 +24210,6 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } } } } @@ -24641,6 +24554,15 @@ "http-https": "^1.0.0" } }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -25550,6 +25472,17 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -25721,21 +25654,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true } } }, @@ -27216,6 +27134,12 @@ } } }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -27661,17 +27585,6 @@ "json5": "^1.0.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "tslib": { @@ -27760,9 +27673,9 @@ } }, "uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.2.tgz", + "integrity": "sha512-bbxglRjsGQMchfvXZNusUcYgiB9Hx2K4AHYXQy2DITZ9Rd+JzhX7+hoocE5Winr7z2oHvPsekkBwXtigvxevXg==", "dev": true, "optional": true }, @@ -27785,9 +27698,9 @@ } }, "underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "undici": { @@ -27934,24 +27847,24 @@ } }, "web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.0.tgz", + "integrity": "sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA==", "dev": true, "requires": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" + "web3-bzz": "1.8.0", + "web3-core": "1.8.0", + "web3-eth": "1.8.0", + "web3-eth-personal": "1.8.0", + "web3-net": "1.8.0", + "web3-shh": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.0.tgz", + "integrity": "sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -27968,18 +27881,18 @@ } }, "web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.0.tgz", + "integrity": "sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-requestmanager": "1.8.0", + "web3-utils": "1.8.0" }, "dependencies": { "@types/node": { @@ -27997,94 +27910,94 @@ } }, "web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz", + "integrity": "sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw==", "dev": true, "requires": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" + "web3-eth-iban": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.0.tgz", + "integrity": "sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz", + "integrity": "sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ==", "dev": true, "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz", + "integrity": "sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg==", "dev": true, "requires": { "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" + "web3-core-helpers": "1.8.0", + "web3-providers-http": "1.8.0", + "web3-providers-ipc": "1.8.0", + "web3-providers-ws": "1.8.0" } }, "web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz", + "integrity": "sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" } }, "web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.0.tgz", + "integrity": "sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-eth-accounts": "1.8.0", + "web3-eth-contract": "1.8.0", + "web3-eth-ens": "1.8.0", + "web3-eth-iban": "1.8.0", + "web3-eth-personal": "1.8.0", + "web3-net": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz", + "integrity": "sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" + "web3-utils": "1.8.0" } }, "web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz", + "integrity": "sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw==", "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", @@ -28094,10 +28007,10 @@ "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-utils": "1.8.0" }, "dependencies": { "eth-lib": { @@ -28120,45 +28033,45 @@ } }, "web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz", + "integrity": "sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz", + "integrity": "sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA==", "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-promievent": "1.8.0", + "web3-eth-abi": "1.8.0", + "web3-eth-contract": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz", + "integrity": "sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg==", "dev": true, "requires": { "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "web3-utils": "1.8.0" }, "dependencies": { "bn.js": { @@ -28170,17 +28083,17 @@ } }, "web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz", + "integrity": "sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A==", "dev": true, "requires": { "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-helpers": "1.8.0", + "web3-core-method": "1.8.0", + "web3-net": "1.8.0", + "web3-utils": "1.8.0" }, "dependencies": { "@types/node": { @@ -28192,65 +28105,65 @@ } }, "web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.0.tgz", + "integrity": "sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.0", + "web3-core-method": "1.8.0", + "web3-utils": "1.8.0" } }, "web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.0.tgz", + "integrity": "sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw==", "dev": true, "requires": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" } }, "web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz", + "integrity": "sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg==", "dev": true, "requires": { "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.0" } }, "web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz", + "integrity": "sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", + "web3-core-helpers": "1.8.0", "websocket": "^1.0.32" } }, "web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.0.tgz", + "integrity": "sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "web3-core": "1.8.0", + "web3-core-method": "1.8.0", + "web3-core-subscriptions": "1.8.0", + "web3-net": "1.8.0" } }, "web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.0.tgz", + "integrity": "sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ==", "dev": true, "requires": { "bn.js": "^5.2.1", From 34e5863cd51149a592275dc79bc50b10082b2233 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Wed, 5 Oct 2022 21:19:28 +0100 Subject: [PATCH 048/197] Reduce gas in `log256` (#3745) --- CHANGELOG.md | 1 + contracts/utils/math/Math.sol | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b8f0e56d..6b4a0b063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ * `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679)) * `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670)) * Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692)) + * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) ### Breaking changes diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index e7bb33404..a521a9d06 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -339,7 +339,7 @@ library Math { function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); - return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); + return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } From 47003aebec12314a7d409b685c40acb1e3c02c59 Mon Sep 17 00:00:00 2001 From: robriks <80549215+robriks@users.noreply.github.com> Date: Wed, 5 Oct 2022 16:47:39 -0400 Subject: [PATCH 049/197] typo fix (#3752) --- contracts/governance/Governor.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 101138821..92e1ab440 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -22,7 +22,7 @@ import "./IGovernor.sol"; * * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote} * - A voting module must implement {_getVotes} - * - Additionanly, the {votingPeriod} must also be implemented + * - Additionally, the {votingPeriod} must also be implemented * * _Available since v4.3._ */ From 8d908fe2c20503b05f888dd9f702e3fa6fa65840 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 6 Oct 2022 19:12:29 -0300 Subject: [PATCH 050/197] Update merkle multiproof docs with a caution note --- contracts/utils/cryptography/MerkleProof.sol | 21 +++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 19b250020..4ba12ab70 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -75,9 +75,11 @@ library MerkleProof { } /** - * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by + * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. + * * _Available since v4.7._ */ function multiProofVerify( @@ -92,6 +94,8 @@ library MerkleProof { /** * @dev Calldata version of {multiProofVerify} * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. + * * _Available since v4.7._ */ function multiProofVerifyCalldata( @@ -104,9 +108,14 @@ library MerkleProof { } /** - * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, - * consuming from one or the other at each step according to the instructions given by - * `proofFlags`. + * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction + * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another + * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false + * respectively. + * + * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree + * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the + * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ @@ -152,7 +161,9 @@ library MerkleProof { } /** - * @dev Calldata version of {processMultiProof} + * @dev Calldata version of {processMultiProof}. + * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ From 4e18cdc186c96d7f7f5dc973362f882e9fe007ad Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 6 Oct 2022 19:12:29 -0300 Subject: [PATCH 051/197] Update merkle multiproof docs with a caution note (cherry picked from commit 8d908fe2c20503b05f888dd9f702e3fa6fa65840) --- contracts/utils/cryptography/MerkleProof.sol | 21 +++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 19b250020..4ba12ab70 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -75,9 +75,11 @@ library MerkleProof { } /** - * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by + * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. + * * _Available since v4.7._ */ function multiProofVerify( @@ -92,6 +94,8 @@ library MerkleProof { /** * @dev Calldata version of {multiProofVerify} * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. + * * _Available since v4.7._ */ function multiProofVerifyCalldata( @@ -104,9 +108,14 @@ library MerkleProof { } /** - * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, - * consuming from one or the other at each step according to the instructions given by - * `proofFlags`. + * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction + * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another + * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false + * respectively. + * + * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree + * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the + * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ @@ -152,7 +161,9 @@ library MerkleProof { } /** - * @dev Calldata version of {processMultiProof} + * @dev Calldata version of {processMultiProof}. + * + * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ From c463b8a67e88852a1111d760fdc6ed1e1950ae81 Mon Sep 17 00:00:00 2001 From: robriks <80549215+robriks@users.noreply.github.com> Date: Mon, 17 Oct 2022 08:42:18 -0400 Subject: [PATCH 052/197] Fix typo in comment (#3765) --- contracts/governance/TimelockController.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index d5b18ace6..b091f793c 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -164,7 +164,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver } /** - * @dev Returns the timestamp at with an operation becomes ready (0 for + * @dev Returns the timestamp at which an operation becomes ready (0 for * unset operations, 1 for done operations). */ function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) { From eb03304b70129242b00e746959e9214ef7643b5b Mon Sep 17 00:00:00 2001 From: zhiqiangxu <652732310@qq.com> Date: Mon, 17 Oct 2022 20:43:45 +0800 Subject: [PATCH 053/197] Add ReentrancyGuard status getter (#3714) Co-authored-by: Francisco Giordano Co-authored-by: Hadrien Croubois --- CHANGELOG.md | 4 ++++ contracts/mocks/ReentrancyMock.sol | 8 ++++++++ contracts/security/ReentrancyGuard.sol | 8 ++++++++ test/security/ReentrancyGuard.test.js | 8 ++++++++ 4 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b4a0b063..c98ce623b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + + * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) + ## Unreleased * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) diff --git a/contracts/mocks/ReentrancyMock.sol b/contracts/mocks/ReentrancyMock.sol index 43425dd6e..161e1d3d8 100644 --- a/contracts/mocks/ReentrancyMock.sol +++ b/contracts/mocks/ReentrancyMock.sol @@ -40,4 +40,12 @@ contract ReentrancyMock is ReentrancyGuard { function _count() private { counter += 1; } + + function guardedCheckEntered() public nonReentrant { + require(_reentrancyGuardEntered()); + } + + function unguardedCheckNotEntered() public view { + require(!_reentrancyGuardEntered()); + } } diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index 3108ac9f4..24ba5407b 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -66,4 +66,12 @@ abstract contract ReentrancyGuard { // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } + + /** + * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a + * `nonReentrant` function in the call stack. + */ + function _reentrancyGuardEntered() internal view returns (bool) { + return _status == _ENTERED; + } } diff --git a/test/security/ReentrancyGuard.test.js b/test/security/ReentrancyGuard.test.js index c0116d549..c7f7d4697 100644 --- a/test/security/ReentrancyGuard.test.js +++ b/test/security/ReentrancyGuard.test.js @@ -23,6 +23,14 @@ contract('ReentrancyGuard', function (accounts) { this.reentrancyMock.countAndCall(attacker.address), 'ReentrancyAttack: failed call'); }); + it('_reentrancyGuardEntered should be true when guarded', async function () { + await this.reentrancyMock.guardedCheckEntered(); + }); + + it('_reentrancyGuardEntered should be false when unguarded', async function () { + await this.reentrancyMock.unguardedCheckNotEntered(); + }); + // The following are more side-effects than intended behavior: // I put them here as documentation, and to monitor any changes // in the side-effects. From 02722fcc03110bcb10c5eca6298ac9843640c2c2 Mon Sep 17 00:00:00 2001 From: z0r0z <92001561+z0r0z@users.noreply.github.com> Date: Tue, 18 Oct 2022 00:00:47 +0900 Subject: [PATCH 054/197] Use unchecked in ERC20Votes and fix typo (#3748) Co-authored-by: Francisco Giordano Co-authored-by: Hadrien Croubois --- CHANGELOG.md | 1 + .../token/ERC20/extensions/ERC20Votes.sol | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c98ce623b..3b5b96c6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) + * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) ## Unreleased diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index da16cbada..581d4f0f3 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -63,7 +63,9 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { */ function getVotes(address account) public view virtual override returns (uint256) { uint256 pos = _checkpoints[account].length; - return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; + unchecked { + return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; + } } /** @@ -80,7 +82,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { /** * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. - * It is but NOT the sum of all the delegated votes! + * It is NOT the sum of all the delegated votes! * * Requirements: * @@ -130,7 +132,9 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { } } - return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes; + unchecked { + return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes; + } } /** @@ -243,15 +247,19 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; - Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1); + unchecked { + Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1); - oldWeight = oldCkpt.votes; - newWeight = op(oldWeight, delta); + oldWeight = oldCkpt.votes; + newWeight = op(oldWeight, delta); - if (pos > 0 && oldCkpt.fromBlock == block.number) { - _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight); - } else { - ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); + if (pos > 0 && oldCkpt.fromBlock == block.number) { + _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight); + } else { + ckpts.push( + Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}) + ); + } } } From 08d5e4a9b0e79415d346588884955f86ea3f97a6 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 17 Oct 2022 10:09:23 -0500 Subject: [PATCH 055/197] Refactor consecutive transfer hooks (#3753) --- CHANGELOG.md | 13 ++- ...1ConsecutiveEnumerableMock.unreachable.sol | 19 ++--- contracts/mocks/ERC721ConsecutiveMock.sol | 28 ++----- contracts/token/ERC721/ERC721.sol | 81 ++++++++----------- .../ERC721/extensions/ERC721Consecutive.sol | 16 ++-- .../ERC721/extensions/ERC721Enumerable.sol | 53 +++--------- .../ERC721/extensions/ERC721Pausable.sol | 16 +--- .../token/ERC721/extensions/ERC721Votes.sol | 24 ++---- .../ERC721PresetMinterPauserAutoId.sol | 14 +--- 9 files changed, 87 insertions(+), 177 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b5b96c6d..f3093bf90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,17 @@ ### Breaking changes + * `ERC721`: In order to add support for batch minting via `ERC721Consecutive` it was necessary to make a minor breaking change in the internal interface of `ERC721`. Namely, the hooks `_beforeTokenTransfer` and `_afterTokenTransfer` have one additional argument that may need to be added to overrides: + +```diff + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId, ++ uint256 batchSize + ) internal virtual override +``` + * `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. * `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. @@ -68,7 +79,7 @@ ERC-721 integrators that interpret contract state from events should make sure that they implement the clearing of approval that is implicit in every transfer according to the EIP. Previous versions of OpenZeppelin Contracts emitted an explicit `Approval` event even though it was not required by the specification, and this is no longer the case. -With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The new internal functions that should be considered are `_ownerOf`, `_beforeConsecutiveTokenTransfer`, and `_afterConsecutiveTokenTransfer`, and the existing internal functions that should be reviewed are `_exists`, `_beforeTokenTransfer`, and `_afterTokenTransfer`. +With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The internal functions that should be considered are `_ownerOf` (new), `_beforeTokenTransfer`, and `_afterTokenTransfer`. ## 4.7.3 diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol index 791bf3f93..cde3bd86c 100644 --- a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol +++ b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol @@ -38,25 +38,18 @@ contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } } diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index b88bef578..add5ab160 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -63,35 +63,19 @@ contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausa function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Pausable) { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Votes, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Pausable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); - } - - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Votes) { - super._afterConsecutiveTokenTransfer(from, to, first, size); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } } diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 0facc3dbd..3e21bfd9e 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -287,7 +287,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); - _beforeTokenTransfer(address(0), to, tokenId); + _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); @@ -304,7 +304,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(address(0), to, tokenId); - _afterTokenTransfer(address(0), to, tokenId); + _afterTokenTransfer(address(0), to, tokenId, 1); } /** @@ -321,7 +321,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); - _beforeTokenTransfer(owner, address(0), tokenId); + _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); @@ -338,7 +338,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(owner, address(0), tokenId); - _afterTokenTransfer(owner, address(0), tokenId); + _afterTokenTransfer(owner, address(0), tokenId, 1); } /** @@ -360,7 +360,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); - _beforeTokenTransfer(from, to, tokenId); + _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); @@ -381,7 +381,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(from, to, tokenId); - _afterTokenTransfer(from, to, tokenId); + _afterTokenTransfer(from, to, tokenId, 1); } /** @@ -451,70 +451,53 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { } /** - * @dev Hook that is called before any (single) token transfer. This includes minting and burning. - * See {_beforeConsecutiveTokenTransfer}. + * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. + * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. + * - When `from` is zero, the tokens will be minted for `to`. + * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, - uint256 tokenId - ) internal virtual {} + uint256, /* firstTokenId */ + uint256 batchSize + ) internal virtual { + if (batchSize > 1) { + if (from != address(0)) { + _balances[from] -= batchSize; + } + if (to != address(0)) { + _balances[to] += batchSize; + } + } + } /** - * @dev Hook that is called after any (single) transfer of tokens. This includes minting and burning. - * See {_afterConsecutiveTokenTransfer}. + * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * - * - when `from` and `to` are both non-zero. + * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. + * - When `from` is zero, the tokens were minted for `to`. + * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, - uint256 tokenId - ) internal virtual {} - - /** - * @dev Hook that is called before "consecutive token transfers" as defined in ERC2309 and implemented in - * {ERC721Consecutive}. - * Calling conditions are similar to {_beforeTokenTransfer}. - */ - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256, /*first*/ - uint96 size - ) internal virtual { - if (from != address(0)) { - _balances[from] -= size; - } - if (to != address(0)) { - _balances[to] += size; - } - } - - /** - * @dev Hook that is called after "consecutive token transfers" as defined in ERC2309 and implemented in - * {ERC721Consecutive}. - * Calling conditions are similar to {_afterTokenTransfer}. - */ - function _afterConsecutiveTokenTransfer( - address, /*from*/ - address, /*to*/ - uint256, /*first*/ - uint96 /*size*/ + uint256 firstTokenId, + uint256 batchSize ) internal virtual {} } diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 34abf18c8..3a099a4df 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -90,7 +90,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { require(batchSize <= _maxBatchSize(), "ERC721Consecutive: batch too large"); // hook before - _beforeConsecutiveTokenTransfer(address(0), to, first, batchSize); + _beforeTokenTransfer(address(0), to, first, batchSize); // push an ownership checkpoint & emit event uint96 last = first + batchSize - 1; @@ -98,7 +98,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { emit ConsecutiveTransfer(first, last, address(0), to); // hook after - _afterConsecutiveTokenTransfer(address(0), to, first, batchSize); + _afterTokenTransfer(address(0), to, first, batchSize); } return first; @@ -121,16 +121,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { if ( to == address(0) && // if we burn - tokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch - !_sequentialBurn.get(tokenId) // and the token was never marked as burnt + firstTokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch + !_sequentialBurn.get(firstTokenId) // and the token was never marked as burnt ) { - _sequentialBurn.set(tokenId); + require(batchSize == 1, "ERC721Consecutive: batch burn not supported"); + _sequentialBurn.set(firstTokenId); } - super._afterTokenTransfer(from, to, tokenId); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } function _totalConsecutiveSupply() private view returns (uint96) { diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 7d879f58b..6f8573cba 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -55,25 +55,22 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { } /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` and 'to' cannot be the zero address at the same time. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + + if (batchSize > 1) { + // Will only trigger during construction. Batch transferring (minting) is not available afterwards. + revert("ERC721Enumerable: consecutive transfers not supported"); + } + + uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); @@ -87,34 +84,6 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { } } - /** - * @dev Hook that is called before any batch token transfer. For now this is limited - * to batch minting by the {ERC721Consecutive} extension. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeConsecutiveTokenTransfer( - address, - address, - uint256, - uint96 size - ) internal virtual override { - // We revert because enumerability is not supported with consecutive batch minting. - // This conditional is only needed to silence spurious warnings about unreachable code. - if (size > 0) { - revert("ERC721Enumerable: consecutive transfers not supported"); - } - } - /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 22163b0f7..28972b63a 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -24,20 +24,10 @@ abstract contract ERC721Pausable is ERC721, Pausable { function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); - - require(!paused(), "ERC721Pausable: token transfer while paused"); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); require(!paused(), "ERC721Pausable: token transfer while paused"); } diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index d19a3173d..44433ca8c 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -17,32 +17,18 @@ import "../../../governance/utils/Votes.sol"; */ abstract contract ERC721Votes is ERC721, Votes { /** - * @dev Adjusts votes when tokens are transferred. + * @dev See {ERC721-_afterTokenTransfer}. Adjusts votes when tokens are transferred. * * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - _transferVotingUnits(from, to, 1); - super._afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Adjusts votes when a batch of tokens is transferred. - * - * Emits a {IVotes-DelegateVotesChanged} event. - */ - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - _transferVotingUnits(from, to, size); - super._afterConsecutiveTokenTransfer(from, to, first, size); + _transferVotingUnits(from, to, batchSize); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } /** diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 65ffef44b..c2ff99d7e 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -119,18 +119,10 @@ contract ERC721PresetMinterPauserAutoId is function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { - super._beforeTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } /** From 3742c16948cd669ceb0d25d298c3dd3874b146fa Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 17 Oct 2022 10:09:23 -0500 Subject: [PATCH 056/197] Refactor consecutive transfer hooks (#3753) (cherry picked from commit 08d5e4a9b0e79415d346588884955f86ea3f97a6) Signed-off-by: Hadrien Croubois --- CHANGELOG.md | 13 ++- ...1ConsecutiveEnumerableMock.unreachable.sol | 19 ++--- contracts/mocks/ERC721ConsecutiveMock.sol | 28 ++----- contracts/token/ERC721/ERC721.sol | 81 ++++++++----------- .../ERC721/extensions/ERC721Consecutive.sol | 16 ++-- .../ERC721/extensions/ERC721Enumerable.sol | 53 +++--------- .../ERC721/extensions/ERC721Pausable.sol | 16 +--- .../token/ERC721/extensions/ERC721Votes.sol | 24 ++---- .../ERC721PresetMinterPauserAutoId.sol | 14 +--- 9 files changed, 87 insertions(+), 177 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ca9cc5c9..b065e8a88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,17 @@ ### Breaking changes + * `ERC721`: In order to add support for batch minting via `ERC721Consecutive` it was necessary to make a minor breaking change in the internal interface of `ERC721`. Namely, the hooks `_beforeTokenTransfer` and `_afterTokenTransfer` have one additional argument that may need to be added to overrides: + +```diff + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId, ++ uint256 batchSize + ) internal virtual override +``` + * `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. * `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. @@ -62,7 +73,7 @@ ERC-721 integrators that interpret contract state from events should make sure that they implement the clearing of approval that is implicit in every transfer according to the EIP. Previous versions of OpenZeppelin Contracts emitted an explicit `Approval` event even though it was not required by the specification, and this is no longer the case. -With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The new internal functions that should be considered are `_ownerOf`, `_beforeConsecutiveTokenTransfer`, and `_afterConsecutiveTokenTransfer`, and the existing internal functions that should be reviewed are `_exists`, `_beforeTokenTransfer`, and `_afterTokenTransfer`. +With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The internal functions that should be considered are `_ownerOf` (new), `_beforeTokenTransfer`, and `_afterTokenTransfer`. ## 4.7.3 diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol index 791bf3f93..cde3bd86c 100644 --- a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol +++ b/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol @@ -38,25 +38,18 @@ contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } } diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/ERC721ConsecutiveMock.sol index b88bef578..add5ab160 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/ERC721ConsecutiveMock.sol @@ -63,35 +63,19 @@ contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausa function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Pausable) { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Votes, ERC721Consecutive) { - super._afterTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Pausable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); - } - - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Votes) { - super._afterConsecutiveTokenTransfer(from, to, first, size); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } } diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 09a825fbc..08e039293 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -287,7 +287,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); - _beforeTokenTransfer(address(0), to, tokenId); + _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); @@ -304,7 +304,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(address(0), to, tokenId); - _afterTokenTransfer(address(0), to, tokenId); + _afterTokenTransfer(address(0), to, tokenId, 1); } /** @@ -321,7 +321,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); - _beforeTokenTransfer(owner, address(0), tokenId); + _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); @@ -338,7 +338,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(owner, address(0), tokenId); - _afterTokenTransfer(owner, address(0), tokenId); + _afterTokenTransfer(owner, address(0), tokenId, 1); } /** @@ -360,7 +360,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); - _beforeTokenTransfer(from, to, tokenId); + _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); @@ -381,7 +381,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { emit Transfer(from, to, tokenId); - _afterTokenTransfer(from, to, tokenId); + _afterTokenTransfer(from, to, tokenId, 1); } /** @@ -451,70 +451,53 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { } /** - * @dev Hook that is called before any (single) token transfer. This includes minting and burning. - * See {_beforeConsecutiveTokenTransfer}. + * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. + * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. + * - When `from` is zero, the tokens will be minted for `to`. + * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, - uint256 tokenId - ) internal virtual {} + uint256, /* firstTokenId */ + uint256 batchSize + ) internal virtual { + if (batchSize > 1) { + if (from != address(0)) { + _balances[from] -= batchSize; + } + if (to != address(0)) { + _balances[to] += batchSize; + } + } + } /** - * @dev Hook that is called after any (single) transfer of tokens. This includes minting and burning. - * See {_afterConsecutiveTokenTransfer}. + * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is + * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * - * - when `from` and `to` are both non-zero. + * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. + * - When `from` is zero, the tokens were minted for `to`. + * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. + * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, - uint256 tokenId - ) internal virtual {} - - /** - * @dev Hook that is called before "consecutive token transfers" as defined in ERC2309 and implemented in - * {ERC721Consecutive}. - * Calling conditions are similar to {_beforeTokenTransfer}. - */ - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256, /*first*/ - uint96 size - ) internal virtual { - if (from != address(0)) { - _balances[from] -= size; - } - if (to != address(0)) { - _balances[to] += size; - } - } - - /** - * @dev Hook that is called after "consecutive token transfers" as defined in ERC2309 and implemented in - * {ERC721Consecutive}. - * Calling conditions are similar to {_afterTokenTransfer}. - */ - function _afterConsecutiveTokenTransfer( - address, /*from*/ - address, /*to*/ - uint256, /*first*/ - uint96 /*size*/ + uint256 firstTokenId, + uint256 batchSize ) internal virtual {} } diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index f039ac2d6..59cfd563b 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -91,7 +91,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { require(batchSize <= _maxBatchSize(), "ERC721Consecutive: batch too large"); // hook before - _beforeConsecutiveTokenTransfer(address(0), to, first, batchSize); + _beforeTokenTransfer(address(0), to, first, batchSize); // push an ownership checkpoint & emit event uint96 last = first + batchSize - 1; @@ -99,7 +99,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { emit ConsecutiveTransfer(first, last, address(0), to); // hook after - _afterConsecutiveTokenTransfer(address(0), to, first, batchSize); + _afterTokenTransfer(address(0), to, first, batchSize); } return first; @@ -122,16 +122,18 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { if ( to == address(0) && // if we burn - tokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch - !_sequentialBurn.get(tokenId) // and the token was never marked as burnt + firstTokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch + !_sequentialBurn.get(firstTokenId) // and the token was never marked as burnt ) { - _sequentialBurn.set(tokenId); + require(batchSize == 1, "ERC721Consecutive: batch burn not supported"); + _sequentialBurn.set(firstTokenId); } - super._afterTokenTransfer(from, to, tokenId); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } function _totalConsecutiveSupply() private view returns (uint96) { diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 54aaffbc8..2ffdcb320 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -55,25 +55,22 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { } /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` and 'to' cannot be the zero address at the same time. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); + + if (batchSize > 1) { + // Will only trigger during construction. Batch transferring (minting) is not available afterwards. + revert("ERC721Enumerable: consecutive transfers not supported"); + } + + uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); @@ -87,34 +84,6 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { } } - /** - * @dev Hook that is called before any batch token transfer. For now this is limited - * to batch minting by the {ERC721Consecutive} extension. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeConsecutiveTokenTransfer( - address, - address, - uint256, - uint96 size - ) internal virtual override { - // We revert because enumerability is not supported with consecutive batch minting. - // This conditional is only needed to silence spurious warnings about unreachable code. - if (size > 0) { - revert("ERC721Enumerable: consecutive transfers not supported"); - } - } - /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index d5b27625b..914188176 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -24,20 +24,10 @@ abstract contract ERC721Pausable is ERC721, Pausable { function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); - - require(!paused(), "ERC721Pausable: token transfer while paused"); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); require(!paused(), "ERC721Pausable: token transfer while paused"); } diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index 7c81cdf97..06c0c2e85 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -18,32 +18,18 @@ import "../../../governance/utils/Votes.sol"; */ abstract contract ERC721Votes is ERC721, Votes { /** - * @dev Adjusts votes when tokens are transferred. + * @dev See {ERC721-_afterTokenTransfer}. Adjusts votes when tokens are transferred. * * Emits a {IVotes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override { - _transferVotingUnits(from, to, 1); - super._afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Adjusts votes when a batch of tokens is transferred. - * - * Emits a {IVotes-DelegateVotesChanged} event. - */ - function _afterConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override { - _transferVotingUnits(from, to, size); - super._afterConsecutiveTokenTransfer(from, to, first, size); + _transferVotingUnits(from, to, batchSize); + super._afterTokenTransfer(from, to, firstTokenId, batchSize); } /** diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 35ee6c2d6..b016af4d4 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -119,18 +119,10 @@ contract ERC721PresetMinterPauserAutoId is function _beforeTokenTransfer( address from, address to, - uint256 tokenId + uint256 firstTokenId, + uint256 batchSize ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { - super._beforeTokenTransfer(from, to, tokenId); - } - - function _beforeConsecutiveTokenTransfer( - address from, - address to, - uint256 first, - uint96 size - ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { - super._beforeConsecutiveTokenTransfer(from, to, first, size); + super._beforeTokenTransfer(from, to, firstTokenId, batchSize); } /** From a71caa28e76c1d732cfa31ef31284b22712ee4da Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 17 Oct 2022 18:52:38 +0200 Subject: [PATCH 057/197] Skip deleted file when updating release version in comments --- scripts/release/update-comment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/update-comment.js b/scripts/release/update-comment.js index 0767234a8..7baf8c2b4 100755 --- a/scripts/release/update-comment.js +++ b/scripts/release/update-comment.js @@ -22,7 +22,7 @@ const [ tag ] = run('git', 'tag') // Ordering tag → HEAD is important here. const files = run('git', 'diff', tag, 'HEAD', '--name-only', 'contracts/**/*.sol') .split(/\r?\n/) - .filter(file => file && !file.match(/mock/i)); + .filter(file => file && !file.match(/mock/i) && fs.existsSync(file)); for (const file of files) { const current = fs.readFileSync(file, 'utf8'); From 1a41a503e061fdce16fdf009fc06d94191725f9c Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 17 Oct 2022 18:52:38 +0200 Subject: [PATCH 058/197] Skip deleted file when updating release version in comments (cherry picked from commit a71caa28e76c1d732cfa31ef31284b22712ee4da) Signed-off-by: Hadrien Croubois --- scripts/release/update-comment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/update-comment.js b/scripts/release/update-comment.js index 0767234a8..7baf8c2b4 100755 --- a/scripts/release/update-comment.js +++ b/scripts/release/update-comment.js @@ -22,7 +22,7 @@ const [ tag ] = run('git', 'tag') // Ordering tag → HEAD is important here. const files = run('git', 'diff', tag, 'HEAD', '--name-only', 'contracts/**/*.sol') .split(/\r?\n/) - .filter(file => file && !file.match(/mock/i)); + .filter(file => file && !file.match(/mock/i) && fs.existsSync(file)); for (const file of files) { const current = fs.readFileSync(file, 'utf8'); From 1f18fea1de4c69355c773090c40fe083c08947b4 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 17 Oct 2022 18:53:40 +0200 Subject: [PATCH 059/197] 4.8.0-rc.2 --- contracts/access/AccessControl.sol | 2 +- contracts/access/Ownable2Step.sol | 2 +- contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL1.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL2.sol | 2 +- contracts/finance/PaymentSplitter.sol | 2 +- contracts/finance/VestingWallet.sol | 2 +- contracts/governance/Governor.sol | 2 +- contracts/governance/IGovernor.sol | 2 +- contracts/governance/TimelockController.sol | 2 +- .../governance/compatibility/GovernorCompatibilityBravo.sol | 2 +- contracts/governance/extensions/GovernorCountingSimple.sol | 2 +- .../governance/extensions/GovernorVotesQuorumFraction.sol | 2 +- contracts/governance/utils/Votes.sol | 2 +- contracts/interfaces/IERC2309.sol | 2 +- contracts/interfaces/IERC4626.sol | 2 +- contracts/metatx/MinimalForwarder.sol | 2 +- contracts/package.json | 2 +- contracts/proxy/Clones.sol | 2 +- contracts/proxy/utils/Initializable.sol | 2 +- contracts/proxy/utils/UUPSUpgradeable.sol | 2 +- contracts/security/PullPayment.sol | 2 +- contracts/security/ReentrancyGuard.sol | 2 +- contracts/token/ERC1155/ERC1155.sol | 2 +- contracts/token/ERC1155/extensions/ERC1155Burnable.sol | 2 +- contracts/token/ERC20/ERC20.sol | 2 +- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 2 +- contracts/token/ERC20/extensions/ERC20Votes.sol | 2 +- contracts/token/ERC20/extensions/ERC4626.sol | 2 +- contracts/token/ERC20/extensions/draft-ERC20Permit.sol | 2 +- contracts/token/ERC20/utils/SafeERC20.sol | 2 +- contracts/token/ERC721/ERC721.sol | 2 +- contracts/token/ERC721/IERC721.sol | 2 +- contracts/token/ERC721/extensions/ERC721Burnable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Consecutive.sol | 2 +- contracts/token/ERC721/extensions/ERC721Enumerable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Pausable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Royalty.sol | 2 +- contracts/token/ERC721/extensions/ERC721Votes.sol | 2 +- contracts/token/ERC721/extensions/draft-ERC721Votes.sol | 2 +- .../token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol | 2 +- contracts/token/ERC777/ERC777.sol | 2 +- contracts/token/ERC777/IERC777.sol | 2 +- contracts/utils/Address.sol | 2 +- contracts/utils/Arrays.sol | 2 +- contracts/utils/Checkpoints.sol | 2 +- contracts/utils/Create2.sol | 2 +- contracts/utils/Strings.sol | 2 +- contracts/utils/cryptography/ECDSA.sol | 2 +- contracts/utils/cryptography/EIP712.sol | 2 +- contracts/utils/cryptography/MerkleProof.sol | 2 +- contracts/utils/cryptography/SignatureChecker.sol | 2 +- contracts/utils/cryptography/draft-EIP712.sol | 2 +- contracts/utils/introspection/ERC165Checker.sol | 2 +- contracts/utils/introspection/IERC1820Registry.sol | 2 +- contracts/utils/math/Math.sol | 2 +- contracts/utils/math/SafeCast.sol | 2 +- contracts/utils/math/SignedMath.sol | 2 +- contracts/utils/structs/BitMaps.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 2 +- contracts/utils/structs/EnumerableSet.sol | 2 +- contracts/vendor/arbitrum/IArbSys.sol | 1 + contracts/vendor/arbitrum/IBridge.sol | 1 + contracts/vendor/arbitrum/IDelayedMessageProvider.sol | 1 + contracts/vendor/arbitrum/IInbox.sol | 1 + contracts/vendor/arbitrum/IOutbox.sol | 1 + package-lock.json | 4 ++-- package.json | 2 +- 68 files changed, 69 insertions(+), 64 deletions(-) diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index afae5c519..bbe6ace15 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (access/AccessControl.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (access/AccessControl.sol) pragma solidity ^0.8.0; diff --git a/contracts/access/Ownable2Step.sol b/contracts/access/Ownable2Step.sol index a2dc8f0e3..57d3ce559 100644 --- a/contracts/access/Ownable2Step.sol +++ b/contracts/access/Ownable2Step.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (access/Ownable2Step.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (access/Ownable2Step.sol) pragma solidity ^0.8.0; diff --git a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol index 5977cbd92..f017ae3e6 100644 --- a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL1.sol b/contracts/crosschain/arbitrum/LibArbitrumL1.sol index 8947f906d..0c52699fb 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL1.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL1.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/LibArbitrumL1.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/LibArbitrumL1.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL2.sol b/contracts/crosschain/arbitrum/LibArbitrumL2.sol index fd80a3357..51352f1fa 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (crosschain/arbitrum/LibArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/LibArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/finance/PaymentSplitter.sol b/contracts/finance/PaymentSplitter.sol index 4cada18c1..2e9d21e6e 100644 --- a/contracts/finance/PaymentSplitter.sol +++ b/contracts/finance/PaymentSplitter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (finance/PaymentSplitter.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol index 324a38b4b..000daabc7 100644 --- a/contracts/finance/VestingWallet.sol +++ b/contracts/finance/VestingWallet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (finance/VestingWallet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (finance/VestingWallet.sol) pragma solidity ^0.8.0; import "../token/ERC20/utils/SafeERC20.sol"; diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 3fcf21b93..b9ea6bd33 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/Governor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/Governor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index efef23957..160b16450 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/IGovernor.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/IGovernor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index f86aef155..43a7f7067 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/TimelockController.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/TimelockController.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 71dd06a8f..234c34ffb 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/compatibility/GovernorCompatibilityBravo.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/compatibility/GovernorCompatibilityBravo.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/governance/extensions/GovernorCountingSimple.sol index 220c276a0..63868ab1f 100644 --- a/contracts/governance/extensions/GovernorCountingSimple.sol +++ b/contracts/governance/extensions/GovernorCountingSimple.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/extensions/GovernorCountingSimple.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/extensions/GovernorCountingSimple.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol index 3e041520c..d88bf3817 100644 --- a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/extensions/GovernorVotesQuorumFraction.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/extensions/GovernorVotesQuorumFraction.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 2ab8ddca0..fcd060a3f 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (governance/utils/Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/utils/Votes.sol) pragma solidity ^0.8.0; import "../../utils/Context.sol"; diff --git a/contracts/interfaces/IERC2309.sol b/contracts/interfaces/IERC2309.sol index 576dd5e19..fe9367e4c 100644 --- a/contracts/interfaces/IERC2309.sol +++ b/contracts/interfaces/IERC2309.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (interfaces/IERC2309.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (interfaces/IERC2309.sol) pragma solidity ^0.8.0; diff --git a/contracts/interfaces/IERC4626.sol b/contracts/interfaces/IERC4626.sol index 923f97c75..3655d293c 100644 --- a/contracts/interfaces/IERC4626.sol +++ b/contracts/interfaces/IERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (interfaces/IERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (interfaces/IERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index ebc7b6054..6adf7f1d8 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (metatx/MinimalForwarder.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (metatx/MinimalForwarder.sol) pragma solidity ^0.8.0; diff --git a/contracts/package.json b/contracts/package.json index 58eda2bcc..03d8519f4 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@openzeppelin/contracts", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.1", + "version": "4.8.0-rc.2", "files": [ "**/*.sol", "/build/contracts/*.json", diff --git a/contracts/proxy/Clones.sol b/contracts/proxy/Clones.sol index 0c31679a1..1657eebb3 100644 --- a/contracts/proxy/Clones.sol +++ b/contracts/proxy/Clones.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/Clones.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/Clones.sol) pragma solidity ^0.8.0; diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 01794bc3e..44f5e46c9 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/utils/Initializable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index 2a7c42659..d116474ba 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/utils/UUPSUpgradeable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/PullPayment.sol b/contracts/security/PullPayment.sol index d45ffb044..7da1fbd5e 100644 --- a/contracts/security/PullPayment.sol +++ b/contracts/security/PullPayment.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (security/PullPayment.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (security/PullPayment.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index 3197d90ed..b494e05c7 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (security/ReentrancyGuard.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index d3b11cafa..99ee813ab 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC1155/ERC1155.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol index d96c3c0c2..e5971e95b 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC1155/extensions/ERC1155Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index 648180d8e..c5910925a 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/ERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index db3ee087a..e69e07e1e 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC20FlashMint.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC20FlashMint.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 944596770..4c3d71d6d 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC20Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 824f2075b..fe47325eb 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/ERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol index 41ff7273b..85eefd3b8 100644 --- a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC20/extensions/draft-ERC20Permit.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index f7f3653dc..aa2dc069c 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 08e039293..3c66ae356 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/ERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 3eb1dee9f..558d96558 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/IERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Burnable.sol b/contracts/token/ERC721/extensions/ERC721Burnable.sol index 6b640ed66..75559a84c 100644 --- a/contracts/token/ERC721/extensions/ERC721Burnable.sol +++ b/contracts/token/ERC721/extensions/ERC721Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 59cfd563b..55051a460 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Consecutive.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Consecutive.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 2ffdcb320..00151f96d 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Enumerable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 914188176..5e9db45ee 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Pausable.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Royalty.sol b/contracts/token/ERC721/extensions/ERC721Royalty.sol index 9addb9c5b..213b60bfb 100644 --- a/contracts/token/ERC721/extensions/ERC721Royalty.sol +++ b/contracts/token/ERC721/extensions/ERC721Royalty.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index 06c0c2e85..44d640424 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/ERC721Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index 1dae9403f..9489b78d1 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/extensions/draft-ERC721Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index b016af4d4..7ce93bbd8 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index 96f2ae4c5..84570cf90 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC777/ERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC777/ERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/IERC777.sol b/contracts/token/ERC777/IERC777.sol index c888a4f10..e695e5ca9 100644 --- a/contracts/token/ERC777/IERC777.sol +++ b/contracts/token/ERC777/IERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (token/ERC777/IERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC777/IERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 2c62434b8..7fc36c58a 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Address.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Address.sol) pragma solidity ^0.8.1; diff --git a/contracts/utils/Arrays.sol b/contracts/utils/Arrays.sol index d57080798..2236f03c1 100644 --- a/contracts/utils/Arrays.sol +++ b/contracts/utils/Arrays.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Arrays.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Arrays.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 7fa8745c8..f2ba2ded0 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Checkpoints.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Checkpoints.sol) // This file was procedurally generated from scripts/generate/templates/Checkpoints.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 460b05c8f..5a2919163 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Create2.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Create2.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index d7baccf24..77668e61e 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/Strings.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Strings.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index eacb91f92..5e101eb9b 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/ECDSA.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index 3260966f4..911c49492 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 4ba12ab70..85ecc5910 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 7bc4f2c43..8cbe97ae3 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/SignatureChecker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/draft-EIP712.sol b/contracts/utils/cryptography/draft-EIP712.sol index 8f2779681..8c548b54c 100644 --- a/contracts/utils/cryptography/draft-EIP712.sol +++ b/contracts/utils/cryptography/draft-EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/cryptography/draft-EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index 37c3664b9..b22022255 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/introspection/ERC165Checker.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/IERC1820Registry.sol b/contracts/utils/introspection/IERC1820Registry.sol index a3cd31da1..4f57a30d2 100644 --- a/contracts/utils/introspection/IERC1820Registry.sol +++ b/contracts/utils/introspection/IERC1820Registry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/introspection/IERC1820Registry.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/introspection/IERC1820Registry.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index d19ed55d1..0ea9e9062 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/Math.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/Math.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SafeCast.sol b/contracts/utils/math/SafeCast.sol index 770c040ac..a6a4a444d 100644 --- a/contracts/utils/math/SafeCast.sol +++ b/contracts/utils/math/SafeCast.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/SafeCast.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SignedMath.sol b/contracts/utils/math/SignedMath.sol index 2b84adde8..e06e6e9b1 100644 --- a/contracts/utils/math/SignedMath.sol +++ b/contracts/utils/math/SignedMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/math/SignedMath.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/BitMaps.sol b/contracts/utils/structs/BitMaps.sol index 5749dcc9f..0b624fe61 100644 --- a/contracts/utils/structs/BitMaps.sol +++ b/contracts/utils/structs/BitMaps.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/BitMaps.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index e1687c9a5..f812eeefb 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/EnumerableMap.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/EnumerableMap.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableMap.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/EnumerableSet.sol b/contracts/utils/structs/EnumerableSet.sol index e2e89497c..a58430842 100644 --- a/contracts/utils/structs/EnumerableSet.sol +++ b/contracts/utils/structs/EnumerableSet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.1) (utils/structs/EnumerableSet.sol) +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; diff --git a/contracts/vendor/arbitrum/IArbSys.sol b/contracts/vendor/arbitrum/IArbSys.sol index eb02432d2..28eb3f1ec 100644 --- a/contracts/vendor/arbitrum/IArbSys.sol +++ b/contracts/vendor/arbitrum/IArbSys.sol @@ -1,6 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IArbSys.sol) pragma solidity >=0.4.21 <0.9.0; diff --git a/contracts/vendor/arbitrum/IBridge.sol b/contracts/vendor/arbitrum/IBridge.sol index 7982fb95b..34968cac6 100644 --- a/contracts/vendor/arbitrum/IBridge.sol +++ b/contracts/vendor/arbitrum/IBridge.sol @@ -1,6 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IBridge.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol index 9e650c872..34ddaeff8 100644 --- a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol +++ b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol @@ -1,6 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IDelayedMessageProvider.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IInbox.sol b/contracts/vendor/arbitrum/IInbox.sol index 4396dc18f..d81220386 100644 --- a/contracts/vendor/arbitrum/IInbox.sol +++ b/contracts/vendor/arbitrum/IInbox.sol @@ -1,6 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IInbox.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IOutbox.sol b/contracts/vendor/arbitrum/IOutbox.sol index 13dd5719d..98374d8f7 100644 --- a/contracts/vendor/arbitrum/IOutbox.sol +++ b/contracts/vendor/arbitrum/IOutbox.sol @@ -1,6 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 +// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IOutbox.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/package-lock.json b/package-lock.json index 8a4fcb181..4e1e70d93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.1", + "version": "4.8.0-rc.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.1", + "version": "4.8.0-rc.2", "license": "MIT", "bin": { "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" diff --git a/package.json b/package.json index 8dc72dd7c..0beaab22f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "openzeppelin-solidity", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.1", + "version": "4.8.0-rc.2", "files": [ "/contracts/**/*.sol", "/build/contracts/*.json", From a1948250ab8c441f6d327a65754cb20d2b1b4554 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 18 Oct 2022 14:13:05 +0200 Subject: [PATCH 060/197] ERC721ConsecutiveEnumerable is no longer unreachable --- ...leMock.unreachable.sol => ERC721ConsecutiveEnumerableMock.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contracts/mocks/{ERC721ConsecutiveEnumerableMock.unreachable.sol => ERC721ConsecutiveEnumerableMock.sol} (100%) diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol similarity index 100% rename from contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol rename to contracts/mocks/ERC721ConsecutiveEnumerableMock.sol From 014ce9c6e6cacfc1f357eb1538ecc6d3ad2bcca3 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 18 Oct 2022 14:13:05 +0200 Subject: [PATCH 061/197] ERC721ConsecutiveEnumerable is no longer unreachable (cherry picked from commit a1948250ab8c441f6d327a65754cb20d2b1b4554) Signed-off-by: Hadrien Croubois --- ...leMock.unreachable.sol => ERC721ConsecutiveEnumerableMock.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contracts/mocks/{ERC721ConsecutiveEnumerableMock.unreachable.sol => ERC721ConsecutiveEnumerableMock.sol} (100%) diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol similarity index 100% rename from contracts/mocks/ERC721ConsecutiveEnumerableMock.unreachable.sol rename to contracts/mocks/ERC721ConsecutiveEnumerableMock.sol From 25fe191202c44c762bc2a933913e21b37200f0e9 Mon Sep 17 00:00:00 2001 From: matthiasgeihs <62935430+matthiasgeihs@users.noreply.github.com> Date: Tue, 25 Oct 2022 03:46:51 +0200 Subject: [PATCH 062/197] Fix comment in ERC721Consecutive (#3778) Co-authored-by: Francisco --- contracts/token/ERC721/extensions/ERC721Consecutive.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 3a099a4df..e8e97aab6 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -73,7 +73,7 @@ abstract contract ERC721Consecutive is IERC2309, ERC721 { * - `batchSize` must not be greater than {_maxBatchSize}. * - The function is called in the constructor of the contract (directly or indirectly). * - * CAUTION: Does not emit a `Transfer` event. This is ERC721 compliant as long as it is done outside of the + * CAUTION: Does not emit a `Transfer` event. This is ERC721 compliant as long as it is done inside of the * constructor, which is enforced by this function. * * CAUTION: Does not invoke `onERC721Received` on the receiver. From f99bc4e0cf908dae100d78e16fe7c55168fdf16a Mon Sep 17 00:00:00 2001 From: robriks <80549215+robriks@users.noreply.github.com> Date: Wed, 26 Oct 2022 11:02:06 -0400 Subject: [PATCH 063/197] grammar fix (#3782) --- contracts/governance/TimelockController.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index b091f793c..c171475e2 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -258,7 +258,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver } /** - * @dev Schedule an operation that is to becomes valid after a given delay. + * @dev Schedule an operation that is to become valid after a given delay. */ function _schedule(bytes32 id, uint256 delay) private { require(!isOperation(id), "TimelockController: operation already scheduled"); From 36951d58386b9fee81b237e6c6626c9115ccef3a Mon Sep 17 00:00:00 2001 From: robriks <80549215+robriks@users.noreply.github.com> Date: Wed, 26 Oct 2022 11:02:57 -0400 Subject: [PATCH 064/197] few typo fixes (#3779) --- .../governance/compatibility/GovernorCompatibilityBravo.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 031d49b11..5b2fe6851 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -9,7 +9,7 @@ import "../Governor.sol"; import "./IGovernorCompatibilityBravo.sol"; /** - * @dev Compatibility layer that implements GovernorBravo compatibility on to of {Governor}. + * @dev Compatibility layer that implements GovernorBravo compatibility on top of {Governor}. * * This compatibility layer includes a voting system and requires a {IGovernorTimelock} compatible module to be added * through inheritance. It does not include token bindings, nor does it include any variable upgrade patterns. @@ -247,7 +247,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp } /** - * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be scritly over the againstVotes. + * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes. */ function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) { ProposalDetails storage details = _proposalDetails[proposalId]; From 8d105825e960501a11cf822e8ee03e42ad12821d Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 1 Nov 2022 15:13:50 -0300 Subject: [PATCH 065/197] Update recommendation of JS library for merkle trees --- contracts/utils/cryptography/MerkleProof.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 4ba12ab70..e15677586 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -6,16 +6,16 @@ pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * - * The proofs can be generated using the JavaScript library - * https://github.com/miguelmota/merkletreejs[merkletreejs]. - * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. - * - * See `test/utils/cryptography/MerkleProof.test.js` for some examples. + * The proofs can be generated using our JavaScript library + * https://github.com/OpenZeppelin/merkle-tree[`@openzeppelin/merkle-tree`]. + * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. + * OpenZeppelin's JavaScript library generates merkle trees that are safe + * against this attack out of the box. */ library MerkleProof { /** From 8bfcb6592457eefc0d61adf2c70660f520639f15 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 1 Nov 2022 15:13:50 -0300 Subject: [PATCH 066/197] Update recommendation of JS library for merkle trees (cherry picked from commit 8d105825e960501a11cf822e8ee03e42ad12821d) --- contracts/utils/cryptography/MerkleProof.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 85ecc5910..c43b7c072 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -6,16 +6,16 @@ pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * - * The proofs can be generated using the JavaScript library - * https://github.com/miguelmota/merkletreejs[merkletreejs]. - * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. - * - * See `test/utils/cryptography/MerkleProof.test.js` for some examples. + * The proofs can be generated using our JavaScript library + * https://github.com/OpenZeppelin/merkle-tree[`@openzeppelin/merkle-tree`]. + * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. + * OpenZeppelin's JavaScript library generates merkle trees that are safe + * against this attack out of the box. */ library MerkleProof { /** From 7d01facdb8fc8f7b9f0584c6d9a655a3c44f23f6 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 1 Nov 2022 15:22:47 -0300 Subject: [PATCH 067/197] Fix MerkleProof natspec --- contracts/utils/cryptography/MerkleProof.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index e15677586..5f0d63e01 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -6,8 +6,8 @@ pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * - * The proofs can be generated using our JavaScript library - * https://github.com/OpenZeppelin/merkle-tree[`@openzeppelin/merkle-tree`]. + * The tree and the proofs can be generated using our + * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to From 16fa1834e576764ed3901bafad6d9fc86661649d Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 1 Nov 2022 15:22:47 -0300 Subject: [PATCH 068/197] Fix MerkleProof natspec (cherry picked from commit 7d01facdb8fc8f7b9f0584c6d9a655a3c44f23f6) --- contracts/utils/cryptography/MerkleProof.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index c43b7c072..7dfe412a6 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -6,8 +6,8 @@ pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * - * The proofs can be generated using our JavaScript library - * https://github.com/OpenZeppelin/merkle-tree[`@openzeppelin/merkle-tree`]. + * The tree and the proofs can be generated using our + * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to From d5ca39e9a264ddcadd5742484b6d391ae1647a10 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 2 Nov 2022 15:46:08 +0100 Subject: [PATCH 069/197] Rename `_isVaultCollateralized` to `_isVaultHealthy` for clarity (#3796) --- contracts/token/ERC20/extensions/ERC4626.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 41ec9d685..6833d43d7 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -75,18 +75,18 @@ abstract contract ERC4626 is ERC20, IERC4626 { } /** @dev See {IERC4626-convertToShares}. */ - function convertToShares(uint256 assets) public view virtual override returns (uint256 shares) { + function convertToShares(uint256 assets) public view virtual override returns (uint256) { return _convertToShares(assets, Math.Rounding.Down); } /** @dev See {IERC4626-convertToAssets}. */ - function convertToAssets(uint256 shares) public view virtual override returns (uint256 assets) { + function convertToAssets(uint256 shares) public view virtual override returns (uint256) { return _convertToAssets(shares, Math.Rounding.Down); } /** @dev See {IERC4626-maxDeposit}. */ function maxDeposit(address) public view virtual override returns (uint256) { - return _isVaultCollateralized() ? type(uint256).max : 0; + return _isVaultHealthy() ? type(uint256).max : 0; } /** @dev See {IERC4626-maxMint}. */ @@ -178,7 +178,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { * Will revert if assets > 0, totalSupply > 0 and totalAssets = 0. That corresponds to a case where any asset * would represent an infinite amount of shares. */ - function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256 shares) { + function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) { uint256 supply = totalSupply(); return (assets == 0 || supply == 0) @@ -201,7 +201,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { /** * @dev Internal conversion function (from shares to assets) with support for rounding direction. */ - function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256 assets) { + function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) { uint256 supply = totalSupply(); return (supply == 0) ? _initialConvertToAssets(shares, rounding) : shares.mulDiv(totalAssets(), supply, rounding); @@ -215,7 +215,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { function _initialConvertToAssets( uint256 shares, Math.Rounding /*rounding*/ - ) internal view virtual returns (uint256 assets) { + ) internal view virtual returns (uint256) { return shares; } @@ -267,7 +267,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { emit Withdraw(caller, receiver, owner, assets, shares); } - function _isVaultCollateralized() private view returns (bool) { + function _isVaultHealthy() private view returns (bool) { return totalAssets() > 0 || totalSupply() == 0; } } From 88a3f957151b5b77cc19575dc987fd28f0fcd486 Mon Sep 17 00:00:00 2001 From: Mathis Gontier Delaunay <74971347+MathisGD@users.noreply.github.com> Date: Fri, 4 Nov 2022 00:57:56 +0100 Subject: [PATCH 070/197] Optimize condition in _disableInitializers (#3787) --- CHANGELOG.md | 1 + contracts/proxy/utils/Initializable.sol | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3093bf90..8c2f9f92b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) + * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) ## Unreleased diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 51d4be7f4..d0110f0fc 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -143,7 +143,7 @@ abstract contract Initializable { */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); - if (_initialized < type(uint8).max) { + if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } From 0b6becd49f1d96b4f7bb366fa1e519fbdf5c4bc7 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 4 Nov 2022 16:55:55 +0100 Subject: [PATCH 071/197] Remove the draft prefix to ERC20Permit (#3793) Co-authored-by: Francisco --- CHANGELOG.md | 4 + contracts/interfaces/IERC2612.sol | 8 ++ contracts/interfaces/draft-IERC2612.sol | 5 +- contracts/mocks/ERC20PermitMock.sol | 2 +- contracts/mocks/SafeERC20Helper.sol | 2 +- contracts/token/ERC20/README.adoc | 12 +-- .../token/ERC20/extensions/ERC20Permit.sol | 95 +++++++++++++++++++ .../token/ERC20/extensions/ERC20Votes.sol | 2 +- .../token/ERC20/extensions/IERC20Permit.sol | 60 ++++++++++++ .../ERC20/extensions/draft-ERC20Permit.sol | 92 +----------------- .../ERC20/extensions/draft-IERC20Permit.sol | 57 +---------- contracts/token/ERC20/utils/SafeERC20.sol | 2 +- docs/modules/ROOT/pages/governance.adoc | 4 +- scripts/migrate-imports.js | 7 +- 14 files changed, 186 insertions(+), 166 deletions(-) create mode 100644 contracts/interfaces/IERC2612.sol create mode 100644 contracts/token/ERC20/extensions/ERC20Permit.sol create mode 100644 contracts/token/ERC20/extensions/IERC20Permit.sol diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c2f9f92b..59ae8bc72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) +### Deprecations + + * `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) + ## Unreleased * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) diff --git a/contracts/interfaces/IERC2612.sol b/contracts/interfaces/IERC2612.sol new file mode 100644 index 000000000..6dfdf6f63 --- /dev/null +++ b/contracts/interfaces/IERC2612.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2612.sol) + +pragma solidity ^0.8.0; + +import "../token/ERC20/extensions/IERC20Permit.sol"; + +interface IERC2612 is IERC20Permit {} diff --git a/contracts/interfaces/draft-IERC2612.sol b/contracts/interfaces/draft-IERC2612.sol index 1b3ae55f9..1ea7bf1c0 100644 --- a/contracts/interfaces/draft-IERC2612.sol +++ b/contracts/interfaces/draft-IERC2612.sol @@ -1,8 +1,7 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/draft-IERC2612.sol) pragma solidity ^0.8.0; -import "../token/ERC20/extensions/draft-IERC20Permit.sol"; +// EIP-2612 is Final as of 2022-11-01. This file is deprecated. -interface IERC2612 is IERC20Permit {} +import "./IERC2612.sol"; diff --git a/contracts/mocks/ERC20PermitMock.sol b/contracts/mocks/ERC20PermitMock.sol index 20302bfa0..8daa95587 100644 --- a/contracts/mocks/ERC20PermitMock.sol +++ b/contracts/mocks/ERC20PermitMock.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../token/ERC20/extensions/draft-ERC20Permit.sol"; +import "../token/ERC20/extensions/ERC20Permit.sol"; contract ERC20PermitMock is ERC20Permit { constructor( diff --git a/contracts/mocks/SafeERC20Helper.sol b/contracts/mocks/SafeERC20Helper.sol index 56f0b4ee7..98fdc6444 100644 --- a/contracts/mocks/SafeERC20Helper.sol +++ b/contracts/mocks/SafeERC20Helper.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import "../utils/Context.sol"; import "../token/ERC20/IERC20.sol"; -import "../token/ERC20/extensions/draft-ERC20Permit.sol"; +import "../token/ERC20/extensions/ERC20Permit.sol"; import "../token/ERC20/utils/SafeERC20.sol"; contract ERC20ReturnFalseMock is Context { diff --git a/contracts/token/ERC20/README.adoc b/contracts/token/ERC20/README.adoc index ae2ce3644..b3f68e543 100644 --- a/contracts/token/ERC20/README.adoc +++ b/contracts/token/ERC20/README.adoc @@ -31,10 +31,6 @@ Finally, there are some utilities to interact with ERC20 contracts in various wa * {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values. * {TokenTimelock}: hold tokens for a beneficiary until a specified time. -The following related EIPs are in draft status. - -- {ERC20Permit} - NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. == Core @@ -53,6 +49,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel {{ERC20Pausable}} +{{ERC20Permit}} + {{ERC20Snapshot}} {{ERC20Votes}} @@ -65,12 +63,6 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel {{ERC4626}} -== Draft EIPs - -The following EIPs are still in Draft status. Due to their nature as drafts, the details of these contracts may change and we cannot guarantee their xref:ROOT:releases-stability.adoc[stability]. Minor releases of OpenZeppelin Contracts may contain breaking changes for the contracts in this directory, which will be duly announced in the https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md[changelog]. The EIPs included here are used by projects in production and this may make them less likely to change significantly. - -{{ERC20Permit}} - == Presets These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. diff --git a/contracts/token/ERC20/extensions/ERC20Permit.sol b/contracts/token/ERC20/extensions/ERC20Permit.sol new file mode 100644 index 000000000..a357199b1 --- /dev/null +++ b/contracts/token/ERC20/extensions/ERC20Permit.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/ERC20Permit.sol) + +pragma solidity ^0.8.0; + +import "./IERC20Permit.sol"; +import "../ERC20.sol"; +import "../../../utils/cryptography/ECDSA.sol"; +import "../../../utils/cryptography/EIP712.sol"; +import "../../../utils/Counters.sol"; + +/** + * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + * + * _Available since v3.4._ + */ +abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { + using Counters for Counters.Counter; + + mapping(address => Counters.Counter) private _nonces; + + // solhint-disable-next-line var-name-mixedcase + bytes32 private constant _PERMIT_TYPEHASH = + keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + /** + * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. + * However, to ensure consistency with the upgradeable transpiler, we will continue + * to reserve a slot. + * @custom:oz-renamed-from _PERMIT_TYPEHASH + */ + // solhint-disable-next-line var-name-mixedcase + bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; + + /** + * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. + * + * It's a good idea to use the same `name` that is defined as the ERC20 token name. + */ + constructor(string memory name) EIP712(name, "1") {} + + /** + * @dev See {IERC20Permit-permit}. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual override { + require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); + + bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); + + bytes32 hash = _hashTypedDataV4(structHash); + + address signer = ECDSA.recover(hash, v, r, s); + require(signer == owner, "ERC20Permit: invalid signature"); + + _approve(owner, spender, value); + } + + /** + * @dev See {IERC20Permit-nonces}. + */ + function nonces(address owner) public view virtual override returns (uint256) { + return _nonces[owner].current(); + } + + /** + * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view override returns (bytes32) { + return _domainSeparatorV4(); + } + + /** + * @dev "Consume a nonce": return the current value and increment. + * + * _Available since v4.1._ + */ + function _useNonce(address owner) internal virtual returns (uint256 current) { + Counters.Counter storage nonce = _nonces[owner]; + current = nonce.current(); + nonce.increment(); + } +} diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 581d4f0f3..bf319c26f 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; -import "./draft-ERC20Permit.sol"; +import "./ERC20Permit.sol"; import "../../../utils/math/Math.sol"; import "../../../governance/utils/IVotes.sol"; import "../../../utils/math/SafeCast.sol"; diff --git a/contracts/token/ERC20/extensions/IERC20Permit.sol b/contracts/token/ERC20/extensions/IERC20Permit.sol new file mode 100644 index 000000000..bb43e53b6 --- /dev/null +++ b/contracts/token/ERC20/extensions/IERC20Permit.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Permit.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in + * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. + * + * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by + * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't + * need to send a transaction, and thus is not required to hold Ether at all. + */ +interface IERC20Permit { + /** + * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, + * given ``owner``'s signed approval. + * + * IMPORTANT: The same issues {IERC20-approve} has related to transaction + * ordering also apply here. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `deadline` must be a timestamp in the future. + * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` + * over the EIP712-formatted function arguments. + * - the signature must use ``owner``'s current nonce (see {nonces}). + * + * For more information on the signature format, see the + * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP + * section]. + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; + + /** + * @dev Returns the current nonce for `owner`. This value must be + * included whenever a signature is generated for {permit}. + * + * Every successful call to {permit} increases ``owner``'s nonce by one. This + * prevents a signature from being used multiple times. + */ + function nonces(address owner) external view returns (uint256); + + /** + * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. + */ + // solhint-disable-next-line func-name-mixedcase + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol index 637b666fc..cc80991c7 100644 --- a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol @@ -1,95 +1,7 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; -import "./draft-IERC20Permit.sol"; -import "../ERC20.sol"; -import "../../../utils/cryptography/ECDSA.sol"; -import "../../../utils/cryptography/EIP712.sol"; -import "../../../utils/Counters.sol"; +// EIP-2612 is Final as of 2022-11-01. This file is deprecated. -/** - * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - * - * _Available since v3.4._ - */ -abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { - using Counters for Counters.Counter; - - mapping(address => Counters.Counter) private _nonces; - - // solhint-disable-next-line var-name-mixedcase - bytes32 private constant _PERMIT_TYPEHASH = - keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - /** - * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. - * However, to ensure consistency with the upgradeable transpiler, we will continue - * to reserve a slot. - * @custom:oz-renamed-from _PERMIT_TYPEHASH - */ - // solhint-disable-next-line var-name-mixedcase - bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; - - /** - * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. - * - * It's a good idea to use the same `name` that is defined as the ERC20 token name. - */ - constructor(string memory name) EIP712(name, "1") {} - - /** - * @dev See {IERC20Permit-permit}. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); - - bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); - - bytes32 hash = _hashTypedDataV4(structHash); - - address signer = ECDSA.recover(hash, v, r, s); - require(signer == owner, "ERC20Permit: invalid signature"); - - _approve(owner, spender, value); - } - - /** - * @dev See {IERC20Permit-nonces}. - */ - function nonces(address owner) public view virtual override returns (uint256) { - return _nonces[owner].current(); - } - - /** - * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view override returns (bytes32) { - return _domainSeparatorV4(); - } - - /** - * @dev "Consume a nonce": return the current value and increment. - * - * _Available since v4.1._ - */ - function _useNonce(address owner) internal virtual returns (uint256 current) { - Counters.Counter storage nonce = _nonces[owner]; - current = nonce.current(); - nonce.increment(); - } -} +import "./ERC20Permit.sol"; diff --git a/contracts/token/ERC20/extensions/draft-IERC20Permit.sol b/contracts/token/ERC20/extensions/draft-IERC20Permit.sol index 6363b1408..1df6c537d 100644 --- a/contracts/token/ERC20/extensions/draft-IERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-IERC20Permit.sol @@ -1,60 +1,7 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - */ -interface IERC20Permit { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; +// EIP-2612 is Final as of 2022-11-01. This file is deprecated. - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} +import "./IERC20Permit.sol"; diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index f7f3653dc..ed37e941a 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import "../IERC20.sol"; -import "../extensions/draft-IERC20Permit.sol"; +import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index 3dca902a1..87531b201 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -45,7 +45,7 @@ The voting power of each account in our governance setup will be determined by a pragma solidity ^0.8.2; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; contract MyToken is ERC20, ERC20Permit, ERC20Votes { @@ -83,7 +83,7 @@ If your project already has a live token that does not include ERC20Votes and is pragma solidity ^0.8.2; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Wrapper.sol"; diff --git a/scripts/migrate-imports.js b/scripts/migrate-imports.js index 352de1408..04ebce76c 100755 --- a/scripts/migrate-imports.js +++ b/scripts/migrate-imports.js @@ -10,8 +10,8 @@ const pathUpdates = { 'cryptography/ECDSA.sol': 'utils/cryptography/ECDSA.sol', 'cryptography/MerkleProof.sol': 'utils/cryptography/MerkleProof.sol', 'drafts/EIP712.sol': 'utils/cryptography/EIP712.sol', - 'drafts/ERC20Permit.sol': 'token/ERC20/extensions/draft-ERC20Permit.sol', - 'drafts/IERC20Permit.sol': 'token/ERC20/extensions/draft-IERC20Permit.sol', + 'drafts/ERC20Permit.sol': 'token/ERC20/extensions/ERC20Permit.sol', + 'drafts/IERC20Permit.sol': 'token/ERC20/extensions/IERC20Permit.sol', 'GSN/Context.sol': 'utils/Context.sol', // 'GSN/GSNRecipientERC20Fee.sol': undefined, // 'GSN/GSNRecipientSignature.sol': undefined, @@ -87,6 +87,9 @@ const pathUpdates = { 'utils/ReentrancyGuard.sol': 'security/ReentrancyGuard.sol', 'utils/SafeCast.sol': 'utils/math/SafeCast.sol', // 'utils/Strings.sol': undefined, + 'utils/cryptography/draft-EIP712.sol': 'utils/cryptography/EIP712.sol', + 'token/ERC20/extensions/draft-ERC20Permit.sol': 'token/ERC20/extensions/ERC20Permit.sol', + 'token/ERC20/extensions/draft-IERC20Permit.sol': 'token/ERC20/extensions/IERC20Permit.sol', }; async function main (paths = [ 'contracts' ]) { From c7315e8779dd4ca363bef85d6c3a455e83fb574e Mon Sep 17 00:00:00 2001 From: Daejun Park Date: Fri, 4 Nov 2022 09:56:32 -0700 Subject: [PATCH 072/197] Add ERC4626 standard property tests (#3792) Co-authored-by: Hadrien Croubois --- .gitmodules | 3 +++ foundry.toml | 1 + lib/erc4626-tests | 1 + test/token/ERC20/extensions/ERC4626.t.sol | 17 +++++++++++++++++ 4 files changed, 22 insertions(+) create mode 160000 lib/erc4626-tests create mode 100644 test/token/ERC20/extensions/ERC4626.t.sol diff --git a/.gitmodules b/.gitmodules index 888d42dcd..aaa229f8d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "lib/erc4626-tests"] + path = lib/erc4626-tests + url = https://github.com/a16z/erc4626-tests.git diff --git a/foundry.toml b/foundry.toml index 1076ef55b..c0da48773 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,2 +1,3 @@ [fuzz] runs = 10000 +max_test_rejects = 100000 diff --git a/lib/erc4626-tests b/lib/erc4626-tests new file mode 160000 index 000000000..8b1d7c2ac --- /dev/null +++ b/lib/erc4626-tests @@ -0,0 +1 @@ +Subproject commit 8b1d7c2ac248c33c3506b1bff8321758943c5e11 diff --git a/test/token/ERC20/extensions/ERC4626.t.sol b/test/token/ERC20/extensions/ERC4626.t.sol new file mode 100644 index 000000000..4863c14d5 --- /dev/null +++ b/test/token/ERC20/extensions/ERC4626.t.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "erc4626-tests/ERC4626.test.sol"; + +import {ERC20Mock} from "../../../../contracts/mocks/ERC20Mock.sol"; +import {ERC4626Mock, IERC20Metadata} from "../../../../contracts/mocks/ERC4626Mock.sol"; + +contract ERC4626StdTest is ERC4626Test { + function setUp() public override { + _underlying_ = address(new ERC20Mock("MockERC20", "MockERC20", address(this), 0)); + _vault_ = address(new ERC4626Mock(IERC20Metadata(_underlying_), "MockERC4626", "MockERC4626")); + _delta_ = 0; + _vaultMayBeEmpty = false; + _unlimitedAmount = true; + } +} From 634710d7950728c6b696fa5b4522ac02a74a8617 Mon Sep 17 00:00:00 2001 From: Pandapip1 <45835846+Pandapip1@users.noreply.github.com> Date: Sat, 5 Nov 2022 14:13:49 -0400 Subject: [PATCH 073/197] Remove outdated note about hooks from documentation (#3789) Co-authored-by: Francisco Co-authored-by: Hadrien Croubois --- docs/modules/ROOT/pages/extending-contracts.adoc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index 022dfc957..6ae68a858 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -103,13 +103,6 @@ contract ERC20WithSafeTransfer is ERC20 { Using hooks this way leads to cleaner and safer code, without having to rely on a deep understanding of the parent's internals. -[NOTE] -==== -Hooks are a new feature of OpenZeppelin Contracts v3.0.0, and we're eager to learn how you plan to use them! - -So far, the only available hook is `_beforeTransferHook`, in all of xref:api:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-[`ERC20`], xref:api:token/ERC721.adoc#ERC721-_beforeTokenTransfer-address-address-uint256-[`ERC721`], xref:api:token/ERC777.adoc#ERC777-_beforeTokenTransfer-address-address-address-uint256-[`ERC777`] and xref:api:token/ERC1155.adoc#ERC1155-_beforeTokenTransfer-address-address-address-uint256---uint256---bytes-[`ERC1155`]. If you have ideas for new hooks, let us know! -==== - === Rules of Hooks There's a few guidelines you should follow when writing code that uses hooks in order to prevent issues. They are very simple, but do make sure you follow them: From 47d4ebb73431fe061062963f44ee987dd0a1b517 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 7 Nov 2022 20:00:19 -0300 Subject: [PATCH 074/197] Fix outdated docs about timelock admin (#3806) --- docs/modules/ROOT/pages/governance.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index 87531b201..00a997db5 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -254,7 +254,7 @@ TimelockController uses an AccessControl setup that we need to understand in ord - The Proposer role is in charge of queueing operations: this is the role the Governor instance should be granted, and it should likely be the only proposer in the system. - The Executor role is in charge of executing already available operations: we can assign this role to the special zero address to allow anyone to execute (if operations can be particularly time sensitive, the Governor should be made Executor instead). -- Lastly, there is the Admin role, which can grant and revoke the two previous roles: this is a very sensitive role that will be granted automatically to both deployer and timelock itself, but should be renounced by the deployer after setup. +- Lastly, there is the Admin role, which can grant and revoke the two previous roles: this is a very sensitive role that will be granted automatically to the timelock itself, and optionally to a second account, which can be used for ease of setup but should promptly renounce the role. == Proposal Lifecycle From e708b096cfc75e2f787d6d16018a037f5b4f597e Mon Sep 17 00:00:00 2001 From: Pandapip1 <45835846+Pandapip1@users.noreply.github.com> Date: Sat, 5 Nov 2022 14:13:49 -0400 Subject: [PATCH 075/197] Remove outdated note about hooks from documentation (#3789) Co-authored-by: Francisco Co-authored-by: Hadrien Croubois (cherry picked from commit 634710d7950728c6b696fa5b4522ac02a74a8617) --- docs/modules/ROOT/pages/extending-contracts.adoc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index 7d25ae9e4..f686a6347 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -103,13 +103,6 @@ contract ERC20WithSafeTransfer is ERC20 { Using hooks this way leads to cleaner and safer code, without having to rely on a deep understanding of the parent's internals. -[NOTE] -==== -Hooks are a new feature of OpenZeppelin Contracts v3.0.0, and we're eager to learn how you plan to use them! - -So far, the only available hook is `_beforeTransferHook`, in all of xref:api:token/ERC20.adoc#ERC20-_beforeTokenTransfer-address-address-uint256-[`ERC20`], xref:api:token/ERC721.adoc#ERC721-_beforeTokenTransfer-address-address-uint256-[`ERC721`], xref:api:token/ERC777.adoc#ERC777-_beforeTokenTransfer-address-address-address-uint256-[`ERC777`] and xref:api:token/ERC1155.adoc#ERC1155-_beforeTokenTransfer-address-address-address-uint256---uint256---bytes-[`ERC1155`]. If you have ideas for new hooks, let us know! -==== - === Rules of Hooks There's a few guidelines you should follow when writing code that uses hooks in order to prevent issues. They are very simple, but do make sure you follow them: From e0137d4cbe14ba6be2b52c6ecfb006b515c6f780 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 7 Nov 2022 20:00:19 -0300 Subject: [PATCH 076/197] Fix outdated docs about timelock admin (#3806) (cherry picked from commit 47d4ebb73431fe061062963f44ee987dd0a1b517) --- docs/modules/ROOT/pages/governance.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index 3dca902a1..315c3cbf0 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -254,7 +254,7 @@ TimelockController uses an AccessControl setup that we need to understand in ord - The Proposer role is in charge of queueing operations: this is the role the Governor instance should be granted, and it should likely be the only proposer in the system. - The Executor role is in charge of executing already available operations: we can assign this role to the special zero address to allow anyone to execute (if operations can be particularly time sensitive, the Governor should be made Executor instead). -- Lastly, there is the Admin role, which can grant and revoke the two previous roles: this is a very sensitive role that will be granted automatically to both deployer and timelock itself, but should be renounced by the deployer after setup. +- Lastly, there is the Admin role, which can grant and revoke the two previous roles: this is a very sensitive role that will be granted automatically to the timelock itself, and optionally to a second account, which can be used for ease of setup but should promptly renounce the role. == Proposal Lifecycle From 49c0e4370d0cc50ea6090709e3835a3091e33ee2 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 8 Nov 2022 11:29:29 -0300 Subject: [PATCH 077/197] 4.8.0 --- CHANGELOG.md | 2 +- contracts/access/AccessControl.sol | 2 +- contracts/access/Ownable2Step.sol | 2 +- contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL1.sol | 2 +- contracts/crosschain/arbitrum/LibArbitrumL2.sol | 2 +- contracts/finance/PaymentSplitter.sol | 2 +- contracts/finance/VestingWallet.sol | 2 +- contracts/governance/Governor.sol | 2 +- contracts/governance/IGovernor.sol | 2 +- contracts/governance/TimelockController.sol | 2 +- .../governance/compatibility/GovernorCompatibilityBravo.sol | 2 +- contracts/governance/extensions/GovernorCountingSimple.sol | 2 +- .../governance/extensions/GovernorVotesQuorumFraction.sol | 2 +- contracts/governance/utils/Votes.sol | 2 +- contracts/interfaces/IERC2309.sol | 2 +- contracts/interfaces/IERC4626.sol | 2 +- contracts/metatx/MinimalForwarder.sol | 2 +- contracts/package.json | 2 +- contracts/proxy/Clones.sol | 2 +- contracts/proxy/utils/Initializable.sol | 2 +- contracts/proxy/utils/UUPSUpgradeable.sol | 2 +- contracts/security/PullPayment.sol | 2 +- contracts/security/ReentrancyGuard.sol | 2 +- contracts/token/ERC1155/ERC1155.sol | 2 +- contracts/token/ERC1155/extensions/ERC1155Burnable.sol | 2 +- contracts/token/ERC20/ERC20.sol | 2 +- contracts/token/ERC20/extensions/ERC20FlashMint.sol | 2 +- contracts/token/ERC20/extensions/ERC20Votes.sol | 2 +- contracts/token/ERC20/extensions/ERC4626.sol | 2 +- contracts/token/ERC20/extensions/draft-ERC20Permit.sol | 2 +- contracts/token/ERC20/utils/SafeERC20.sol | 2 +- contracts/token/ERC721/ERC721.sol | 2 +- contracts/token/ERC721/IERC721.sol | 2 +- contracts/token/ERC721/extensions/ERC721Burnable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Consecutive.sol | 2 +- contracts/token/ERC721/extensions/ERC721Enumerable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Pausable.sol | 2 +- contracts/token/ERC721/extensions/ERC721Royalty.sol | 2 +- contracts/token/ERC721/extensions/ERC721Votes.sol | 2 +- contracts/token/ERC721/extensions/draft-ERC721Votes.sol | 2 +- .../token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol | 2 +- contracts/token/ERC777/ERC777.sol | 2 +- contracts/token/ERC777/IERC777.sol | 2 +- contracts/utils/Address.sol | 2 +- contracts/utils/Arrays.sol | 2 +- contracts/utils/Checkpoints.sol | 2 +- contracts/utils/Create2.sol | 2 +- contracts/utils/Strings.sol | 2 +- contracts/utils/cryptography/ECDSA.sol | 2 +- contracts/utils/cryptography/EIP712.sol | 2 +- contracts/utils/cryptography/MerkleProof.sol | 2 +- contracts/utils/cryptography/SignatureChecker.sol | 2 +- contracts/utils/cryptography/draft-EIP712.sol | 2 +- contracts/utils/introspection/ERC165Checker.sol | 2 +- contracts/utils/introspection/IERC1820Registry.sol | 2 +- contracts/utils/math/Math.sol | 2 +- contracts/utils/math/SafeCast.sol | 2 +- contracts/utils/math/SignedMath.sol | 2 +- contracts/utils/structs/BitMaps.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 2 +- contracts/utils/structs/EnumerableSet.sol | 2 +- contracts/vendor/arbitrum/IArbSys.sol | 2 +- contracts/vendor/arbitrum/IBridge.sol | 2 +- contracts/vendor/arbitrum/IDelayedMessageProvider.sol | 2 +- contracts/vendor/arbitrum/IInbox.sol | 2 +- contracts/vendor/arbitrum/IOutbox.sol | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 69 files changed, 70 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b065e8a88..d6701a28a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 4.8.0 +## 4.8.0 (2022-11-08) * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) * `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index bbe6ace15..386b85c03 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (access/AccessControl.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; diff --git a/contracts/access/Ownable2Step.sol b/contracts/access/Ownable2Step.sol index 57d3ce559..221706300 100644 --- a/contracts/access/Ownable2Step.sol +++ b/contracts/access/Ownable2Step.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (access/Ownable2Step.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol) pragma solidity ^0.8.0; diff --git a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol index f017ae3e6..e85993dbb 100644 --- a/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL1.sol b/contracts/crosschain/arbitrum/LibArbitrumL1.sol index 0c52699fb..be7236b24 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL1.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL1.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/LibArbitrumL1.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (crosschain/arbitrum/LibArbitrumL1.sol) pragma solidity ^0.8.4; diff --git a/contracts/crosschain/arbitrum/LibArbitrumL2.sol b/contracts/crosschain/arbitrum/LibArbitrumL2.sol index 51352f1fa..715a3878f 100644 --- a/contracts/crosschain/arbitrum/LibArbitrumL2.sol +++ b/contracts/crosschain/arbitrum/LibArbitrumL2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (crosschain/arbitrum/LibArbitrumL2.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (crosschain/arbitrum/LibArbitrumL2.sol) pragma solidity ^0.8.4; diff --git a/contracts/finance/PaymentSplitter.sol b/contracts/finance/PaymentSplitter.sol index 2e9d21e6e..daa9090eb 100644 --- a/contracts/finance/PaymentSplitter.sol +++ b/contracts/finance/PaymentSplitter.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (finance/PaymentSplitter.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol index 000daabc7..0feac4ac6 100644 --- a/contracts/finance/VestingWallet.sol +++ b/contracts/finance/VestingWallet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (finance/VestingWallet.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (finance/VestingWallet.sol) pragma solidity ^0.8.0; import "../token/ERC20/utils/SafeERC20.sol"; diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index b9ea6bd33..cebaf38ba 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/Governor.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/Governor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index 160b16450..eb3d1fc05 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/IGovernor.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/IGovernor.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index 43a7f7067..ad385af6d 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/TimelockController.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/TimelockController.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 234c34ffb..a903ae98d 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/compatibility/GovernorCompatibilityBravo.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/compatibility/GovernorCompatibilityBravo.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/governance/extensions/GovernorCountingSimple.sol index 63868ab1f..5611fc669 100644 --- a/contracts/governance/extensions/GovernorCountingSimple.sol +++ b/contracts/governance/extensions/GovernorCountingSimple.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/extensions/GovernorCountingSimple.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/extensions/GovernorCountingSimple.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol index d88bf3817..8efefce39 100644 --- a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/extensions/GovernorVotesQuorumFraction.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/extensions/GovernorVotesQuorumFraction.sol) pragma solidity ^0.8.0; diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index fcd060a3f..ba7c2b3fe 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (governance/utils/Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (governance/utils/Votes.sol) pragma solidity ^0.8.0; import "../../utils/Context.sol"; diff --git a/contracts/interfaces/IERC2309.sol b/contracts/interfaces/IERC2309.sol index fe9367e4c..b3fec44e2 100644 --- a/contracts/interfaces/IERC2309.sol +++ b/contracts/interfaces/IERC2309.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (interfaces/IERC2309.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (interfaces/IERC2309.sol) pragma solidity ^0.8.0; diff --git a/contracts/interfaces/IERC4626.sol b/contracts/interfaces/IERC4626.sol index 3655d293c..f7c5397a0 100644 --- a/contracts/interfaces/IERC4626.sol +++ b/contracts/interfaces/IERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (interfaces/IERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (interfaces/IERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index 6adf7f1d8..bb49c794d 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (metatx/MinimalForwarder.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (metatx/MinimalForwarder.sol) pragma solidity ^0.8.0; diff --git a/contracts/package.json b/contracts/package.json index 03d8519f4..e3e608341 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@openzeppelin/contracts", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.2", + "version": "4.8.0", "files": [ "**/*.sol", "/build/contracts/*.json", diff --git a/contracts/proxy/Clones.sol b/contracts/proxy/Clones.sol index 1657eebb3..93ea0cec7 100644 --- a/contracts/proxy/Clones.sol +++ b/contracts/proxy/Clones.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/Clones.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (proxy/Clones.sol) pragma solidity ^0.8.0; diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 44f5e46c9..1b57baf27 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/Initializable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index d116474ba..8b7366328 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (proxy/utils/UUPSUpgradeable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/PullPayment.sol b/contracts/security/PullPayment.sol index 7da1fbd5e..65b4980f6 100644 --- a/contracts/security/PullPayment.sol +++ b/contracts/security/PullPayment.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (security/PullPayment.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (security/PullPayment.sol) pragma solidity ^0.8.0; diff --git a/contracts/security/ReentrancyGuard.sol b/contracts/security/ReentrancyGuard.sol index b494e05c7..3c8bb4232 100644 --- a/contracts/security/ReentrancyGuard.sol +++ b/contracts/security/ReentrancyGuard.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (security/ReentrancyGuard.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index 99ee813ab..e33faf80c 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC1155/ERC1155.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol index e5971e95b..cfaa2359d 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC1155/extensions/ERC1155Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index c5910925a..102bc8504 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/ERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/token/ERC20/extensions/ERC20FlashMint.sol index e69e07e1e..063fe99fb 100644 --- a/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ b/contracts/token/ERC20/extensions/ERC20FlashMint.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC20FlashMint.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC20FlashMint.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 4c3d71d6d..d00287f4e 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC20Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index fe47325eb..d2368f3c1 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/ERC4626.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC4626.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol index 85eefd3b8..3ab74cc76 100644 --- a/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ b/contracts/token/ERC20/extensions/draft-ERC20Permit.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/extensions/draft-ERC20Permit.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index aa2dc069c..a01a877ad 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC20/utils/SafeERC20.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 3c66ae356..80fc22de0 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/ERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 558d96558..22020bab0 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/IERC721.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Burnable.sol b/contracts/token/ERC721/extensions/ERC721Burnable.sol index 75559a84c..0dc7dae2c 100644 --- a/contracts/token/ERC721/extensions/ERC721Burnable.sol +++ b/contracts/token/ERC721/extensions/ERC721Burnable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Burnable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Consecutive.sol b/contracts/token/ERC721/extensions/ERC721Consecutive.sol index 55051a460..fc888d528 100644 --- a/contracts/token/ERC721/extensions/ERC721Consecutive.sol +++ b/contracts/token/ERC721/extensions/ERC721Consecutive.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Consecutive.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Consecutive.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/token/ERC721/extensions/ERC721Enumerable.sol index 00151f96d..aab81a9f3 100644 --- a/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ b/contracts/token/ERC721/extensions/ERC721Enumerable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Enumerable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 5e9db45ee..4726540f4 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Pausable.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Royalty.sol b/contracts/token/ERC721/extensions/ERC721Royalty.sol index 213b60bfb..298e34205 100644 --- a/contracts/token/ERC721/extensions/ERC721Royalty.sol +++ b/contracts/token/ERC721/extensions/ERC721Royalty.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Royalty.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/ERC721Votes.sol b/contracts/token/ERC721/extensions/ERC721Votes.sol index 44d640424..8e6500ec3 100644 --- a/contracts/token/ERC721/extensions/ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/ERC721Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/ERC721Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol index 9489b78d1..c6aa7c564 100644 --- a/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ b/contracts/token/ERC721/extensions/draft-ERC721Votes.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/extensions/draft-ERC721Votes.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 7ce93bbd8..06b377324 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index 84570cf90..7c35bf5a8 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC777/ERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC777/ERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/token/ERC777/IERC777.sol b/contracts/token/ERC777/IERC777.sol index e695e5ca9..2af7771b0 100644 --- a/contracts/token/ERC777/IERC777.sol +++ b/contracts/token/ERC777/IERC777.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (token/ERC777/IERC777.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC777/IERC777.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 7fc36c58a..d440b259e 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Address.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; diff --git a/contracts/utils/Arrays.sol b/contracts/utils/Arrays.sol index 2236f03c1..4b052edae 100644 --- a/contracts/utils/Arrays.sol +++ b/contracts/utils/Arrays.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Arrays.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/Arrays.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index f2ba2ded0..3f329d73c 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Checkpoints.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/Checkpoints.sol) // This file was procedurally generated from scripts/generate/templates/Checkpoints.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 5a2919163..8df86d669 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Create2.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index 77668e61e..76aa3640a 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/Strings.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index 5e101eb9b..4b1d66b09 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/ECDSA.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index 911c49492..eb211a7e2 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 7dfe412a6..938bd96e1 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/MerkleProof.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 8cbe97ae3..414bc772a 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/SignatureChecker.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/cryptography/draft-EIP712.sol b/contracts/utils/cryptography/draft-EIP712.sol index 8c548b54c..fdae3ba3e 100644 --- a/contracts/utils/cryptography/draft-EIP712.sol +++ b/contracts/utils/cryptography/draft-EIP712.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/cryptography/draft-EIP712.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index b22022255..4c5fe2092 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/introspection/ERC165Checker.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/introspection/IERC1820Registry.sol b/contracts/utils/introspection/IERC1820Registry.sol index 4f57a30d2..42cf46a8a 100644 --- a/contracts/utils/introspection/IERC1820Registry.sol +++ b/contracts/utils/introspection/IERC1820Registry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/introspection/IERC1820Registry.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/IERC1820Registry.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index 0ea9e9062..7848c9203 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/Math.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SafeCast.sol b/contracts/utils/math/SafeCast.sol index a6a4a444d..435a5f945 100644 --- a/contracts/utils/math/SafeCast.sol +++ b/contracts/utils/math/SafeCast.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/SafeCast.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol) // This file was procedurally generated from scripts/generate/templates/SafeCast.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/math/SignedMath.sol b/contracts/utils/math/SignedMath.sol index e06e6e9b1..3ea9f8bf0 100644 --- a/contracts/utils/math/SignedMath.sol +++ b/contracts/utils/math/SignedMath.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/math/SignedMath.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/BitMaps.sol b/contracts/utils/structs/BitMaps.sol index 0b624fe61..a2ddc4709 100644 --- a/contracts/utils/structs/BitMaps.sol +++ b/contracts/utils/structs/BitMaps.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/BitMaps.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index f812eeefb..a3fda61d8 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/EnumerableMap.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableMap.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableMap.js. pragma solidity ^0.8.0; diff --git a/contracts/utils/structs/EnumerableSet.sol b/contracts/utils/structs/EnumerableSet.sol index a58430842..4c701c26c 100644 --- a/contracts/utils/structs/EnumerableSet.sol +++ b/contracts/utils/structs/EnumerableSet.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (utils/structs/EnumerableSet.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; diff --git a/contracts/vendor/arbitrum/IArbSys.sol b/contracts/vendor/arbitrum/IArbSys.sol index 28eb3f1ec..aac5dd53a 100644 --- a/contracts/vendor/arbitrum/IArbSys.sol +++ b/contracts/vendor/arbitrum/IArbSys.sol @@ -1,7 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IArbSys.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (vendor/arbitrum/IArbSys.sol) pragma solidity >=0.4.21 <0.9.0; diff --git a/contracts/vendor/arbitrum/IBridge.sol b/contracts/vendor/arbitrum/IBridge.sol index 34968cac6..7518f5d13 100644 --- a/contracts/vendor/arbitrum/IBridge.sol +++ b/contracts/vendor/arbitrum/IBridge.sol @@ -1,7 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IBridge.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (vendor/arbitrum/IBridge.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol index 34ddaeff8..914c25fb7 100644 --- a/contracts/vendor/arbitrum/IDelayedMessageProvider.sol +++ b/contracts/vendor/arbitrum/IDelayedMessageProvider.sol @@ -1,7 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IDelayedMessageProvider.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (vendor/arbitrum/IDelayedMessageProvider.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IInbox.sol b/contracts/vendor/arbitrum/IInbox.sol index d81220386..a8b67511c 100644 --- a/contracts/vendor/arbitrum/IInbox.sol +++ b/contracts/vendor/arbitrum/IInbox.sol @@ -1,7 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IInbox.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (vendor/arbitrum/IInbox.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/contracts/vendor/arbitrum/IOutbox.sol b/contracts/vendor/arbitrum/IOutbox.sol index 98374d8f7..4f809dbf4 100644 --- a/contracts/vendor/arbitrum/IOutbox.sol +++ b/contracts/vendor/arbitrum/IOutbox.sol @@ -1,7 +1,7 @@ // Copyright 2021-2022, Offchain Labs, Inc. // For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 -// OpenZeppelin Contracts (last updated v4.8.0-rc.2) (vendor/arbitrum/IOutbox.sol) +// OpenZeppelin Contracts (last updated v4.8.0) (vendor/arbitrum/IOutbox.sol) // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; diff --git a/package-lock.json b/package-lock.json index 4e1e70d93..ae944c731 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.2", + "version": "4.8.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openzeppelin-solidity", - "version": "4.8.0-rc.2", + "version": "4.8.0", "license": "MIT", "bin": { "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" diff --git a/package.json b/package.json index 0beaab22f..12b9d2d59 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "openzeppelin-solidity", "description": "Secure Smart Contract library for Solidity", - "version": "4.8.0-rc.2", + "version": "4.8.0", "files": [ "/contracts/**/*.sol", "/build/contracts/*.json", From b2970b96e5e2be297421cd7690e3502e49f7deff Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 10 Nov 2022 23:27:54 -0300 Subject: [PATCH 078/197] Update lockfile --- package-lock.json | 17252 ++++++++------------------------------------ 1 file changed, 2821 insertions(+), 14431 deletions(-) diff --git a/package-lock.json b/package-lock.json index d027b7097..0ef5962ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14418 +1,13 @@ { "name": "openzeppelin-solidity", "version": "4.8.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "openzeppelin-solidity", - "version": "4.8.0", - "license": "MIT", - "bin": { - "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" - }, - "devDependencies": { - "@nomicfoundation/hardhat-network-helpers": "^1.0.3", - "@nomiclabs/hardhat-truffle5": "^2.0.5", - "@nomiclabs/hardhat-web3": "^2.0.0", - "@openzeppelin/docs-utils": "^0.1.3", - "@openzeppelin/test-helpers": "^0.5.13", - "chai": "^4.2.0", - "eslint": "^7.32.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-mocha": "^10.0.3", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.2.0", - "eth-sig-util": "^3.0.0", - "ethereumjs-util": "^7.0.7", - "ethereumjs-wallet": "^1.0.1", - "glob": "^8.0.3", - "graphlib": "^2.1.8", - "hardhat": "^2.9.1", - "hardhat-gas-reporter": "^1.0.4", - "hardhat-ignore-warnings": "^0.2.0", - "keccak256": "^1.0.2", - "lodash.startcase": "^4.4.0", - "lodash.zip": "^4.2.0", - "merkletreejs": "^0.2.13", - "micromatch": "^4.0.2", - "prettier": "^2.3.0", - "prettier-plugin-solidity": "^1.0.0-beta.16", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "solhint": "^3.3.6", - "solidity-ast": "^0.4.25", - "solidity-coverage": "^0.8.0", - "solidity-docgen": "^0.6.0-beta.29", - "web3": "^1.3.0", - "yargs": "^17.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ensdomains/address-encoder": { - "version": "0.1.9", - "dev": true, - "license": "BSD", - "dependencies": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" - } - }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "dev": true, - "license": "CC0-1.0", - "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/ensjs": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@ensdomains/ensjs/node_modules/ethers": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "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.0", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.0", - "@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.0", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "dev": true - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@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/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "dev": true, - "license": "MIT", - "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", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^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/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@frangio/servbot": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.x", - "pnpm": "7.5.1" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "dev": true, - "license": "ISC", - "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" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "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/@noble/hashes": { - "version": "1.1.2", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@noble/secp256k1": { - "version": "1.6.3", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-ethash": "^2.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "1.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.0", - "dev": true, - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "4.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "8.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "6.0.0", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.0.3", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.0.3", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@nomiclabs/truffle-contract": "^4.2.23", - "@types/chai": "^4.2.0", - "chai": "^4.2.0", - "ethereumjs-util": "^7.1.4", - "fs-extra": "^7.0.1" - }, - "peerDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "hardhat": "^2.6.4", - "web3": "^1.0.0-beta.36" - } - }, - "node_modules/@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bignumber.js": "^5.0.0" - }, - "peerDependencies": { - "hardhat": "^2.0.0", - "web3": "^1.0.0-beta.36" - } - }, - "node_modules/@nomiclabs/truffle-contract": { - "version": "4.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@ensdomains/ensjs": "^2.0.1", - "@truffle/blockchain-utils": "^0.1.3", - "@truffle/contract-schema": "^3.4.7", - "@truffle/debug-utils": "^6.0.22", - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.16", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19" - }, - "peerDependencies": { - "web3": "^1.2.1", - "web3-core-helpers": "^1.2.1", - "web3-core-promievent": "^1.2.1", - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" - } - }, - "node_modules/@openzeppelin/contract-loader": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@openzeppelin/docs-utils": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@frangio/servbot": "^0.2.5", - "chalk": "^3.0.0", - "chokidar": "^3.5.3", - "env-paths": "^2.2.0", - "find-up": "^4.1.0", - "is-port-reachable": "^3.0.0", - "js-yaml": "^3.13.1", - "lodash.startcase": "^4.4.0", - "minimist": "^1.2.0" - }, - "bin": { - "oz-docs": "oz-docs.js" - } - }, - "node_modules/@openzeppelin/test-helpers": { - "version": "0.5.16", - "dev": true, - "license": "MIT", - "dependencies": { - "@openzeppelin/contract-loader": "^0.6.2", - "@truffle/contract": "^4.0.35", - "ansi-colors": "^3.2.3", - "chai": "^4.2.0", - "chai-bn": "^0.2.1", - "ethjs-abi": "^0.2.1", - "lodash.flatten": "^4.4.0", - "semver": "^5.6.0", - "web3": "^1.2.5", - "web3-utils": "^1.2.5" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@scure/base": { - "version": "1.1.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@scure/bip32": { - "version": "1.1.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@scure/bip39": { - "version": "1.1.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.3", - "dev": true, - "license": "MIT", - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@truffle/abi-utils": { - "version": "0.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/abi-utils/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/abi-utils/node_modules/web3-utils": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/codec": { - "version": "0.14.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@truffle/abi-utils": "^0.3.1", - "@truffle/compile-common": "^0.8.0", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/codec/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/compile-common": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@truffle/error": "^0.1.1", - "colors": "1.4.0" - } - }, - "node_modules/@truffle/contract": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@ensdomains/ensjs": "^2.1.0", - "@truffle/blockchain-utils": "^0.1.4", - "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.34", - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", - "bignumber.js": "^7.2.1", - "debug": "^4.3.1", - "ethers": "^4.0.32", - "web3": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - } - }, - "node_modules/@truffle/contract/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/contract/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/contract/node_modules/@types/node": { - "version": "12.20.55", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/contract/node_modules/cacheable-request": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/decompress-response": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/contract/node_modules/defer-to-connect": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/contract/node_modules/eth-lib": { - "version": "0.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/contract/node_modules/get-stream": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/contract/node_modules/got": { - "version": "9.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@truffle/contract/node_modules/json-buffer": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/contract/node_modules/keyv": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/lowercase-keys": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/contract/node_modules/normalize-url": { - "version": "4.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/p-cancelable": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/contract/node_modules/responselike": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/uuid": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/contract/node_modules/web3": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-helpers": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-method": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-promievent": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-abi": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-contract": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-ens": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-iban": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/contract/node_modules/web3-eth-personal": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-net": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-http": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ws": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-shh": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-utils": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.34", - "dev": true, - "license": "MIT", - "dependencies": { - "@truffle/codec": "^0.14.4", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.5" - } - }, - "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/debug-utils/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@truffle/debug-utils/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/error": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.21", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.55", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/cacheable-request": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/decompress-response": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/defer-to-connect": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/get-stream": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/got": { - "version": "9.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/json-buffer": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/keyv": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/lowercase-keys": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/normalize-url": { - "version": "4.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/p-cancelable": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/responselike": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.7.4", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.7.4", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@trufflesuite/chromafi": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "highlight.js": "^10.4.1", - "lodash.merge": "^4.6.2", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/bignumber.js": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bignumber.js": "*" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.7.17", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true, - "license": "ISC" - }, - "node_modules/abbrev": { - "version": "1.0.9", - "dev": true, - "license": "ISC" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.3", - "dev": true, - "license": "MIT" - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/address": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/aes-js": { - "version": "3.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "dev": true, - "license": "BSD-3-Clause OR MIT", - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/antlr4": { - "version": "4.7.1", - "dev": true, - "license": "BSD" - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/anymatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/asn1": { - "version": "0.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ast-parents": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/base-x": { - "version": "3.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "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" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "dev": true, - "license": "Unlicense" - }, - "node_modules/bech32": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.36", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/bigint-crypto-utils": { - "version": "3.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "bigint-mod-arith": "^3.1.0" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/bigint-mod-arith": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/bignumber.js": { - "version": "7.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.10.3", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/bs58": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-reverse": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/bufferutil": { - "version": "4.0.6", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/catering": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cbor": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cbor/node_modules/bignumber.js": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chai": { - "version": "4.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-bn": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "bn.js": "^4.11.0", - "chai": "^4.0.0" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/change-case": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/charenc": { - "version": "0.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cids": { - "version": "0.7.5", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-is": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/classic-level": { - "version": "1.2.0", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3": { - "version": "0.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "dev": true, - "license": "ISC" - }, - "node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "2.18.0", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/constant-case": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-hash": { - "version": "2.5.2", - "dev": true, - "license": "ISC", - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/cookiejar": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/crypto-addr-codec": { - "version": "0.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "base-x": "^3.0.8", - "big-integer": "1.6.36", - "blakejs": "^1.1.0", - "bs58": "^4.0.1", - "ripemd160-min": "0.0.6", - "safe-buffer": "^5.2.0", - "sha3": "^2.1.1" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-js": { - "version": "3.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/css-select": { - "version": "5.1.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/d": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/death": { - "version": "1.1.0", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-port": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "5.0.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/difflib": { - "version": "0.2.4", - "dev": true, - "dependencies": { - "heap": ">= 0.2.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "dev": true - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "dev": 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/emoji-regex": { - "version": "10.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/enquirer/node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/entities": { - "version": "4.4.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "dev": true, - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "dev": true, - "license": "MIT" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "2.7.3", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.9.3", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-standard": { - "version": "16.0.3", - "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" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-mocha": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "dev": true, - "license": "ISC", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "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/cliui": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/eth-gas-reporter/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", - "dev": true, - "license": "ISC", - "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": "*" - } - }, - "node_modules/eth-gas-reporter/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/eth-gas-reporter/node_modules/object.assign": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "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_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-lib": { - "version": "0.1.29", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "node_modules/eth-sig-util": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.0" - } - }, - "node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "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/ethereum-ens": { - "version": "0.8.0", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bluebird": "^3.4.7", - "eth-ens-namehash": "^2.0.0", - "js-sha3": "^0.5.7", - "pako": "^1.0.4", - "underscore": "^1.8.3", - "web3": "^1.0.0-beta.34" - } - }, - "node_modules/ethereum-ens/node_modules/js-sha3": { - "version": "0.5.7", - "dev": true, - "license": "MIT" - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "license": "MPL-2.0", - "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", - "dev": true, - "license": "MPL-2.0", - "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/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ethereumjs-wallet": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "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/ethers": { - "version": "4.0.49", - "dev": true, - "license": "MIT", - "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" - } - }, - "node_modules/ethers/node_modules/aes-js": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ethers/node_modules/hash.js": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/ethers/node_modules/js-sha3": { - "version": "0.5.7", - "dev": true, - "license": "MIT" - }, - "node_modules/ethers/node_modules/scrypt-js": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/ethers/node_modules/setimmediate": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/ethers/node_modules/uuid": { - "version": "2.0.1", - "dev": true - }, - "node_modules/ethjs-abi": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-abi/node_modules/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ethjs-abi/node_modules/js-sha3": { - "version": "0.5.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/express": { - "version": "4.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.10.3", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "dev": true, - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "dev": true, - "license": "ISC" - }, - "node_modules/extend": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-check": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "pure-rand": "^5.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "dev": true, - "license": "MIT", - "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-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.13.0", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "dev": true, - "license": "MIT" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/ghost-testrpc/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ghost-testrpc/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ghost-testrpc/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/glob": { - "version": "8.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "10.0.2", - "dev": true, - "license": "MIT", - "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/globby/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/got": { - "version": "12.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/growl": { - "version": "1.10.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hardhat": { - "version": "2.11.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", - "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", - "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", - "@nomicfoundation/solidity-analyzer": "^0.0.3", - "@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.4.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/cli.js" - }, - "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - }, - "peerDependencies": { - "hardhat": "^2.0.2" - } - }, - "node_modules/hardhat-ignore-warnings": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^5.1.0", - "node-interval-tree": "^2.0.1", - "solidity-comments": "^0.0.2" - } - }, - "node_modules/hardhat-ignore-warnings/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hardhat/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/hardhat/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/hardhat/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/glob": { - "version": "7.2.0", - "dev": true, - "license": "ISC", - "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/hardhat/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hardhat/node_modules/resolve": { - "version": "1.17.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hardhat/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "dev": true, - "license": "MIT", - "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" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "dev": true, - "license": "MIT", - "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/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "dev": true, - "license": "MIT" - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/highlightjs-solidity": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/htmlparser2": { - "version": "8.0.1", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/http-basic": { - "version": "8.1.3", - "dev": true, - "license": "MIT", - "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_modules/http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "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_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-https": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "dev": true, - "license": "MIT" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "2.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "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" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "6.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/io-ts": { - "version": "1.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "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" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-port-reachable": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "upper-case": "^1.1.0" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "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.2", - "dev": true, - "hasInstallScript": 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/keccak256": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "node_modules/keccak256/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/keccak256/node_modules/buffer": { - "version": "6.0.3", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/keyv": { - "version": "4.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/level": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "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-supports": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "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/parse-json": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/loupe": { - "version": "2.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.2" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/markdown-table": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-level": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/merkletreejs": { - "version": "0.2.32", - "dev": true, - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.1", - "buffer-reverse": "^1.0.1", - "crypto-js": "^3.1.9-1", - "treeify": "^1.1.0", - "web3-utils": "^1.3.4" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/merkletreejs/node_modules/bignumber.js": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "dev": true, - "license": "MIT" - }, - "node_modules/minipass": { - "version": "2.9.0", - "dev": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "dev": true, - "license": "MIT", - "dependencies": { - "obliterator": "^2.0.0" - } - }, - "node_modules/mocha": { - "version": "10.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "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" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "dev": true, - "license": "ISC", - "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/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "dev": true, - "license": "MIT" - }, - "node_modules/module-error": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/multibase": { - "version": "0.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/multicodec": { - "version": "0.5.7", - "dev": true, - "license": "MIT", - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/multihashes": { - "version": "0.4.21", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - } - }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/nano-base32": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/no-case": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "dev": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-interval-tree": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "shallowequal": "^1.1.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/nofilter": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "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.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/oboe": { - "version": "2.1.5", - "dev": true, - "license": "BSD", - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "dev": true, - "license": "MIT", - "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_modules/os-locale": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/param-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "dev": true - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse5": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/path-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-solidity": { - "version": "1.0.0-beta.24", - "dev": true, - "license": "MIT", - "dependencies": { - "@solidity-parser/parser": "^0.14.3", - "emoji-regex": "^10.1.0", - "escape-string-regexp": "^4.0.0", - "semver": "^7.3.7", - "solidity-comments-extractor": "^0.0.7", - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "prettier": "^2.3.0" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/prettier-plugin-solidity/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "8.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "5.0.3", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "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" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rambda": { - "version": "7.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "dev": true, - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/req-cwd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "req-from": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "dev": true, - "license": "Apache-2.0", - "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-promise-core": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "dev": true, - "license": "ISC", - "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_modules/request/node_modules/qs": { - "version": "6.5.3", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/ripemd160-min": { - "version": "0.0.6", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/rlp/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/run-async": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "dev": true, - "license": "(MIT OR Apache-2.0)" - }, - "node_modules/rxjs": { - "version": "6.6.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "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" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "dev": true, - "license": "BSD-3-Clause", - "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/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/sc-istanbul/node_modules/esprima": { - "version": "2.7.3", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "dev": true, - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "dev": true, - "license": "MIT" - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "dev": true, - "hasInstallScript": 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/semver": { - "version": "7.3.7", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/servify": { - "version": "0.1.12", - "dev": true, - "license": "MIT", - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha1": { - "version": "1.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sha3": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/sha3/node_modules/buffer": { - "version": "6.0.3", - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "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" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "2.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/solc": { - "version": "0.4.26", - "dev": true, - "license": "MIT", - "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/solc/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/camelcase": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/cliui": { - "version": "3.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/solc/node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "dev": true, - "license": "MIT", - "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/get-caller-file": { - "version": "1.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/solc/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solc/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solc/node_modules/require-main-filename": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solc/node_modules/string-width": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "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/solc/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/which-module": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/solc/node_modules/wrap-ansi": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/y18n": { - "version": "3.2.2", - "dev": true, - "license": "ISC" - }, - "node_modules/solc/node_modules/yargs": { - "version": "4.8.1", - "dev": true, - "license": "MIT", - "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/solc/node_modules/yargs-parser": { - "version": "2.4.1", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/solhint": { - "version": "3.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@solidity-parser/parser": "^0.14.1", - "ajv": "^6.6.1", - "antlr4": "4.7.1", - "ast-parents": "0.0.1", - "chalk": "^2.4.2", - "commander": "2.18.0", - "cosmiconfig": "^5.0.7", - "eslint": "^5.6.0", - "fast-diff": "^1.1.2", - "glob": "^7.1.3", - "ignore": "^4.0.6", - "js-yaml": "^3.12.0", - "lodash": "^4.17.11", - "semver": "^6.3.0" - }, - "bin": { - "solhint": "solhint.js" - }, - "optionalDependencies": { - "prettier": "^1.14.3" - } - }, - "node_modules/solhint/node_modules/acorn": { - "version": "6.4.2", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/solhint/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/astral-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/solhint/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/solhint/node_modules/cross-spawn": { - "version": "6.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/solhint/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solhint/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/solhint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/solhint/node_modules/eslint": { - "version": "5.16.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - } - }, - "node_modules/solhint/node_modules/eslint-scope": { - "version": "4.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/solhint/node_modules/eslint-utils": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/eslint/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solhint/node_modules/espree": { - "version": "5.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/solhint/node_modules/file-entry-cache": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/flat-cache": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/flatted": { - "version": "2.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/solhint/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solhint/node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/levn": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/optionator": { - "version": "0.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/prelude-ls": { - "version": "1.1.2", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/prettier": { - "version": "1.19.1", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/regexpp": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/solhint/node_modules/rimraf": { - "version": "2.6.3", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/solhint/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/solhint/node_modules/shebang-command": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/node_modules/shebang-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/node_modules/slice-ansi": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/table": { - "version": "5.4.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/solhint/node_modules/type-check": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/solidity-ast": { - "version": "0.4.35", - "dev": true, - "license": "MIT" - }, - "node_modules/solidity-comments": { - "version": "0.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "solidity-comments-darwin-arm64": "0.0.2", - "solidity-comments-darwin-x64": "0.0.2", - "solidity-comments-freebsd-x64": "0.0.2", - "solidity-comments-linux-arm64-gnu": "0.0.2", - "solidity-comments-linux-arm64-musl": "0.0.2", - "solidity-comments-linux-x64-gnu": "0.0.2", - "solidity-comments-linux-x64-musl": "0.0.2", - "solidity-comments-win32-arm64-msvc": "0.0.2", - "solidity-comments-win32-ia32-msvc": "0.0.2", - "solidity-comments-win32-x64-msvc": "0.0.2" - } - }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/solidity-comments-linux-x64-gnu": { - "version": "0.0.2", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/solidity-comments-linux-x64-musl": { - "version": "0.0.2", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/solidity-coverage": { - "version": "0.8.2", - "dev": true, - "license": "ISC", - "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" - }, - "peerDependencies": { - "hardhat": "^2.11.0" - } - }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "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/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/solidity-coverage/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/solidity-coverage/node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/solidity-coverage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "dev": true, - "license": "ISC", - "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": "*" - } - }, - "node_modules/solidity-coverage/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/solidity-coverage/node_modules/object.assign": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "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_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "dev": true, - "license": "MIT", - "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/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-docgen": { - "version": "0.6.0-beta.29", - "dev": true, - "license": "MIT", - "dependencies": { - "handlebars": "^4.7.7", - "solidity-ast": "^0.4.31" - }, - "peerDependencies": { - "hardhat": "^2.8.0" - } - }, - "node_modules/source-map": { - "version": "0.2.0", - "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.17.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "Unlicense" - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-indent": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swap-case": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "node_modules/swarm-js": { - "version": "0.1.42", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swarm-js/node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/swarm-js/node_modules/got": { - "version": "11.8.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/swarm-js/node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sync-request": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/table": { - "version": "6.8.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "4.4.19", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/testrpc": { - "version": "0.0.1", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/then-request": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "dev": true, - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/timed-out": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/title-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/treeify": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsort": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "dev": true, - "license": "Unlicense" - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ultron": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.4", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "5.10.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.18" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "upper-case": "^1.1.1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url-set-query": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/utf-8-validate": { - "version": "5.0.9", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.4", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/varint": { - "version": "5.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/web3": { - "version": "1.7.5", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz": { - "version": "1.7.5", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "dev": true, - "license": "MIT" - }, - "node_modules/web3-core": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-helpers": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-method": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-promievent": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-requestmanager": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-subscriptions": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "dev": true, - "license": "MIT" - }, - "node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/web3-eth": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/web3-eth-contract": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-ens": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/web3-eth-personal": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "dev": true, - "license": "MIT" - }, - "node_modules/web3-net": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-http": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh": { - "version": "1.7.5", - "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils": { - "version": "1.7.5", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/websocket": { - "version": "1.0.34", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/window-size": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/workerpool": { - "version": "6.2.1", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "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/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/write": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "dev": true, - "license": "MIT", - "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/xhr": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/xhr2-cookies": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cookiejar": "^2.1.1" - } - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "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.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" @@ -14420,10 +15,14 @@ }, "@babel/helper-validator-identifier": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/highlight": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", @@ -14433,6 +32,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -14440,6 +41,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -14449,6 +52,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -14456,18 +61,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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 }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -14477,6 +90,8 @@ }, "@babel/runtime": { "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -14484,6 +99,8 @@ }, "@ensdomains/address-encoder": { "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", "dev": true, "requires": { "bech32": "^1.1.3", @@ -14497,6 +114,8 @@ }, "@ensdomains/ens": { "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", "dev": true, "requires": { "bluebird": "^3.5.2", @@ -14508,6 +127,8 @@ }, "@ensdomains/ensjs": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", "dev": true, "requires": { "@babel/runtime": "^7.4.4", @@ -14522,6 +143,8 @@ "dependencies": { "ethers": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", + "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", "dev": true, "requires": { "@ethersproject/abi": "5.7.0", @@ -14560,10 +183,14 @@ }, "@ensdomains/resolver": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", "dev": true }, "@eslint/eslintrc": { "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -14579,6 +206,8 @@ }, "@ethereumjs/common": { "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", "dev": true, "requires": { "crc-32": "^1.2.0", @@ -14587,6 +216,8 @@ }, "@ethereumjs/tx": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", "dev": true, "requires": { "@ethereumjs/common": "^2.6.4", @@ -14595,6 +226,8 @@ }, "@ethersproject/abi": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "dev": true, "requires": { "@ethersproject/address": "^5.7.0", @@ -14610,6 +243,8 @@ }, "@ethersproject/abstract-provider": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", @@ -14623,6 +258,8 @@ }, "@ethersproject/abstract-signer": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", @@ -14634,6 +271,8 @@ }, "@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", @@ -14645,6 +284,8 @@ }, "@ethersproject/base64": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0" @@ -14652,6 +293,8 @@ }, "@ethersproject/basex": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14660,6 +303,8 @@ }, "@ethersproject/bignumber": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14669,12 +314,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "@ethersproject/bytes": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" @@ -14682,6 +331,8 @@ }, "@ethersproject/constants": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0" @@ -14689,6 +340,8 @@ }, "@ethersproject/contracts": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "dev": true, "requires": { "@ethersproject/abi": "^5.7.0", @@ -14705,6 +358,8 @@ }, "@ethersproject/hash": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", @@ -14720,6 +375,8 @@ }, "@ethersproject/hdnode": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", @@ -14738,6 +395,8 @@ }, "@ethersproject/json-wallets": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", @@ -14757,12 +416,16 @@ "dependencies": { "aes-js": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "dev": true } } }, "@ethersproject/keccak256": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14771,10 +434,14 @@ }, "@ethersproject/logger": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "dev": true }, "@ethersproject/networks": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", + "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" @@ -14782,6 +449,8 @@ }, "@ethersproject/pbkdf2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14790,6 +459,8 @@ }, "@ethersproject/properties": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" @@ -14797,6 +468,8 @@ }, "@ethersproject/providers": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", + "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", @@ -14823,13 +496,16 @@ "dependencies": { "ws": { "version": "7.4.6", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true } } }, "@ethersproject/random": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14838,6 +514,8 @@ }, "@ethersproject/rlp": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14846,6 +524,8 @@ }, "@ethersproject/sha2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14855,6 +535,8 @@ }, "@ethersproject/signing-key": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14867,12 +549,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "@ethersproject/solidity": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", @@ -14885,6 +571,8 @@ }, "@ethersproject/strings": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14894,6 +582,8 @@ }, "@ethersproject/transactions": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "dev": true, "requires": { "@ethersproject/address": "^5.7.0", @@ -14909,6 +599,8 @@ }, "@ethersproject/units": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", @@ -14918,6 +610,8 @@ }, "@ethersproject/wallet": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", @@ -14939,6 +633,8 @@ }, "@ethersproject/web": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", + "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", @@ -14950,6 +646,8 @@ }, "@ethersproject/wordlists": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", @@ -14961,10 +659,14 @@ }, "@frangio/servbot": { "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", "dev": true }, "@humanwhocodes/config-array": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", @@ -14974,10 +676,14 @@ }, "@humanwhocodes/object-schema": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@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, "requires": { "ethereumjs-abi": "^0.6.8", @@ -14989,6 +695,8 @@ "dependencies": { "@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, "requires": { "@types/node": "*" @@ -14996,6 +704,8 @@ }, "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, "requires": { "@types/bn.js": "^4.11.3", @@ -15011,14 +721,20 @@ }, "@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 }, "@noble/secp256k1": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", @@ -15027,10 +743,14 @@ }, "@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", @@ -15039,6 +759,8 @@ }, "@nomicfoundation/ethereumjs-block": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -15051,6 +773,8 @@ }, "@nomicfoundation/ethereumjs-blockchain": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", @@ -15069,6 +793,8 @@ }, "@nomicfoundation/ethereumjs-common": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-util": "^8.0.0", @@ -15077,6 +803,8 @@ }, "@nomicfoundation/ethereumjs-ethash": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", @@ -15089,6 +817,8 @@ }, "@nomicfoundation/ethereumjs-evm": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -15103,10 +833,14 @@ }, "@nomicfoundation/ethereumjs-rlp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", "dev": true }, "@nomicfoundation/ethereumjs-statemanager": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -15120,6 +854,8 @@ }, "@nomicfoundation/ethereumjs-trie": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -15130,6 +866,8 @@ }, "@nomicfoundation/ethereumjs-tx": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -15140,6 +878,8 @@ }, "@nomicfoundation/ethereumjs-util": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", @@ -15148,6 +888,8 @@ }, "@nomicfoundation/ethereumjs-vm": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", @@ -15170,6 +912,8 @@ }, "@nomicfoundation/hardhat-network-helpers": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", "dev": true, "requires": { "ethereumjs-util": "^7.1.4" @@ -15177,6 +921,8 @@ }, "@nomicfoundation/solidity-analyzer": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", "dev": true, "requires": { "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", @@ -15191,18 +937,80 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" } }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "dev": true, + "optional": true + }, "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-musl": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "dev": true, + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", "dev": true, "optional": true }, "@nomiclabs/hardhat-truffle5": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dev": true, "requires": { "@nomiclabs/truffle-contract": "^4.2.23", @@ -15214,6 +1022,8 @@ }, "@nomiclabs/hardhat-web3": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", "dev": true, "requires": { "@types/bignumber.js": "^5.0.0" @@ -15221,6 +1031,8 @@ }, "@nomiclabs/truffle-contract": { "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.0.1", @@ -15237,6 +1049,8 @@ }, "@openzeppelin/contract-loader": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", + "integrity": "sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==", "dev": true, "requires": { "find-up": "^4.1.0", @@ -15245,6 +1059,8 @@ "dependencies": { "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, "requires": { "graceful-fs": "^4.2.0", @@ -15256,6 +1072,8 @@ }, "@openzeppelin/docs-utils": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", "dev": true, "requires": { "@frangio/servbot": "^0.2.5", @@ -15271,6 +1089,8 @@ }, "@openzeppelin/test-helpers": { "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", "dev": true, "requires": { "@openzeppelin/contract-loader": "^0.6.2", @@ -15287,16 +1107,22 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "@scure/base": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", "dev": true }, "@scure/bip32": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", + "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", "dev": true, "requires": { "@noble/hashes": "~1.1.1", @@ -15306,6 +1132,8 @@ }, "@scure/bip39": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", "dev": true, "requires": { "@noble/hashes": "~1.1.1", @@ -15314,6 +1142,8 @@ }, "@sentry/core": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dev": true, "requires": { "@sentry/hub": "5.30.0", @@ -15325,6 +1155,8 @@ }, "@sentry/hub": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dev": true, "requires": { "@sentry/types": "5.30.0", @@ -15334,6 +1166,8 @@ }, "@sentry/minimal": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, "requires": { "@sentry/hub": "5.30.0", @@ -15343,6 +1177,8 @@ }, "@sentry/node": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, "requires": { "@sentry/core": "5.30.0", @@ -15358,6 +1194,8 @@ }, "@sentry/tracing": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, "requires": { "@sentry/hub": "5.30.0", @@ -15369,10 +1207,14 @@ }, "@sentry/types": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true }, "@sentry/utils": { "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, "requires": { "@sentry/types": "5.30.0", @@ -15381,10 +1223,14 @@ }, "@sindresorhus/is": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@solidity-parser/parser": { "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", + "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", "dev": true, "requires": { "antlr4ts": "^0.5.0-alpha.4" @@ -15392,6 +1238,8 @@ }, "@szmarczak/http-timer": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "requires": { "defer-to-connect": "^2.0.1" @@ -15399,6 +1247,8 @@ }, "@truffle/abi-utils": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", "dev": true, "requires": { "change-case": "3.0.2", @@ -15408,10 +1258,14 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "web3-utils": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -15427,10 +1281,14 @@ }, "@truffle/blockchain-utils": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz", + "integrity": "sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A==", "dev": true }, "@truffle/codec": { "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", "dev": true, "requires": { "@truffle/abi-utils": "^0.3.1", @@ -15447,10 +1305,14 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "web3-utils": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -15466,6 +1328,8 @@ }, "@truffle/compile-common": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", + "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", "dev": true, "requires": { "@truffle/error": "^0.1.1", @@ -15474,6 +1338,8 @@ }, "@truffle/contract": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", + "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", @@ -15494,10 +1360,14 @@ "dependencies": { "@sindresorhus/is": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, "@szmarczak/http-timer": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { "defer-to-connect": "^1.0.1" @@ -15505,10 +1375,14 @@ }, "@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "cacheable-request": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { "clone-response": "^1.0.2", @@ -15522,6 +1396,8 @@ "dependencies": { "get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -15529,12 +1405,16 @@ }, "lowercase-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true } } }, "decompress-response": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -15542,10 +1422,14 @@ }, "defer-to-connect": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, "eth-lib": { "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dev": true, "requires": { "bn.js": "^4.11.6", @@ -15555,6 +1439,8 @@ }, "get-stream": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -15562,6 +1448,8 @@ }, "got": { "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { "@sindresorhus/is": "^0.14.0", @@ -15579,10 +1467,14 @@ }, "json-buffer": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true }, "keyv": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { "json-buffer": "3.0.0" @@ -15590,18 +1482,26 @@ }, "lowercase-keys": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "normalize-url": { "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "p-cancelable": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "responselike": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, "requires": { "lowercase-keys": "^1.0.0" @@ -15609,10 +1509,14 @@ }, "uuid": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "web3": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", + "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", "dev": true, "requires": { "web3-bzz": "1.7.4", @@ -15626,6 +1530,8 @@ }, "web3-bzz": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", + "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -15635,6 +1541,8 @@ }, "web3-core": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", + "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -15648,12 +1556,16 @@ "dependencies": { "bignumber.js": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "dev": true } } }, "web3-core-helpers": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", + "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", "dev": true, "requires": { "web3-eth-iban": "1.7.4", @@ -15662,6 +1574,8 @@ }, "web3-core-method": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", + "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", @@ -15673,6 +1587,8 @@ }, "web3-core-promievent": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", + "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", "dev": true, "requires": { "eventemitter3": "4.0.4" @@ -15680,6 +1596,8 @@ }, "web3-core-requestmanager": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", + "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", "dev": true, "requires": { "util": "^0.12.0", @@ -15691,6 +1609,8 @@ }, "web3-core-subscriptions": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", + "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -15699,6 +1619,8 @@ }, "web3-eth": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", + "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -15717,6 +1639,8 @@ }, "web3-eth-abi": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", + "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", @@ -15725,6 +1649,8 @@ }, "web3-eth-accounts": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", + "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", @@ -15742,6 +1668,8 @@ }, "web3-eth-contract": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", + "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -15756,6 +1684,8 @@ }, "web3-eth-ens": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", + "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", "dev": true, "requires": { "content-hash": "^2.5.2", @@ -15770,6 +1700,8 @@ }, "web3-eth-iban": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", + "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -15778,12 +1710,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "web3-eth-personal": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", + "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -15796,6 +1732,8 @@ }, "web3-net": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", + "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -15805,6 +1743,8 @@ }, "web3-providers-http": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", + "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", "dev": true, "requires": { "web3-core-helpers": "1.7.4", @@ -15813,6 +1753,8 @@ }, "web3-providers-ipc": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", + "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", "dev": true, "requires": { "oboe": "2.1.5", @@ -15821,6 +1763,8 @@ }, "web3-providers-ws": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", + "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -15830,6 +1774,8 @@ }, "web3-shh": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", + "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -15840,6 +1786,8 @@ }, "web3-utils": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -15853,6 +1801,8 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } @@ -15861,6 +1811,8 @@ }, "@truffle/contract-schema": { "version": "3.4.9", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", + "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", "dev": true, "requires": { "ajv": "^6.10.0", @@ -15869,6 +1821,8 @@ }, "@truffle/debug-utils": { "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", "dev": true, "requires": { "@truffle/codec": "^0.14.4", @@ -15881,6 +1835,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -15888,10 +1844,14 @@ }, "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -15901,6 +1861,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -15908,18 +1870,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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 }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -15929,10 +1899,14 @@ }, "@truffle/error": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", "dev": true }, "@truffle/interface-adapter": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.21.tgz", + "integrity": "sha512-2ltbu3upsWS0TAQu1kLQc048XlXNmDkCzH6iebX4dg3VBB+l7oG/pu5+/kl8t+LRfzGoEMLKwOQt7vk0Vm3PNA==", "dev": true, "requires": { "bn.js": "^5.1.3", @@ -15942,10 +1916,14 @@ "dependencies": { "@sindresorhus/is": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, "@szmarczak/http-timer": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { "defer-to-connect": "^1.0.1" @@ -15953,18 +1931,26 @@ }, "@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "bignumber.js": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "dev": true }, "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "cacheable-request": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { "clone-response": "^1.0.2", @@ -15978,6 +1964,8 @@ "dependencies": { "get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -15985,12 +1973,16 @@ }, "lowercase-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true } } }, "decompress-response": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -15998,10 +1990,14 @@ }, "defer-to-connect": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, "eth-lib": { "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dev": true, "requires": { "bn.js": "^4.11.6", @@ -16011,12 +2007,16 @@ "dependencies": { "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 } } }, "get-stream": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -16024,6 +2024,8 @@ }, "got": { "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { "@sindresorhus/is": "^0.14.0", @@ -16041,10 +2043,14 @@ }, "json-buffer": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true }, "keyv": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { "json-buffer": "3.0.0" @@ -16052,18 +2058,26 @@ }, "lowercase-keys": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "normalize-url": { "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "p-cancelable": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "responselike": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, "requires": { "lowercase-keys": "^1.0.0" @@ -16071,10 +2085,14 @@ }, "uuid": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "web3": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", + "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", "dev": true, "requires": { "web3-bzz": "1.7.4", @@ -16088,6 +2106,8 @@ }, "web3-bzz": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", + "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -16097,6 +2117,8 @@ }, "web3-core": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", + "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -16110,6 +2132,8 @@ }, "web3-core-helpers": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", + "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", "dev": true, "requires": { "web3-eth-iban": "1.7.4", @@ -16118,6 +2142,8 @@ }, "web3-core-method": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", + "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", @@ -16129,6 +2155,8 @@ }, "web3-core-promievent": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", + "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", "dev": true, "requires": { "eventemitter3": "4.0.4" @@ -16136,6 +2164,8 @@ }, "web3-core-requestmanager": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", + "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", "dev": true, "requires": { "util": "^0.12.0", @@ -16147,6 +2177,8 @@ }, "web3-core-subscriptions": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", + "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -16155,6 +2187,8 @@ }, "web3-eth": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", + "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -16173,6 +2207,8 @@ }, "web3-eth-abi": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", + "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", @@ -16181,6 +2217,8 @@ }, "web3-eth-accounts": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", + "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", @@ -16198,6 +2236,8 @@ }, "web3-eth-contract": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", + "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -16212,6 +2252,8 @@ }, "web3-eth-ens": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", + "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", "dev": true, "requires": { "content-hash": "^2.5.2", @@ -16226,6 +2268,8 @@ }, "web3-eth-iban": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", + "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -16234,6 +2278,8 @@ }, "web3-eth-personal": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", + "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -16246,6 +2292,8 @@ }, "web3-net": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", + "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -16255,6 +2303,8 @@ }, "web3-providers-http": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", + "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", "dev": true, "requires": { "web3-core-helpers": "1.7.4", @@ -16263,6 +2313,8 @@ }, "web3-providers-ipc": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", + "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", "dev": true, "requires": { "oboe": "2.1.5", @@ -16271,6 +2323,8 @@ }, "web3-providers-ws": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", + "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -16280,6 +2334,8 @@ }, "web3-shh": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", + "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", "dev": true, "requires": { "web3-core": "1.7.4", @@ -16290,6 +2346,8 @@ }, "web3-utils": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -16305,6 +2363,8 @@ }, "@trufflesuite/chromafi": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", "dev": true, "requires": { "camelcase": "^4.1.0", @@ -16319,6 +2379,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -16326,6 +2388,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -16335,6 +2399,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -16342,18 +2408,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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 }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -16363,10 +2437,14 @@ }, "@types/async-eventemitter": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, "@types/bignumber.js": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", "dev": true, "requires": { "bignumber.js": "*" @@ -16374,6 +2452,8 @@ }, "@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==", "dev": true, "requires": { "@types/node": "*" @@ -16381,6 +2461,8 @@ }, "@types/cacheable-request": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", "dev": true, "requires": { "@types/http-cache-semantics": "*", @@ -16391,10 +2473,14 @@ }, "@types/chai": { "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", "dev": true }, "@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, "requires": { "@types/node": "*" @@ -16402,6 +2488,8 @@ }, "@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==", "dev": true, "requires": { "@types/node": "*" @@ -16409,6 +2497,8 @@ }, "@types/glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -16417,14 +2507,20 @@ }, "@types/http-cache-semantics": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, "@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/keyv": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { "@types/node": "*" @@ -16432,18 +2528,26 @@ }, "@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 }, "@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 }, "@types/node": { "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", "dev": true }, "@types/pbkdf2": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dev": true, "requires": { "@types/node": "*" @@ -16451,10 +2555,14 @@ }, "@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==", "dev": true }, "@types/responselike": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dev": true, "requires": { "@types/node": "*" @@ -16462,6 +2570,8 @@ }, "@types/secp256k1": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", "dev": true, "requires": { "@types/node": "*" @@ -16469,14 +2579,20 @@ }, "@ungap/promise-all-settled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, "abbrev": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true }, "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, "requires": { "event-target-shim": "^5.0.0" @@ -16484,10 +2600,14 @@ }, "abortcontroller-polyfill": { "version": "1.7.3", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", + "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", "dev": true }, "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, "requires": { "buffer": "^6.0.3", @@ -16501,6 +2621,8 @@ "dependencies": { "buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -16511,6 +2633,8 @@ }, "accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { "mime-types": "~2.1.34", @@ -16519,27 +2643,38 @@ }, "acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { "version": "5.3.2", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true }, "address": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "dev": true }, "adm-zip": { "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, "aes-js": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", "dev": true }, "agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" @@ -16547,6 +2682,8 @@ }, "aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -16555,6 +2692,8 @@ }, "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -16565,15 +2704,21 @@ }, "amdefine": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, "optional": true }, "ansi-colors": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, "ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" @@ -16581,16 +2726,22 @@ "dependencies": { "type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, "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 }, "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, "requires": { "color-convert": "^2.0.1" @@ -16598,14 +2749,20 @@ }, "antlr4": { "version": "4.7.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", + "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", "dev": true }, "antlr4ts": { "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", "dev": true }, "anymatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -16614,6 +2771,8 @@ }, "argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -16621,10 +2780,14 @@ }, "array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "array-includes": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -16636,14 +2799,20 @@ }, "array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, "array-uniq": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, "array.prototype.flat": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -16654,6 +2823,8 @@ }, "array.prototype.reduce": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -16665,10 +2836,14 @@ }, "asap": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "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, "requires": { "safer-buffer": "~2.1.0" @@ -16676,6 +2851,8 @@ }, "asn1.js": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -16686,22 +2863,32 @@ }, "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 }, "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 }, "ast-parents": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", "dev": true }, "astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -16709,6 +2896,8 @@ }, "async-eventemitter": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "dev": true, "requires": { "async": "^2.4.0" @@ -16716,30 +2905,44 @@ }, "async-limiter": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "available-typed-arrays": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, "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 }, "aws4": { "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base-x": { "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -16747,10 +2950,14 @@ }, "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 }, "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, "requires": { "tweetnacl": "^0.14.3" @@ -16758,24 +2965,34 @@ "dependencies": { "tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true } } }, "bech32": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, "big-integer": { "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", "dev": true }, "big.js": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", "dev": true }, "bigint-crypto-utils": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", "dev": true, "requires": { "bigint-mod-arith": "^3.1.0" @@ -16783,30 +3000,44 @@ }, "bigint-mod-arith": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", "dev": true }, "bignumber.js": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "dev": true }, "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 }, "blakejs": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", "dev": true }, "bluebird": { "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "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 }, "body-parser": { "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { "bytes": "3.1.2", @@ -16825,6 +3056,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -16832,10 +3065,14 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -16843,6 +3080,8 @@ }, "qs": { "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -16852,10 +3091,14 @@ }, "boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -16864,6 +3107,8 @@ }, "braces": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -16871,10 +3116,14 @@ }, "brorand": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "browser-level": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dev": true, "requires": { "abstract-level": "^1.0.2", @@ -16885,10 +3134,14 @@ }, "browser-stdout": { "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 }, "browserify-aes": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -16901,6 +3154,8 @@ }, "browserify-cipher": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -16910,6 +3165,8 @@ }, "browserify-des": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -16920,6 +3177,8 @@ }, "browserify-rsa": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { "bn.js": "^5.0.0", @@ -16928,12 +3187,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "browserify-sign": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", @@ -16949,12 +3212,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "bs58": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dev": true, "requires": { "base-x": "^3.0.2" @@ -16962,6 +3229,8 @@ }, "bs58check": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, "requires": { "bs58": "^4.0.0", @@ -16971,6 +3240,8 @@ }, "buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -16979,22 +3250,32 @@ }, "buffer-from": { "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 }, "buffer-reverse": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", + "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", "dev": true }, "buffer-to-arraybuffer": { "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", "dev": true }, "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 }, "bufferutil": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", "dev": true, "requires": { "node-gyp-build": "^4.3.0" @@ -17002,14 +3283,20 @@ }, "bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "cacheable-lookup": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", "dev": true }, "cacheable-request": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "dev": true, "requires": { "clone-response": "^1.0.2", @@ -17023,6 +3310,8 @@ "dependencies": { "get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -17030,12 +3319,16 @@ }, "lowercase-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true } } }, "call-bind": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -17044,6 +3337,8 @@ }, "caller-callsite": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "requires": { "callsites": "^2.0.0" @@ -17051,12 +3346,16 @@ "dependencies": { "callsites": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true } } }, "caller-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "requires": { "caller-callsite": "^2.0.0" @@ -17064,10 +3363,14 @@ }, "callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camel-case": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", "dev": true, "requires": { "no-case": "^2.2.0", @@ -17076,18 +3379,26 @@ }, "camelcase": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true }, "caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "catering": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "dev": true }, "cbor": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dev": true, "requires": { "bignumber.js": "^9.0.1", @@ -17096,12 +3407,16 @@ "dependencies": { "bignumber.js": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "dev": true } } }, "chai": { "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "requires": { "assertion-error": "^1.1.0", @@ -17115,11 +3430,14 @@ }, "chai-bn": { "version": "0.2.2", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz", + "integrity": "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==", + "dev": true }, "chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -17128,6 +3446,8 @@ }, "change-case": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", "dev": true, "requires": { "camel-case": "^3.0.0", @@ -17152,18 +3472,26 @@ }, "chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true }, "check-error": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true }, "cheerio": { "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dev": true, "requires": { "cheerio-select": "^2.1.0", @@ -17177,6 +3505,8 @@ }, "cheerio-select": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, "requires": { "boolbase": "^1.0.0", @@ -17189,6 +3519,8 @@ }, "chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -17203,14 +3535,20 @@ }, "chownr": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "ci-info": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cids": { "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -17222,6 +3560,8 @@ "dependencies": { "multicodec": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", "dev": true, "requires": { "buffer": "^5.6.0", @@ -17232,6 +3572,8 @@ }, "cipher-base": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -17240,10 +3582,14 @@ }, "class-is": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", "dev": true }, "classic-level": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", "dev": true, "requires": { "abstract-level": "^1.0.2", @@ -17255,10 +3601,14 @@ }, "clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -17266,6 +3616,8 @@ }, "cli-table3": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, "requires": { "colors": "^1.1.2", @@ -17275,10 +3627,14 @@ }, "cli-width": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -17288,18 +3644,26 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "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 }, "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 }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -17309,6 +3673,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -17318,6 +3684,8 @@ }, "clone-response": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -17325,10 +3693,14 @@ }, "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 }, "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, "requires": { "color-name": "~1.1.4" @@ -17336,14 +3708,20 @@ }, "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 }, "colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -17351,18 +3729,26 @@ }, "command-exists": { "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 }, "commander": { "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, "concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "concat-stream": { "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -17373,6 +3759,8 @@ "dependencies": { "readable-stream": { "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -17386,10 +3774,14 @@ }, "safe-buffer": { "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 }, "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, "requires": { "safe-buffer": "~5.1.0" @@ -17399,6 +3791,8 @@ }, "constant-case": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", "dev": true, "requires": { "snake-case": "^2.1.0", @@ -17407,6 +3801,8 @@ }, "content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { "safe-buffer": "5.2.1" @@ -17414,6 +3810,8 @@ }, "content-hash": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dev": true, "requires": { "cids": "^0.7.1", @@ -17423,26 +3821,38 @@ }, "content-type": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "cookiejar": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "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 }, "cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { "object-assign": "^4", @@ -17451,6 +3861,8 @@ }, "cosmiconfig": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { "import-fresh": "^2.0.0", @@ -17461,6 +3873,8 @@ "dependencies": { "import-fresh": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "requires": { "caller-path": "^2.0.0", @@ -17469,16 +3883,22 @@ }, "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 } } }, "crc-32": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true }, "create-ecdh": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -17487,6 +3907,8 @@ }, "create-hash": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -17498,6 +3920,8 @@ }, "create-hmac": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -17510,6 +3934,8 @@ }, "cross-fetch": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dev": true, "requires": { "node-fetch": "2.6.7" @@ -17517,6 +3943,8 @@ }, "cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -17526,10 +3954,14 @@ }, "crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true }, "crypto-addr-codec": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", "dev": true, "requires": { "base-x": "^3.0.8", @@ -17543,6 +3975,8 @@ }, "crypto-browserify": { "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -17560,10 +3994,14 @@ }, "crypto-js": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", "dev": true }, "css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", @@ -17575,10 +4013,14 @@ }, "css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "d": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { "es5-ext": "^0.10.50", @@ -17587,6 +4029,8 @@ }, "dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -17594,10 +4038,14 @@ }, "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 }, "debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -17605,14 +4053,20 @@ }, "decamelize": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, "decode-uri-component": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", "dev": true }, "decompress-response": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { "mimic-response": "^3.1.0" @@ -17620,12 +4074,16 @@ "dependencies": { "mimic-response": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true } } }, "deep-eql": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -17633,14 +4091,20 @@ }, "deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "defer-to-connect": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, "define-properties": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", @@ -17649,14 +4113,20 @@ }, "delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "des.js": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -17665,14 +4135,20 @@ }, "destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-indent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true }, "detect-port": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", "dev": true, "requires": { "address": "^1.0.1", @@ -17681,6 +4157,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -17688,16 +4166,22 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "diff": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "diffie-hellman": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -17707,6 +4191,8 @@ }, "difflib": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "requires": { "heap": ">= 0.2.0" @@ -17714,6 +4200,8 @@ }, "dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { "path-type": "^4.0.0" @@ -17721,6 +4209,8 @@ }, "doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -17728,6 +4218,8 @@ }, "dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { "domelementtype": "^2.3.0", @@ -17737,14 +4229,20 @@ }, "dom-walk": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", "dev": true }, "domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { "domelementtype": "^2.3.0" @@ -17752,6 +4250,8 @@ }, "domutils": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { "dom-serializer": "^2.0.0", @@ -17761,6 +4261,8 @@ }, "dot-case": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", "dev": true, "requires": { "no-case": "^2.2.0" @@ -17768,10 +4270,14 @@ }, "duplexer3": { "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, "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, "requires": { "jsbn": "~0.1.0", @@ -17780,10 +4286,14 @@ }, "ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "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, "requires": { "bn.js": "^4.11.9", @@ -17797,14 +4307,20 @@ }, "emoji-regex": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", + "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", "dev": true }, "encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -17812,6 +4328,8 @@ }, "enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" @@ -17819,20 +4337,28 @@ "dependencies": { "ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true } } }, "entities": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "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, "requires": { "is-arrayish": "^0.2.1" @@ -17840,6 +4366,8 @@ }, "es-abstract": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17869,10 +4397,14 @@ }, "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 }, "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, "requires": { "has": "^1.0.3" @@ -17880,6 +4412,8 @@ }, "es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -17889,6 +4423,8 @@ }, "es5-ext": { "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, "requires": { "es6-iterator": "^2.0.3", @@ -17898,6 +4434,8 @@ }, "es6-iterator": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "requires": { "d": "1", @@ -17907,10 +4445,14 @@ }, "es6-promise": { "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-symbol": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, "requires": { "d": "^1.0.1", @@ -17919,18 +4461,26 @@ }, "escalade": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "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 }, "escodegen": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, "requires": { "esprima": "^2.7.1", @@ -17942,14 +4492,20 @@ "dependencies": { "esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true }, "estraverse": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true }, "levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -17958,6 +4514,8 @@ }, "optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", @@ -17970,10 +4528,14 @@ }, "prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -17983,6 +4545,8 @@ }, "eslint": { "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", @@ -18029,10 +4593,14 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -18041,6 +4609,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -18050,11 +4620,14 @@ }, "eslint-config-standard": { "version": "16.0.3", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", + "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { "debug": "^3.2.7", @@ -18063,6 +4636,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -18072,6 +4647,8 @@ }, "eslint-module-utils": { "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { "debug": "^3.2.7" @@ -18079,6 +4656,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -18088,6 +4667,8 @@ }, "eslint-plugin-es": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "requires": { "eslint-utils": "^2.0.0", @@ -18096,6 +4677,8 @@ }, "eslint-plugin-import": { "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -18115,6 +4698,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -18122,6 +4707,8 @@ }, "doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -18129,12 +4716,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "eslint-plugin-mocha": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", + "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", "dev": true, "requires": { "eslint-utils": "^3.0.0", @@ -18143,6 +4734,8 @@ "dependencies": { "eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" @@ -18152,6 +4745,8 @@ }, "eslint-plugin-node": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, "requires": { "eslint-plugin-es": "^3.0.0", @@ -18164,21 +4759,28 @@ "dependencies": { "ignore": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "eslint-plugin-promise": { "version": "5.2.0", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", + "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "dev": true }, "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==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -18187,6 +4789,8 @@ }, "eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -18194,16 +4798,22 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", @@ -18213,16 +4823,22 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -18230,12 +4846,16 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" @@ -18243,24 +4863,34 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "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, "requires": { "idna-uts46-hx": "^2.3.1", @@ -18269,12 +4899,16 @@ "dependencies": { "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 } } }, "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==", "dev": true, "requires": { "@ethersproject/abi": "^5.0.0-beta.146", @@ -18296,14 +4930,20 @@ "dependencies": { "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 }, "ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -18311,10 +4951,14 @@ }, "camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -18324,6 +4968,8 @@ "dependencies": { "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -18333,6 +4979,8 @@ }, "chokidar": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -18347,6 +4995,8 @@ }, "cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", @@ -18356,6 +5006,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -18363,10 +5015,14 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "debug": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -18374,22 +5030,32 @@ }, "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 }, "diff": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "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 }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "ethereum-cryptography": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", "dev": true, "requires": { "@noble/hashes": "1.1.2", @@ -18400,6 +5066,8 @@ }, "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, "requires": { "locate-path": "^3.0.0" @@ -18407,13 +5075,24 @@ }, "flat": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, "requires": { "is-buffer": "~2.0.3" } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "glob": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -18426,10 +5105,14 @@ }, "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 }, "js-yaml": { "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -18438,6 +5121,8 @@ }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -18446,6 +5131,8 @@ }, "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==", "dev": true, "requires": { "chalk": "^2.4.2" @@ -18453,6 +5140,8 @@ }, "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -18460,6 +5149,8 @@ }, "mkdirp": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -18467,6 +5158,8 @@ }, "mocha": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -18497,10 +5190,14 @@ }, "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 }, "object.assign": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -18511,6 +5208,8 @@ }, "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, "requires": { "p-limit": "^2.0.0" @@ -18518,10 +5217,14 @@ }, "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 }, "readdirp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { "picomatch": "^2.0.4" @@ -18529,6 +5232,8 @@ }, "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==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -18538,6 +5243,8 @@ }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -18545,10 +5252,14 @@ }, "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==", "dev": true }, "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==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -18556,6 +5267,8 @@ }, "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -18563,6 +5276,8 @@ }, "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==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -18572,10 +5287,14 @@ }, "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 }, "yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -18592,6 +5311,8 @@ }, "yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -18600,6 +5321,8 @@ }, "yargs-unparser": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", @@ -18611,6 +5334,8 @@ }, "eth-lib": { "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "dev": true, "requires": { "bn.js": "^4.11.6", @@ -18623,10 +5348,14 @@ "dependencies": { "safe-buffer": { "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 }, "ws": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { "async-limiter": "~1.0.0", @@ -18638,6 +5367,8 @@ }, "eth-sig-util": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.1.tgz", + "integrity": "sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==", "dev": true, "requires": { "ethereumjs-abi": "^0.6.8", @@ -18648,6 +5379,8 @@ "dependencies": { "ethereumjs-util": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dev": true, "requires": { "bn.js": "^4.11.0", @@ -18663,6 +5396,8 @@ }, "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, "requires": { "js-sha3": "^0.8.0" @@ -18670,6 +5405,8 @@ }, "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, "requires": { "@types/pbkdf2": "^3.0.0", @@ -18691,6 +5428,8 @@ }, "ethereum-ens": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", "dev": true, "requires": { "bluebird": "^3.4.7", @@ -18703,12 +5442,16 @@ "dependencies": { "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 } } }, "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, "requires": { "bn.js": "^4.11.8", @@ -18717,6 +5460,8 @@ "dependencies": { "@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, "requires": { "@types/node": "*" @@ -18724,6 +5469,8 @@ }, "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, "requires": { "@types/bn.js": "^4.11.3", @@ -18739,6 +5486,8 @@ }, "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, "requires": { "@types/bn.js": "^5.1.0", @@ -18750,12 +5499,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "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, "requires": { "aes-js": "^3.1.2", @@ -18770,6 +5523,8 @@ }, "ethers": { "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dev": true, "requires": { "aes-js": "3.0.0", @@ -18785,10 +5540,14 @@ "dependencies": { "aes-js": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "dev": true }, "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==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -18797,24 +5556,34 @@ }, "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 }, "scrypt-js": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", "dev": true }, "setimmediate": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", "dev": true }, "uuid": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", "dev": true } } }, "ethjs-abi": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", + "integrity": "sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==", "dev": true, "requires": { "bn.js": "4.11.6", @@ -18824,16 +5593,22 @@ "dependencies": { "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 }, "js-sha3": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", + "integrity": "sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==", "dev": true } } }, "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, "requires": { "bn.js": "4.11.6", @@ -18842,12 +5617,16 @@ "dependencies": { "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 } } }, "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, "requires": { "is-hex-prefixed": "1.0.0", @@ -18856,14 +5635,20 @@ }, "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 }, "eventemitter3": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "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, "requires": { "md5.js": "^1.3.4", @@ -18872,6 +5657,8 @@ }, "express": { "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "requires": { "accepts": "~1.3.8", @@ -18909,10 +5696,14 @@ "dependencies": { "cookie": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -18920,6 +5711,8 @@ }, "finalhandler": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "debug": "2.6.9", @@ -18933,10 +5726,14 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -18944,6 +5741,8 @@ }, "qs": { "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -18951,12 +5750,16 @@ }, "statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, "ext": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "requires": { "type": "^2.7.2" @@ -18964,16 +5767,22 @@ "dependencies": { "type": { "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true } } }, "extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -18983,10 +5792,14 @@ }, "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 }, "fast-check": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", "dev": true, "requires": { "pure-rand": "^5.0.1" @@ -18994,14 +5807,20 @@ }, "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 }, "fast-diff": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, "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, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -19013,14 +5832,20 @@ }, "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 }, "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 }, "fastq": { "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -19028,6 +5853,8 @@ }, "figures": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -19035,12 +5862,16 @@ "dependencies": { "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } }, "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, "requires": { "flat-cache": "^3.0.4" @@ -19048,6 +5879,8 @@ }, "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, "requires": { "to-regex-range": "^5.0.1" @@ -19055,6 +5888,8 @@ }, "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -19063,10 +5898,14 @@ }, "flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, "flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", @@ -19075,14 +5914,20 @@ }, "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 }, "follow-redirects": { "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", "dev": true }, "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, "requires": { "is-callable": "^1.1.3" @@ -19090,10 +5935,14 @@ }, "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 }, "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, "requires": { "asynckit": "^0.4.0", @@ -19103,22 +5952,32 @@ }, "form-data-encoder": { "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", "dev": true }, "forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "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 }, "fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "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, "requires": { "graceful-fs": "^4.1.2", @@ -19128,6 +5987,8 @@ }, "fs-minipass": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { "minipass": "^2.6.0" @@ -19135,18 +5996,33 @@ }, "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 }, "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 }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "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, "requires": { "call-bind": "^1.0.2", @@ -19157,22 +6033,32 @@ }, "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 }, "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 }, "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 }, "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 }, "get-intrinsic": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -19182,14 +6068,20 @@ }, "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 }, "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 }, "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, "requires": { "call-bind": "^1.0.2", @@ -19198,6 +6090,8 @@ }, "getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -19205,6 +6099,8 @@ }, "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, "requires": { "chalk": "^2.4.2", @@ -19213,6 +6109,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -19220,6 +6118,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -19229,6 +6129,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -19236,18 +6138,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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 }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -19257,6 +6167,8 @@ }, "glob": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -19268,6 +6180,8 @@ "dependencies": { "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, "requires": { "balanced-match": "^1.0.0" @@ -19275,6 +6189,8 @@ }, "minimatch": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -19284,6 +6200,8 @@ }, "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, "requires": { "is-glob": "^4.0.1" @@ -19291,6 +6209,8 @@ }, "global": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dev": true, "requires": { "min-document": "^2.19.0", @@ -19299,6 +6219,8 @@ }, "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, "requires": { "global-prefix": "^3.0.0" @@ -19306,6 +6228,8 @@ }, "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, "requires": { "ini": "^1.3.5", @@ -19315,6 +6239,8 @@ "dependencies": { "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -19324,6 +6250,8 @@ }, "globals": { "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -19331,6 +6259,8 @@ }, "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, "requires": { "@types/glob": "^7.1.1", @@ -19345,6 +6275,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -19357,12 +6289,16 @@ }, "ignore": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true } } }, "got": { "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", "dev": true, "requires": { "@sindresorhus/is": "^4.6.0", @@ -19382,10 +6318,14 @@ }, "graceful-fs": { "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "graphlib": { "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", "dev": true, "requires": { "lodash": "^4.17.15" @@ -19393,10 +6333,14 @@ }, "growl": { "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "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, "requires": { "minimist": "^1.2.5", @@ -19408,16 +6352,22 @@ "dependencies": { "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 } } }, "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 }, "har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { "ajv": "^6.12.3", @@ -19426,6 +6376,8 @@ }, "hardhat": { "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", @@ -19482,6 +6434,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -19489,6 +6443,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -19498,6 +6454,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -19505,18 +6463,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "commander": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "ethereum-cryptography": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", "dev": true, "requires": { "@noble/hashes": "1.1.2", @@ -19527,6 +6493,8 @@ }, "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, "requires": { "locate-path": "^2.0.0" @@ -19534,6 +6502,8 @@ }, "glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -19546,10 +6516,14 @@ }, "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 }, "jsonfile": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -19557,6 +6531,8 @@ }, "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, "requires": { "p-locate": "^2.0.0", @@ -19565,6 +6541,8 @@ }, "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, "requires": { "p-try": "^1.0.0" @@ -19572,6 +6550,8 @@ }, "p-locate": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -19579,18 +6559,26 @@ }, "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==", "dev": true }, "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 }, "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 }, "resolve": { "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -19598,6 +6586,8 @@ }, "rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -19605,10 +6595,14 @@ }, "semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "solc": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, "requires": { "command-exists": "^1.2.8", @@ -19624,6 +6618,8 @@ "dependencies": { "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, "requires": { "graceful-fs": "^4.1.2", @@ -19635,12 +6631,16 @@ }, "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -19650,6 +6650,8 @@ }, "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, "requires": { "array-uniq": "1.0.3", @@ -19659,6 +6661,8 @@ }, "hardhat-ignore-warnings": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", "dev": true, "requires": { "minimatch": "^5.1.0", @@ -19668,6 +6672,8 @@ "dependencies": { "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, "requires": { "balanced-match": "^1.0.0" @@ -19675,6 +6681,8 @@ }, "minimatch": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -19684,6 +6692,8 @@ }, "has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -19691,14 +6701,20 @@ }, "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 }, "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 }, "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, "requires": { "get-intrinsic": "^1.1.1" @@ -19706,10 +6722,14 @@ }, "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 }, "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, "requires": { "has-symbols": "^1.0.2" @@ -19717,6 +6737,8 @@ }, "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, "requires": { "inherits": "^2.0.4", @@ -19726,6 +6748,8 @@ }, "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, "requires": { "inherits": "^2.0.3", @@ -19734,10 +6758,14 @@ }, "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 }, "header-case": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", "dev": true, "requires": { "no-case": "^2.2.0", @@ -19746,18 +6774,26 @@ }, "heap": { "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, "highlight.js": { "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true }, "highlightjs-solidity": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz", + "integrity": "sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg==", "dev": true }, "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, "requires": { "hash.js": "^1.0.3", @@ -19767,10 +6803,14 @@ }, "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 }, "htmlparser2": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "dev": true, "requires": { "domelementtype": "^2.3.0", @@ -19781,6 +6821,8 @@ }, "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, "requires": { "caseless": "^0.12.0", @@ -19791,10 +6833,14 @@ }, "http-cache-semantics": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, "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, "requires": { "depd": "2.0.0", @@ -19806,16 +6852,22 @@ "dependencies": { "statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, "http-https": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, "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, "requires": { "@types/node": "^10.0.3" @@ -19823,12 +6875,16 @@ "dependencies": { "@types/node": { "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true } } }, "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, "requires": { "assert-plus": "^1.0.0", @@ -19838,6 +6894,8 @@ }, "http2-wrapper": { "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", "dev": true, "requires": { "quick-lru": "^5.1.1", @@ -19846,6 +6904,8 @@ }, "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, "requires": { "agent-base": "6", @@ -19854,6 +6914,8 @@ }, "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, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -19861,6 +6923,8 @@ }, "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, "requires": { "punycode": "2.1.0" @@ -19868,18 +6932,26 @@ }, "ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "immutable": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "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, "requires": { "parent-module": "^1.0.0", @@ -19888,14 +6960,20 @@ }, "imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "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 }, "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, "requires": { "once": "^1.3.0", @@ -19904,14 +6982,20 @@ }, "inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inquirer": { "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -19931,14 +7015,20 @@ "dependencies": { "ansi-escapes": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -19946,6 +7036,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -19955,6 +7047,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -19962,18 +7056,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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 }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -19981,6 +7083,8 @@ }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -19990,6 +7094,8 @@ }, "internal-slot": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { "get-intrinsic": "^1.1.0", @@ -19999,14 +7105,20 @@ }, "interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "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 }, "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, "requires": { "fp-ts": "^1.0.0" @@ -20014,10 +7126,14 @@ }, "ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, "is-arguments": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20026,10 +7142,14 @@ }, "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 }, "is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" @@ -20037,6 +7157,8 @@ }, "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, "requires": { "binary-extensions": "^2.0.0" @@ -20044,6 +7166,8 @@ }, "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, "requires": { "call-bind": "^1.0.2", @@ -20052,14 +7176,20 @@ }, "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 }, "is-callable": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", "dev": true }, "is-core-module": { "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -20067,6 +7197,8 @@ }, "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, "requires": { "has-tostringtag": "^1.0.0" @@ -20074,22 +7206,32 @@ }, "is-directory": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true }, "is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "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 }, "is-function": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", "dev": true }, "is-generator-function": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -20097,6 +7239,8 @@ }, "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, "requires": { "is-extglob": "^2.1.1" @@ -20104,10 +7248,14 @@ }, "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 }, "is-lower-case": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", "dev": true, "requires": { "lower-case": "^1.1.0" @@ -20115,14 +7263,20 @@ }, "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 }, "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 }, "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, "requires": { "has-tostringtag": "^1.0.0" @@ -20130,14 +7284,20 @@ }, "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 }, "is-port-reachable": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", + "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", "dev": true }, "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, "requires": { "call-bind": "^1.0.2", @@ -20146,6 +7306,8 @@ }, "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, "requires": { "call-bind": "^1.0.2" @@ -20153,6 +7315,8 @@ }, "is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -20160,6 +7324,8 @@ }, "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, "requires": { "has-symbols": "^1.0.2" @@ -20167,6 +7333,8 @@ }, "is-typed-array": { "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", @@ -20178,14 +7346,20 @@ }, "is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "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 }, "is-upper-case": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", "dev": true, "requires": { "upper-case": "^1.1.0" @@ -20193,10 +7367,14 @@ }, "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 }, "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, "requires": { "call-bind": "^1.0.2" @@ -20204,26 +7382,38 @@ }, "isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "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 }, "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 }, "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, "requires": { "argparse": "^1.0.7", @@ -20232,34 +7422,50 @@ }, "jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "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 }, "json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "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 }, "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 }, "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 }, "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 }, "jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -20267,10 +7473,14 @@ }, "jsonschema": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true }, "jsprim": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -20281,6 +7491,8 @@ }, "keccak": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", "dev": true, "requires": { "node-addon-api": "^2.0.0", @@ -20290,6 +7502,8 @@ }, "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, "requires": { "bn.js": "^5.2.0", @@ -20299,10 +7513,14 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, "buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -20313,6 +7531,8 @@ }, "keyv": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -20320,10 +7540,14 @@ }, "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 }, "klaw": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -20331,6 +7555,8 @@ }, "lcid": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -20338,6 +7564,8 @@ }, "level": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "requires": { "browser-level": "^1.0.1", @@ -20346,10 +7574,14 @@ }, "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 }, "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, "requires": { "buffer": "^6.0.3", @@ -20358,6 +7590,8 @@ "dependencies": { "buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -20368,6 +7602,8 @@ }, "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, "requires": { "prelude-ls": "^1.2.1", @@ -20376,6 +7612,8 @@ }, "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, "requires": { "graceful-fs": "^4.1.2", @@ -20387,6 +7625,8 @@ "dependencies": { "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, "requires": { "error-ex": "^1.2.0" @@ -20394,10 +7634,14 @@ }, "pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, "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, "requires": { "is-utf8": "^0.2.0" @@ -20407,6 +7651,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -20414,34 +7660,50 @@ }, "lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "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 }, "lodash.flatten": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "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 }, "lodash.startcase": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, "lodash.truncate": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "lodash.zip": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "dev": true }, "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, "requires": { "chalk": "^4.1.0", @@ -20450,6 +7712,8 @@ "dependencies": { "chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -20460,6 +7724,8 @@ }, "loupe": { "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, "requires": { "get-func-name": "^2.0.0" @@ -20467,10 +7733,14 @@ }, "lower-case": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", "dev": true }, "lower-case-first": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", "dev": true, "requires": { "lower-case": "^1.1.2" @@ -20478,29 +7748,41 @@ }, "lowercase-keys": { "version": "3.0.0", - "dev": true - }, - "lru_map": { - "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true }, "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, "requires": { "yallist": "^3.0.2" } }, + "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 + }, "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 }, "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 }, "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, "requires": { "hash-base": "^3.0.0", @@ -20510,10 +7792,14 @@ }, "media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "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, "requires": { "abstract-level": "^1.0.0", @@ -20523,18 +7809,26 @@ }, "memorystream": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true }, "merge-descriptors": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "merkletreejs": { "version": "0.2.32", + "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", + "integrity": "sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==", "dev": true, "requires": { "bignumber.js": "^9.0.1", @@ -20546,16 +7840,22 @@ "dependencies": { "bignumber.js": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "dev": true } } }, "methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { "braces": "^3.0.2", @@ -20564,6 +7864,8 @@ }, "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, "requires": { "bn.js": "^4.0.0", @@ -20572,14 +7874,20 @@ }, "mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "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 }, "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, "requires": { "mime-db": "1.52.0" @@ -20587,14 +7895,20 @@ }, "mimic-fn": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "mimic-response": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, "min-document": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dev": true, "requires": { "dom-walk": "^0.1.0" @@ -20602,14 +7916,20 @@ }, "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 }, "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 }, "minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -20617,10 +7937,14 @@ }, "minimist": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -20629,6 +7953,8 @@ }, "minizlib": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { "minipass": "^2.9.0" @@ -20636,6 +7962,8 @@ }, "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, "requires": { "minimist": "^1.2.6" @@ -20643,6 +7971,8 @@ }, "mkdirp-promise": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", "dev": true, "requires": { "mkdirp": "*" @@ -20650,6 +7980,8 @@ }, "mnemonist": { "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, "requires": { "obliterator": "^2.0.0" @@ -20657,6 +7989,8 @@ }, "mocha": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -20685,18 +8019,26 @@ "dependencies": { "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 }, "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "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, "requires": { "balanced-match": "^1.0.0" @@ -20704,10 +8046,14 @@ }, "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 }, "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, "requires": { "locate-path": "^6.0.0", @@ -20716,6 +8062,8 @@ }, "glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -20728,6 +8076,8 @@ "dependencies": { "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -20736,6 +8086,8 @@ }, "minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -20745,10 +8097,14 @@ }, "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 }, "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, "requires": { "argparse": "^2.0.1" @@ -20756,6 +8112,8 @@ }, "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, "requires": { "p-locate": "^5.0.0" @@ -20763,6 +8121,8 @@ }, "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, "requires": { "brace-expansion": "^2.0.1" @@ -20770,10 +8130,14 @@ }, "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 }, "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, "requires": { "yocto-queue": "^0.1.0" @@ -20781,6 +8145,8 @@ }, "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, "requires": { "p-limit": "^3.0.2" @@ -20788,6 +8154,8 @@ }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -20797,6 +8165,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -20804,6 +8174,8 @@ }, "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, "requires": { "has-flag": "^4.0.0" @@ -20811,6 +8183,8 @@ }, "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -20826,18 +8200,26 @@ }, "mock-fs": { "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", "dev": true }, "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 }, "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 }, "multibase": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", "dev": true, "requires": { "base-x": "^3.0.8", @@ -20846,6 +8228,8 @@ }, "multicodec": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", "dev": true, "requires": { "varint": "^5.0.0" @@ -20853,6 +8237,8 @@ }, "multihashes": { "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -20862,6 +8248,8 @@ "dependencies": { "multibase": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", "dev": true, "requires": { "base-x": "^3.0.8", @@ -20872,46 +8260,68 @@ }, "mute-stream": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, "nano-base32": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==", "dev": true }, "nano-json-stream-parser": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", "dev": true }, "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 }, "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 }, "natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "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 }, "next-tick": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "nice-try": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "no-case": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "^1.1.1" @@ -20919,10 +8329,14 @@ }, "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-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, "requires": { "lodash": "^4.17.21" @@ -20930,6 +8344,8 @@ }, "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==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", @@ -20938,12 +8354,16 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "node-fetch": { "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -20951,10 +8371,14 @@ }, "node-gyp-build": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", "dev": true }, "node-interval-tree": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", "dev": true, "requires": { "shallowequal": "^1.1.0" @@ -20962,10 +8386,14 @@ }, "nofilter": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", "dev": true }, "nopt": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, "requires": { "abbrev": "1" @@ -20973,6 +8401,8 @@ }, "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, "requires": { "hosted-git-info": "^2.1.4", @@ -20983,20 +8413,28 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "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 }, "normalize-url": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "nth-check": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -21004,10 +8442,14 @@ }, "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 }, "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, "requires": { "bn.js": "4.11.6", @@ -21016,28 +8458,40 @@ "dependencies": { "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 } } }, "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 }, "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 }, "object-inspect": { "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "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 }, "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, "requires": { "call-bind": "^1.0.2", @@ -21048,6 +8502,8 @@ }, "object.getownpropertydescriptors": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", "dev": true, "requires": { "array.prototype.reduce": "^1.0.4", @@ -21058,6 +8514,8 @@ }, "object.values": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -21067,10 +8525,14 @@ }, "obliterator": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", "dev": true }, "oboe": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dev": true, "requires": { "http-https": "^1.0.0" @@ -21078,6 +8540,8 @@ }, "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, "requires": { "wrappy": "1" @@ -21085,6 +8549,8 @@ }, "onetime": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -21092,6 +8558,8 @@ }, "optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -21104,6 +8572,8 @@ }, "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, "requires": { "lcid": "^1.0.0" @@ -21111,14 +8581,20 @@ }, "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 }, "p-cancelable": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -21126,6 +8602,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -21133,6 +8611,8 @@ }, "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==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -21140,14 +8620,20 @@ }, "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 }, "pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "param-case": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", "dev": true, "requires": { "no-case": "^2.2.0" @@ -21155,6 +8641,8 @@ }, "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, "requires": { "callsites": "^3.0.0" @@ -21162,6 +8650,8 @@ }, "parse-asn1": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { "asn1.js": "^5.2.0", @@ -21173,14 +8663,20 @@ }, "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 }, "parse-headers": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", "dev": true }, "parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -21189,6 +8685,8 @@ }, "parse5": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "requires": { "entities": "^4.4.0" @@ -21196,6 +8694,8 @@ }, "parse5-htmlparser2-tree-adapter": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dev": true, "requires": { "domhandler": "^5.0.2", @@ -21204,10 +8704,14 @@ }, "parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascal-case": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", "dev": true, "requires": { "camel-case": "^3.0.0", @@ -21216,6 +8720,8 @@ }, "path-case": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", "dev": true, "requires": { "no-case": "^2.2.0" @@ -21223,38 +8729,56 @@ }, "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 }, "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 }, "path-is-inside": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "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 }, "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 }, "path-to-regexp": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "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 }, "pathval": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, "pbkdf2": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -21266,22 +8790,32 @@ }, "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 }, "picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "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 }, "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, "requires": { "pinkie": "^2.0.0" @@ -21289,18 +8823,26 @@ }, "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 }, "prepend-http": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true }, "prettier": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, "prettier-plugin-solidity": { "version": "1.0.0-beta.24", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz", + "integrity": "sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg==", "dev": true, "requires": { "@solidity-parser/parser": "^0.14.3", @@ -21313,14 +8855,20 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "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 }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -21330,12 +8878,16 @@ "dependencies": { "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 } } }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -21345,18 +8897,26 @@ }, "process": { "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true }, "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 }, "progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise": { "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", "dev": true, "requires": { "asap": "~2.0.6" @@ -21364,6 +8924,8 @@ }, "proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { "forwarded": "0.2.0", @@ -21372,10 +8934,14 @@ }, "psl": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "public-encrypt": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -21388,6 +8954,8 @@ }, "pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -21396,14 +8964,20 @@ }, "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 }, "pure-rand": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", "dev": true }, "qs": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -21411,6 +8985,8 @@ }, "query-string": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { "decode-uri-component": "^0.2.0", @@ -21420,18 +8996,26 @@ }, "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 }, "quick-lru": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, "rambda": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz", + "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA==", "dev": true }, "randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -21439,6 +9023,8 @@ }, "randomfill": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -21447,10 +9033,14 @@ }, "range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { "bytes": "3.1.2", @@ -21461,6 +9051,8 @@ }, "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, "requires": { "load-json-file": "^1.0.0", @@ -21470,6 +9062,8 @@ "dependencies": { "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, "requires": { "graceful-fs": "^4.1.2", @@ -21479,12 +9073,16 @@ }, "pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } }, "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, "requires": { "find-up": "^1.0.0", @@ -21493,6 +9091,8 @@ "dependencies": { "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, "requires": { "path-exists": "^2.0.0", @@ -21501,6 +9101,8 @@ }, "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, "requires": { "pinkie-promise": "^2.0.0" @@ -21510,6 +9112,8 @@ }, "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, "requires": { "inherits": "^2.0.3", @@ -21519,6 +9123,8 @@ }, "readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -21526,6 +9132,8 @@ }, "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, "requires": { "resolve": "^1.1.6" @@ -21533,6 +9141,8 @@ }, "recursive-readdir": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dev": true, "requires": { "minimatch": "3.0.4" @@ -21540,6 +9150,8 @@ "dependencies": { "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -21549,10 +9161,14 @@ }, "regenerator-runtime": { "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regexp.prototype.flags": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -21562,10 +9178,14 @@ }, "regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "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, "requires": { "req-from": "^2.0.0" @@ -21573,6 +9193,8 @@ }, "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, "requires": { "resolve-from": "^3.0.0" @@ -21580,12 +9202,16 @@ "dependencies": { "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 } } }, "request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -21612,16 +9238,22 @@ "dependencies": { "qs": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true } } }, "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==", "dev": true, "requires": { "lodash": "^4.17.19" @@ -21629,6 +9261,8 @@ }, "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==", "dev": true, "requires": { "request-promise-core": "1.1.4", @@ -21638,18 +9272,26 @@ }, "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 }, "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 }, "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 }, "resolve": { "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { "is-core-module": "^2.9.0", @@ -21659,14 +9301,20 @@ }, "resolve-alpn": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true }, "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 }, "responselike": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "requires": { "lowercase-keys": "^2.0.0" @@ -21674,12 +9322,16 @@ "dependencies": { "lowercase-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true } } }, "restore-cursor": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -21688,10 +9340,14 @@ }, "reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -21699,6 +9355,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -21713,6 +9371,8 @@ }, "ripemd160": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -21721,10 +9381,14 @@ }, "ripemd160-min": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", "dev": true }, "rlp": { "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dev": true, "requires": { "bn.js": "^5.2.0" @@ -21732,16 +9396,22 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, "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, "requires": { "queue-microtask": "^1.2.2" @@ -21749,6 +9419,8 @@ }, "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, "requires": { "queue-microtask": "^1.2.2" @@ -21756,10 +9428,14 @@ }, "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 }, "rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -21767,14 +9443,20 @@ }, "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 }, "safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "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, "requires": { "abbrev": "1.0.x", @@ -21795,14 +9477,20 @@ "dependencies": { "async": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true }, "esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true }, "glob": { "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, "requires": { "inflight": "^1.0.4", @@ -21814,14 +9502,20 @@ }, "has-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true }, "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 }, "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, "requires": { "has-flag": "^1.0.0" @@ -21829,6 +9523,8 @@ }, "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -21838,10 +9534,14 @@ }, "scrypt-js": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", "dev": true }, "secp256k1": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "dev": true, "requires": { "elliptic": "^6.5.4", @@ -21851,6 +9551,8 @@ }, "semver": { "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21858,6 +9560,8 @@ "dependencies": { "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, "requires": { "yallist": "^4.0.0" @@ -21865,12 +9569,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "send": { "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", @@ -21890,6 +9598,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -21897,16 +9607,22 @@ "dependencies": { "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "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 }, "on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -21914,12 +9630,16 @@ }, "statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true } } }, "sentence-case": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", "dev": true, "requires": { "no-case": "^2.2.0", @@ -21928,6 +9648,8 @@ }, "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, "requires": { "randombytes": "^2.1.0" @@ -21935,6 +9657,8 @@ }, "serve-static": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", @@ -21945,6 +9669,8 @@ }, "servify": { "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dev": true, "requires": { "body-parser": "^1.16.0", @@ -21956,18 +9682,26 @@ }, "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 }, "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 }, "setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "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, "requires": { "inherits": "^2.0.1", @@ -21976,6 +9710,8 @@ }, "sha1": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, "requires": { "charenc": ">= 0.0.1", @@ -21984,6 +9720,8 @@ }, "sha3": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", "dev": true, "requires": { "buffer": "6.0.3" @@ -21991,6 +9729,8 @@ "dependencies": { "buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -22001,10 +9741,14 @@ }, "shallowequal": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", "dev": true }, "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, "requires": { "shebang-regex": "^3.0.0" @@ -22012,10 +9756,14 @@ }, "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 }, "shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "requires": { "glob": "^7.0.0", @@ -22025,6 +9773,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22039,6 +9789,8 @@ }, "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, "requires": { "call-bind": "^1.0.0", @@ -22048,14 +9800,20 @@ }, "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 }, "simple-concat": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true }, "simple-get": { "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dev": true, "requires": { "decompress-response": "^3.3.0", @@ -22065,6 +9823,8 @@ "dependencies": { "decompress-response": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -22074,10 +9834,14 @@ }, "slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "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, "requires": { "ansi-styles": "^4.0.0", @@ -22087,12 +9851,16 @@ "dependencies": { "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 } } }, "snake-case": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "dev": true, "requires": { "no-case": "^2.2.0" @@ -22100,6 +9868,8 @@ }, "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, "requires": { "fs-extra": "^0.30.0", @@ -22111,14 +9881,20 @@ "dependencies": { "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 }, "camelcase": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "dev": true }, "cliui": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dev": true, "requires": { "string-width": "^1.0.1", @@ -22128,10 +9904,14 @@ }, "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 }, "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, "requires": { "graceful-fs": "^4.1.2", @@ -22143,10 +9923,14 @@ }, "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 }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22159,6 +9943,8 @@ }, "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, "requires": { "number-is-nan": "^1.0.0" @@ -22166,6 +9952,8 @@ }, "jsonfile": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -22173,10 +9961,14 @@ }, "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 }, "rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -22184,10 +9976,14 @@ }, "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "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, "requires": { "code-point-at": "^1.0.0", @@ -22197,6 +9993,8 @@ }, "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, "requires": { "ansi-regex": "^2.0.0" @@ -22204,10 +10002,14 @@ }, "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 }, "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, "requires": { "string-width": "^1.0.1", @@ -22216,10 +10018,14 @@ }, "y18n": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "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, "requires": { "cliui": "^3.2.0", @@ -22240,6 +10046,8 @@ }, "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, "requires": { "camelcase": "^3.0.0", @@ -22250,6 +10058,8 @@ }, "solhint": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", + "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", "dev": true, "requires": { "@solidity-parser/parser": "^0.14.1", @@ -22271,14 +10081,20 @@ "dependencies": { "acorn": { "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -22286,10 +10102,14 @@ }, "astral-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -22299,6 +10119,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -22306,10 +10128,14 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "cross-spawn": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -22321,20 +10147,28 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "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 }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "eslint": { "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -22377,12 +10211,16 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "eslint-scope": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -22391,6 +10229,8 @@ }, "eslint-utils": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -22398,10 +10238,14 @@ }, "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -22411,6 +10255,8 @@ }, "file-entry-cache": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { "flat-cache": "^2.0.1" @@ -22418,6 +10264,8 @@ }, "flat-cache": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { "flatted": "^2.0.0", @@ -22427,10 +10275,14 @@ }, "flatted": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22443,14 +10295,20 @@ }, "globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "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 }, "levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -22459,6 +10317,8 @@ }, "optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", @@ -22471,23 +10331,33 @@ }, "path-key": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "prettier": { "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, "optional": true }, "regexpp": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "rimraf": { "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -22495,10 +10365,14 @@ }, "semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "shebang-command": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -22506,10 +10380,14 @@ }, "shebang-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "slice-ansi": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -22519,6 +10397,8 @@ }, "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==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -22528,6 +10408,8 @@ "dependencies": { "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -22537,10 +10419,14 @@ }, "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==", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -22548,6 +10434,8 @@ }, "table": { "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -22558,6 +10446,8 @@ }, "type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -22565,6 +10455,8 @@ }, "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -22574,10 +10466,14 @@ }, "solidity-ast": { "version": "0.4.35", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.35.tgz", + "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", "dev": true }, "solidity-comments": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", "dev": true, "requires": { "solidity-comments-darwin-arm64": "0.0.2", @@ -22592,22 +10488,86 @@ "solidity-comments-win32-x64-msvc": "0.0.2" } }, + "solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "dev": true, + "optional": true + }, + "solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "dev": true, + "optional": true + }, "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 }, + "solidity-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "dev": true, + "optional": true + }, + "solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "dev": true, + "optional": true + }, "solidity-comments-linux-x64-gnu": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", "dev": true, "optional": true }, "solidity-comments-linux-x64-musl": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "dev": true, + "optional": true + }, + "solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", "dev": true, "optional": true }, "solidity-coverage": { "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, "requires": { "@ethersproject/abi": "^5.0.9", @@ -22634,14 +10594,20 @@ "dependencies": { "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 }, "ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -22649,10 +10615,14 @@ }, "camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -22662,6 +10632,8 @@ }, "chokidar": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -22676,6 +10648,8 @@ }, "cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", @@ -22685,6 +10659,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -22692,10 +10668,14 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "debug": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -22703,22 +10683,32 @@ }, "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 }, "diff": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "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 }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "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, "requires": { "locate-path": "^3.0.0" @@ -22726,6 +10716,8 @@ }, "flat": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, "requires": { "is-buffer": "~2.0.3" @@ -22733,6 +10725,8 @@ }, "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, "requires": { "graceful-fs": "^4.2.0", @@ -22740,8 +10734,17 @@ "universalify": "^0.1.0" } }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "glob": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22754,10 +10757,14 @@ }, "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 }, "js-yaml": { "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -22766,6 +10773,8 @@ }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -22774,6 +10783,8 @@ }, "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==", "dev": true, "requires": { "chalk": "^2.4.2" @@ -22781,6 +10792,8 @@ }, "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -22788,6 +10801,8 @@ }, "mkdirp": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -22795,6 +10810,8 @@ }, "mocha": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -22825,6 +10842,8 @@ "dependencies": { "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==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -22834,10 +10853,14 @@ }, "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 }, "object.assign": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -22848,6 +10871,8 @@ }, "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, "requires": { "p-limit": "^2.0.0" @@ -22855,10 +10880,14 @@ }, "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 }, "readdirp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { "picomatch": "^2.0.4" @@ -22866,6 +10895,8 @@ }, "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==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -22875,6 +10906,8 @@ }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -22882,10 +10915,14 @@ }, "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==", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -22893,6 +10930,8 @@ }, "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -22900,6 +10939,8 @@ }, "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==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -22909,10 +10950,14 @@ }, "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 }, "yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -22929,6 +10974,8 @@ }, "yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -22937,6 +10984,8 @@ }, "yargs-unparser": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", @@ -22948,6 +10997,8 @@ }, "solidity-docgen": { "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", "dev": true, "requires": { "handlebars": "^4.7.7", @@ -22956,6 +11007,8 @@ }, "source-map": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "requires": { @@ -22964,6 +11017,8 @@ }, "source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -22972,12 +11027,16 @@ "dependencies": { "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 } } }, "spdx-correct": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -22986,10 +11045,14 @@ }, "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 }, "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, "requires": { "spdx-exceptions": "^2.1.0", @@ -22998,14 +11061,20 @@ }, "spdx-license-ids": { "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "sshpk": { "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -23021,12 +11090,16 @@ "dependencies": { "tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true } } }, "stacktrace-parser": { "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dev": true, "requires": { "type-fest": "^0.7.1" @@ -23034,27 +11107,28 @@ "dependencies": { "type-fest": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true } } }, "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 }, "strict-uri-encode": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -23063,6 +11137,8 @@ }, "string.prototype.trimend": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -23072,6 +11148,8 @@ }, "string.prototype.trimstart": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -23079,8 +11157,19 @@ "es-abstract": "^1.19.5" } }, + "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, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "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, "requires": { "ansi-regex": "^3.0.0" @@ -23088,10 +11177,14 @@ }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-hex-prefix": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dev": true, "requires": { "is-hex-prefixed": "1.0.0" @@ -23099,14 +11192,20 @@ }, "strip-indent": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "dev": true }, "strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "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, "requires": { "has-flag": "^4.0.0" @@ -23114,10 +11213,14 @@ }, "supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "swap-case": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", "dev": true, "requires": { "lower-case": "^1.1.1", @@ -23126,6 +11229,8 @@ }, "swarm-js": { "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dev": true, "requires": { "bluebird": "^3.5.0", @@ -23143,6 +11248,8 @@ "dependencies": { "@szmarczak/http-timer": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "requires": { "defer-to-connect": "^2.0.0" @@ -23150,10 +11257,14 @@ }, "cacheable-lookup": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true }, "fs-extra": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -23163,6 +11274,8 @@ }, "got": { "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", @@ -23180,6 +11293,8 @@ }, "http2-wrapper": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, "requires": { "quick-lru": "^5.1.1", @@ -23188,16 +11303,22 @@ }, "lowercase-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, "p-cancelable": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true } } }, "sync-request": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, "requires": { "http-response-object": "^3.0.1", @@ -23207,6 +11328,8 @@ }, "sync-rpc": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, "requires": { "get-port": "^3.1.0" @@ -23214,6 +11337,8 @@ }, "table": { "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -23225,6 +11350,8 @@ "dependencies": { "ajv": { "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -23235,26 +11362,38 @@ }, "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "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 }, "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 }, "json-schema-traverse": { "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 }, "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 }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -23264,6 +11403,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -23273,6 +11414,8 @@ }, "tar": { "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "requires": { "chownr": "^1.1.4", @@ -23286,14 +11429,20 @@ }, "testrpc": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", "dev": true }, "text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "then-request": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, "requires": { "@types/concat-stream": "^1.6.0", @@ -23311,20 +11460,28 @@ "dependencies": { "@types/node": { "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true } } }, "through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "timed-out": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true }, "title-case": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", "dev": true, "requires": { "no-case": "^2.2.0", @@ -23333,6 +11490,8 @@ }, "tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -23340,10 +11499,14 @@ }, "to-readable-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -23351,10 +11514,14 @@ }, "toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "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, "requires": { "psl": "^1.1.28", @@ -23363,20 +11530,28 @@ "dependencies": { "punycode": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } }, "tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "treeify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, "tsconfig-paths": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -23387,6 +11562,8 @@ "dependencies": { "json5": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -23396,14 +11573,20 @@ }, "tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tsort": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, "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, "requires": { "safe-buffer": "^5.0.1" @@ -23411,18 +11594,26 @@ }, "tweetnacl": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "dev": true }, "tweetnacl-util": { "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", "dev": true }, "type": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" @@ -23430,14 +11621,20 @@ }, "type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", @@ -23446,10 +11643,14 @@ }, "typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" @@ -23457,15 +11658,21 @@ }, "uglify-js": { "version": "3.17.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", + "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", "dev": true, "optional": true }, "ultron": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, "unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -23476,26 +11683,38 @@ }, "underscore": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", "dev": true }, "undici": { "version": "5.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", + "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", "dev": true }, "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 }, "unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, "upper-case": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", "dev": true }, "upper-case-first": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", "dev": true, "requires": { "upper-case": "^1.1.1" @@ -23503,6 +11722,8 @@ }, "uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -23510,6 +11731,8 @@ }, "url-parse-lax": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "requires": { "prepend-http": "^2.0.0" @@ -23517,10 +11740,14 @@ }, "url-set-query": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", "dev": true }, "utf-8-validate": { "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", "dev": true, "requires": { "node-gyp-build": "^4.3.0" @@ -23528,10 +11755,14 @@ }, "utf8": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", "dev": true }, "util": { "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -23544,22 +11775,32 @@ }, "util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, "uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-compile-cache": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "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, "requires": { "spdx-correct": "^3.0.0", @@ -23568,14 +11809,20 @@ }, "varint": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", "dev": true }, "vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "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, "requires": { "assert-plus": "^1.0.0", @@ -23585,6 +11832,8 @@ }, "web3": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", + "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", "dev": true, "requires": { "web3-bzz": "1.7.5", @@ -23598,6 +11847,8 @@ }, "web3-bzz": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", + "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -23607,12 +11858,16 @@ "dependencies": { "@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true } } }, "web3-core": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", + "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -23626,16 +11881,22 @@ "dependencies": { "@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "bignumber.js": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "dev": true } } }, "web3-core-helpers": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", + "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", "dev": true, "requires": { "web3-eth-iban": "1.7.5", @@ -23644,6 +11905,8 @@ }, "web3-core-method": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", + "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", @@ -23655,6 +11918,8 @@ }, "web3-core-promievent": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", + "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", "dev": true, "requires": { "eventemitter3": "4.0.4" @@ -23662,6 +11927,8 @@ }, "web3-core-requestmanager": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", + "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", "dev": true, "requires": { "util": "^0.12.0", @@ -23673,6 +11940,8 @@ }, "web3-core-subscriptions": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", + "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -23681,6 +11950,8 @@ }, "web3-eth": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", + "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", "dev": true, "requires": { "web3-core": "1.7.5", @@ -23699,6 +11970,8 @@ }, "web3-eth-abi": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", + "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", @@ -23707,6 +11980,8 @@ }, "web3-eth-accounts": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", + "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", @@ -23724,6 +11999,8 @@ "dependencies": { "eth-lib": { "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dev": true, "requires": { "bn.js": "^4.11.6", @@ -23733,12 +12010,16 @@ }, "uuid": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true } } }, "web3-eth-contract": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", + "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", @@ -23753,6 +12034,8 @@ }, "web3-eth-ens": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", + "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", "dev": true, "requires": { "content-hash": "^2.5.2", @@ -23767,6 +12050,8 @@ }, "web3-eth-iban": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", + "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -23775,12 +12060,16 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "web3-eth-personal": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", + "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -23793,12 +12082,16 @@ "dependencies": { "@types/node": { "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true } } }, "web3-net": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", + "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", "dev": true, "requires": { "web3-core": "1.7.5", @@ -23808,6 +12101,8 @@ }, "web3-providers-http": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", + "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", "dev": true, "requires": { "abortcontroller-polyfill": "^1.7.3", @@ -23818,6 +12113,8 @@ }, "web3-providers-ipc": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", + "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", "dev": true, "requires": { "oboe": "2.1.5", @@ -23826,6 +12123,8 @@ }, "web3-providers-ws": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", + "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", "dev": true, "requires": { "eventemitter3": "4.0.4", @@ -23835,6 +12134,8 @@ }, "web3-shh": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", + "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", "dev": true, "requires": { "web3-core": "1.7.5", @@ -23845,6 +12146,8 @@ }, "web3-utils": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", + "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -23858,16 +12161,22 @@ "dependencies": { "bn.js": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true } } }, "webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "websocket": { "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "dev": true, "requires": { "bufferutil": "^4.0.1", @@ -23880,6 +12189,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -23887,12 +12198,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "requires": { "tr46": "~0.0.3", @@ -23901,6 +12216,8 @@ }, "which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -23908,6 +12225,8 @@ }, "which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", @@ -23919,10 +12238,14 @@ }, "which-module": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, "which-typed-array": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", @@ -23935,6 +12258,8 @@ }, "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, "requires": { "string-width": "^1.0.2 || 2" @@ -23942,22 +12267,32 @@ }, "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 }, "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==", "dev": true }, "wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "workerpool": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "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, "requires": { "ansi-styles": "^4.0.0", @@ -23967,18 +12302,26 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "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 }, "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 }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -23988,6 +12331,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -23997,10 +12342,14 @@ }, "wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "write": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" @@ -24008,11 +12357,14 @@ }, "ws": { "version": "7.5.9", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true }, "xhr": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", "dev": true, "requires": { "global": "~4.4.0", @@ -24023,6 +12375,8 @@ }, "xhr-request": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "dev": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", @@ -24036,6 +12390,8 @@ }, "xhr-request-promise": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", "dev": true, "requires": { "xhr-request": "^1.1.0" @@ -24043,6 +12399,8 @@ }, "xhr2-cookies": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", "dev": true, "requires": { "cookiejar": "^2.1.1" @@ -24050,26 +12408,38 @@ }, "xmlhttprequest": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", "dev": true }, "xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yaeti": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", "dev": true }, "yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -24083,18 +12453,26 @@ "dependencies": { "ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "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 }, "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 }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -24104,6 +12482,8 @@ }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" @@ -24111,16 +12491,22 @@ }, "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 } } }, "yargs-parser": { "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true }, "yargs-unparser": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { "camelcase": "^6.0.0", @@ -24131,12 +12517,16 @@ "dependencies": { "camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } From 99589794db43c8b285f5b3464d2e0864caab8199 Mon Sep 17 00:00:00 2001 From: Saeed Dadkhah Date: Wed, 16 Nov 2022 17:45:58 +0330 Subject: [PATCH 079/197] Add forgotten await to ERC1155URIStorage beforeEach block. (#3807) --- test/token/ERC1155/extensions/ERC1155URIStorage.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js index 7ba7e5662..8f20a4ced 100644 --- a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +++ b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js @@ -17,7 +17,7 @@ contract(['ERC1155URIStorage'], function (accounts) { describe('with base uri set', function () { beforeEach(async function () { this.token = await ERC1155URIStorageMock.new(erc1155Uri); - this.token.setBaseURI(baseUri); + await this.token.setBaseURI(baseUri); await this.token.mint(holder, tokenId, amount, '0x'); }); From 8c9a831596788f266ec6e5bf8ef2c7d05bb5931b Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 23 Nov 2022 16:48:26 +0100 Subject: [PATCH 080/197] Fix whitespace in docs (#3832) Co-authored-by: Francisco --- docs/modules/ROOT/pages/erc721.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/erc721.adoc b/docs/modules/ROOT/pages/erc721.adoc index 56a52e874..add40d59b 100644 --- a/docs/modules/ROOT/pages/erc721.adoc +++ b/docs/modules/ROOT/pages/erc721.adoc @@ -87,4 +87,4 @@ A preset ERC721 is available, https://github.com/OpenZeppelin/openzeppelin-contr This contract is ready to deploy without having to write any Solidity code. It can be used as-is for quick prototyping and testing but is also suitable for production environments. -NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. +NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. From 8f8fd84f1e60426a5e785d6b5b2524938271bb05 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 25 Nov 2022 12:55:16 -0300 Subject: [PATCH 081/197] Improve some NatSpec and revert reasons (#3809) Co-authored-by: JulissaDantes --- .../token/ERC20/extensions/ERC20Votes.sol | 3 +++ contracts/token/ERC20/extensions/ERC4626.sol | 17 ++++++++++--- contracts/utils/Checkpoints.sol | 24 +++++++++++++------ contracts/utils/math/Math.sol | 2 +- scripts/generate/templates/Checkpoints.js | 10 +++++--- test/utils/Checkpoints.test.js | 2 +- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index c2b87aa2d..0fd57cecf 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -271,6 +271,9 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { return a - b; } + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) { assembly { mstore(0, ckpts.slot) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 81b2844ad..3ffcd7bfd 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -17,8 +17,12 @@ import "../../../utils/math/Math.sol"; * the ERC20 standard. Any additional extensions included along it would affect the "shares" token represented by this * contract and not the "assets" token which is an independent contract. * - * CAUTION: Deposits and withdrawals may incur unexpected slippage. Users should verify that the amount received of - * shares or assets is as expected. EOAs should operate through a wrapper that performs these checks such as + * CAUTION: When the vault is empty or nearly empty, deposits are at high risk of being stolen through frontrunning with + * a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation + * attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial + * deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may + * similarly be affected by slippage. Users can protect against this attack as well unexpected slippage in general by + * verifying the amount received is as expected, using a wrapper that performs these checks such as * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router]. * * _Available since v4.7._ @@ -134,7 +138,11 @@ abstract contract ERC4626 is ERC20, IERC4626 { return shares; } - /** @dev See {IERC4626-mint}. */ + /** @dev See {IERC4626-mint}. + * + * As opposed to {deposit}, minting is allowed even if the vault is in a state where the price of a share is zero. + * In this case, the shares will be minted without requiring any assets to be deposited. + */ function mint(uint256 shares, address receiver) public virtual override returns (uint256) { require(shares <= maxMint(receiver), "ERC4626: mint more than max"); @@ -267,6 +275,9 @@ abstract contract ERC4626 is ERC20, IERC4626 { emit Withdraw(caller, receiver, owner, assets, shares); } + /** + * @dev Checks if vault is "healthy" in the sense of having assets backing the circulating shares. + */ function _isVaultHealthy() private view returns (bool) { return totalAssets() > 0 || totalSupply() == 0; } diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 3f329d73c..942acb92e 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -28,7 +28,8 @@ library Checkpoints { /** * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one - * before it is returned, or zero otherwise. + * before it is returned, or zero otherwise. Because the number returned corresponds to that at the end of the + * block, the requested block number must be in the past, excluding the current block. */ function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) { require(blockNumber < block.number, "Checkpoints: block not yet mined"); @@ -143,8 +144,8 @@ library Checkpoints { // Copying to memory is important here. Checkpoint memory last = _unsafeAccess(self, pos - 1); - // Checkpoints keys must be increasing. - require(last._blockNumber <= key, "Checkpoint: invalid key"); + // Checkpoint keys must be non-decreasing. + require(last._blockNumber <= key, "Checkpoint: decreasing keys"); // Update or push new checkpoint if (last._blockNumber == key) { @@ -205,6 +206,9 @@ library Checkpoints { return high; } + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ function _unsafeAccess(Checkpoint[] storage self, uint256 pos) private pure returns (Checkpoint storage result) { assembly { mstore(0, self.slot) @@ -304,8 +308,8 @@ library Checkpoints { // Copying to memory is important here. Checkpoint224 memory last = _unsafeAccess(self, pos - 1); - // Checkpoints keys must be increasing. - require(last._key <= key, "Checkpoint: invalid key"); + // Checkpoint keys must be non-decreasing. + require(last._key <= key, "Checkpoint: decreasing keys"); // Update or push new checkpoint if (last._key == key) { @@ -366,6 +370,9 @@ library Checkpoints { return high; } + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ function _unsafeAccess(Checkpoint224[] storage self, uint256 pos) private pure @@ -469,8 +476,8 @@ library Checkpoints { // Copying to memory is important here. Checkpoint160 memory last = _unsafeAccess(self, pos - 1); - // Checkpoints keys must be increasing. - require(last._key <= key, "Checkpoint: invalid key"); + // Checkpoint keys must be non-decreasing. + require(last._key <= key, "Checkpoint: decreasing keys"); // Update or push new checkpoint if (last._key == key) { @@ -531,6 +538,9 @@ library Checkpoints { return high; } + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ function _unsafeAccess(Checkpoint160[] storage self, uint256 pos) private pure diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index 733656af4..0ed5460e0 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -75,7 +75,7 @@ library Math { } // Make sure the result is less than 2^256. Also prevents denominator == 0. - require(denominator > prod1); + require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. diff --git a/scripts/generate/templates/Checkpoints.js b/scripts/generate/templates/Checkpoints.js index b78ed5ceb..858ddb4aa 100644 --- a/scripts/generate/templates/Checkpoints.js +++ b/scripts/generate/templates/Checkpoints.js @@ -67,7 +67,8 @@ function upperLookup(${opts.historyTypeName} storage self, ${opts.keyTypeName} k const legacyOperations = opts => `\ /** * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one - * before it is returned, or zero otherwise. + * before it is returned, or zero otherwise. Because the number returned corresponds to that at the end of the + * block, the requested block number must be in the past, excluding the current block. */ function getAtBlock(${opts.historyTypeName} storage self, uint256 blockNumber) internal view returns (uint256) { require(blockNumber < block.number, "Checkpoints: block not yet mined"); @@ -184,8 +185,8 @@ function _insert( // Copying to memory is important here. ${opts.checkpointTypeName} memory last = _unsafeAccess(self, pos - 1); - // Checkpoints keys must be increasing. - require(last.${opts.keyFieldName} <= key, "Checkpoint: invalid key"); + // Checkpoint keys must be non-decreasing. + require(last.${opts.keyFieldName} <= key, "Checkpoint: decreasing keys"); // Update or push new checkpoint if (last.${opts.keyFieldName} == key) { @@ -246,6 +247,9 @@ function _lowerBinaryLookup( return high; } +/** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ function _unsafeAccess(${opts.checkpointTypeName}[] storage self, uint256 pos) private pure diff --git a/test/utils/Checkpoints.test.js b/test/utils/Checkpoints.test.js index 9bdb4aef2..87335da9b 100644 --- a/test/utils/Checkpoints.test.js +++ b/test/utils/Checkpoints.test.js @@ -151,7 +151,7 @@ contract('Checkpoints', function (accounts) { }); it('cannot push values in the past', async function () { - await expectRevert(this.contract.push(last(this.checkpoints).key - 1, '0'), 'Checkpoint: invalid key'); + await expectRevert(this.contract.push(last(this.checkpoints).key - 1, '0'), 'Checkpoint: decreasing keys'); }); it('can update last value', async function () { From 4e8b2fa659ba87ab916beb3eb3c8335fb1238d9f Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 30 Nov 2022 15:44:38 -0300 Subject: [PATCH 082/197] Add additional conditions when testing ERC4626 roundtrip (#3839) --- test/token/ERC20/extensions/ERC4626.t.sol | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/token/ERC20/extensions/ERC4626.t.sol b/test/token/ERC20/extensions/ERC4626.t.sol index 4863c14d5..0aac0d411 100644 --- a/test/token/ERC20/extensions/ERC4626.t.sol +++ b/test/token/ERC20/extensions/ERC4626.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "erc4626-tests/ERC4626.test.sol"; +import {SafeCast} from "../../../../contracts/utils/math/SafeCast.sol"; import {ERC20Mock} from "../../../../contracts/mocks/ERC20Mock.sol"; import {ERC4626Mock, IERC20Metadata} from "../../../../contracts/mocks/ERC4626Mock.sol"; @@ -14,4 +15,22 @@ contract ERC4626StdTest is ERC4626Test { _vaultMayBeEmpty = false; _unlimitedAmount = true; } + + // solhint-disable-next-line func-name-mixedcase + function test_RT_mint_withdraw(ERC4626Test.Init memory init, uint256 shares) public override { + // There is an edge case where we currently behave different than the property tests, + // when all assets are lost to negative yield. + + // Sum all initially deposited assets. + int256 initAssets = 0; + for (uint256 i = 0; i < init.share.length; i++) { + vm.assume(init.share[i] <= uint256(type(int256).max - initAssets)); + initAssets += SafeCast.toInt256(init.share[i]); + } + + // Reject tests where the yield loses all assets from the vault. + vm.assume(init.yield > -initAssets); + + super.test_RT_mint_withdraw(init, shares); + } } From 24d1bb668a1152528a6e6d71c2e285d227ed19d9 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 1 Dec 2022 14:34:58 +0100 Subject: [PATCH 083/197] Add Ownable2Step to the docs (#3836) Co-authored-by: Francisco --- contracts/access/README.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/access/README.adoc b/contracts/access/README.adoc index 0959e1a73..888d0e99e 100644 --- a/contracts/access/README.adoc +++ b/contracts/access/README.adoc @@ -12,6 +12,8 @@ This directory provides ways to restrict who can access the functions of a contr {{Ownable}} +{{Ownable2Step}} + {{IAccessControl}} {{AccessControl}} From 88fa71ecd5dfe5a6bd6930479f807fff9e8d2345 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 Dec 2022 12:51:09 -0300 Subject: [PATCH 084/197] Update dependency decode-uri-component to 0.2.1 [SECURITY] (#3845) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ef5962ea..32eae1dfc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4058,9 +4058,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", + "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", "dev": true }, "decompress-response": { From c30fad9955b060f6e337a0244b04ecae811121fb Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 2 Dec 2022 17:10:43 -0300 Subject: [PATCH 085/197] Add ERC-4626 Upgrade Note (#3849) --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f77df6f58..369c65db1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,18 @@ ERC-721 integrators that interpret contract state from events should make sure t With the new `ERC721Consecutive` extension, the internal workings of `ERC721` are slightly changed. Custom extensions to ERC721 should be reviewed to ensure they remain correct. The internal functions that should be considered are `_ownerOf` (new), `_beforeTokenTransfer`, and `_afterTokenTransfer`. +### ERC-4626 Upgrade Note + +Existing `ERC4626` contracts that are upgraded to 4.8 must initialize a new variable that holds the vault token decimals. The recommended way to do this is to use a [reinitializer]: + +[reinitializer]: https://docs.openzeppelin.com/contracts/4.x/api/proxy#Initializable-reinitializer-uint8- + +```solidity +function migrateToV48() public reinitializer(2) { + __ERC4626_init(IERC20Upgradeable(asset())); +} +``` + ## 4.7.3 ### Breaking changes From 93cd2ecb73d38dbe1f471e2387deebefa4b0c012 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Mon, 5 Dec 2022 14:41:44 +0100 Subject: [PATCH 086/197] Improve readability of processMultiProof (#3854) Signed-off-by: Pascal Marco Caversaccio --- contracts/utils/cryptography/MerkleProof.sol | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 938bd96e1..47c60eb01 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -124,7 +124,7 @@ library MerkleProof { bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { - // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by + // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. @@ -147,7 +147,9 @@ library MerkleProof { // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; - bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; + bytes32 b = proofFlags[i] + ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) + : proof[proofPos++]; hashes[i] = _hashPair(a, b); } @@ -172,7 +174,7 @@ library MerkleProof { bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { - // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by + // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. @@ -195,7 +197,9 @@ library MerkleProof { // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; - bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; + bytes32 b = proofFlags[i] + ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) + : proof[proofPos++]; hashes[i] = _hashPair(a, b); } From 206a2394481ec1af16d0e0acf216bbffedde405b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hagen=20H=C3=BCbel?= Date: Mon, 5 Dec 2022 21:25:53 +0100 Subject: [PATCH 087/197] Remove unused variables in tests (#3852) --- test/token/ERC20/extensions/ERC20FlashMint.test.js | 4 ++-- test/token/ERC20/extensions/ERC20Votes.test.js | 4 ++-- test/token/ERC20/extensions/ERC20VotesComp.test.js | 4 ++-- test/token/ERC20/extensions/draft-ERC20Permit.test.js | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/token/ERC20/extensions/ERC20FlashMint.test.js b/test/token/ERC20/extensions/ERC20FlashMint.test.js index d08464dec..4354dd90c 100644 --- a/test/token/ERC20/extensions/ERC20FlashMint.test.js +++ b/test/token/ERC20/extensions/ERC20FlashMint.test.js @@ -1,8 +1,8 @@ /* eslint-disable */ -const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); +const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { MAX_UINT256, ZERO_ADDRESS, ZERO_BYTES32 } = constants; +const { MAX_UINT256, ZERO_ADDRESS } = constants; const ERC20FlashMintMock = artifacts.require('ERC20FlashMintMock'); const ERC3156FlashBorrowerMock = artifacts.require('ERC3156FlashBorrowerMock'); diff --git a/test/token/ERC20/extensions/ERC20Votes.test.js b/test/token/ERC20/extensions/ERC20Votes.test.js index 9d3160bd1..da7b5cd47 100644 --- a/test/token/ERC20/extensions/ERC20Votes.test.js +++ b/test/token/ERC20/extensions/ERC20Votes.test.js @@ -2,7 +2,7 @@ const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { MAX_UINT256, ZERO_ADDRESS, ZERO_BYTES32 } = constants; +const { MAX_UINT256, ZERO_ADDRESS } = constants; const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); @@ -20,7 +20,7 @@ const Delegation = [ ]; contract('ERC20Votes', function (accounts) { - const [ holder, recipient, holderDelegatee, recipientDelegatee, other1, other2 ] = accounts; + const [ holder, recipient, holderDelegatee, other1, other2 ] = accounts; const name = 'My Token'; const symbol = 'MTKN'; diff --git a/test/token/ERC20/extensions/ERC20VotesComp.test.js b/test/token/ERC20/extensions/ERC20VotesComp.test.js index b70c6d167..d03050951 100644 --- a/test/token/ERC20/extensions/ERC20VotesComp.test.js +++ b/test/token/ERC20/extensions/ERC20VotesComp.test.js @@ -2,7 +2,7 @@ const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { MAX_UINT256, ZERO_ADDRESS, ZERO_BYTES32 } = constants; +const { MAX_UINT256, ZERO_ADDRESS } = constants; const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); @@ -20,7 +20,7 @@ const Delegation = [ ]; contract('ERC20VotesComp', function (accounts) { - const [ holder, recipient, holderDelegatee, recipientDelegatee, other1, other2 ] = accounts; + const [ holder, recipient, holderDelegatee, other1, other2 ] = accounts; const name = 'My Token'; const symbol = 'MTKN'; diff --git a/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/test/token/ERC20/extensions/draft-ERC20Permit.test.js index fb60a6cbe..26d0c849c 100644 --- a/test/token/ERC20/extensions/draft-ERC20Permit.test.js +++ b/test/token/ERC20/extensions/draft-ERC20Permit.test.js @@ -1,8 +1,8 @@ /* eslint-disable */ -const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); +const { BN, constants, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { MAX_UINT256, ZERO_ADDRESS, ZERO_BYTES32 } = constants; +const { MAX_UINT256 } = constants; const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); @@ -13,7 +13,7 @@ const ERC20PermitMock = artifacts.require('ERC20PermitMock'); const { EIP712Domain, Permit, domainSeparator } = require('../../../helpers/eip712'); contract('ERC20Permit', function (accounts) { - const [ initialHolder, spender, recipient, other ] = accounts; + const [ initialHolder, spender ] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -62,7 +62,7 @@ contract('ERC20Permit', function (accounts) { const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data }); const { v, r, s } = fromRpcSig(signature); - const receipt = await this.token.permit(owner, spender, value, maxDeadline, v, r, s); + await this.token.permit(owner, spender, value, maxDeadline, v, r, s); expect(await this.token.nonces(owner)).to.be.bignumber.equal('1'); expect(await this.token.allowance(owner, spender)).to.be.bignumber.equal(value); From 98967feeb294f26e8d99dcac57f340669ad7c09e Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 6 Dec 2022 11:55:49 -0300 Subject: [PATCH 088/197] Disable Foundry for slither-action (#3860) --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4e92c1043..0fa1542b6 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,6 +76,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup + - run: rm foundry.toml # https://github.com/foundry-rs/foundry/issues/3827 - uses: crytic/slither-action@v0.2.0 codespell: From 3d7a93876a2e5e1d7fe29b5a0e96e222afdc4cfa Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 6 Dec 2022 21:49:15 -0300 Subject: [PATCH 089/197] Improve documentation of Initializable getters (#3861) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ernesto García --- contracts/proxy/utils/Initializable.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index 8a36650af..b454b5d95 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -150,14 +150,14 @@ abstract contract Initializable { } /** - * @dev Internal function that returns the initialized version. Returns `_initialized` + * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** - * @dev Internal function that returns the initialized version. Returns `_initializing` + * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; From 6b0c9f4e77ff815e11ae5b2a33314035919b79f1 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 19 Dec 2022 18:21:00 -0300 Subject: [PATCH 090/197] Revert "Disable Foundry for slither-action" (#3889) --- .github/workflows/checks.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 0fa1542b6..4e92c1043 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,7 +76,6 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup - - run: rm foundry.toml # https://github.com/foundry-rs/foundry/issues/3827 - uses: crytic/slither-action@v0.2.0 codespell: From 3f16692dadab584058f9c41b0c82fae163278bc5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:08:26 -0300 Subject: [PATCH 091/197] Update dependency got to 11.8.5 [SECURITY] (#3894) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 1742 +++++++++++++++++++++++++++++++-------------- 1 file changed, 1208 insertions(+), 534 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32eae1dfc..e91656361 100644 --- a/package-lock.json +++ b/package-lock.json @@ -208,7 +208,6 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, "requires": { "crc-32": "^1.2.0", "ethereumjs-util": "^7.1.5" @@ -218,7 +217,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, "requires": { "@ethereumjs/common": "^2.6.4", "ethereumjs-util": "^7.1.5" @@ -228,7 +226,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -245,7 +242,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -260,7 +256,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -273,7 +268,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -286,7 +280,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0" } @@ -305,7 +298,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -315,8 +307,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -324,7 +315,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -333,7 +323,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0" } @@ -360,7 +349,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -426,7 +414,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -435,14 +422,12 @@ "@ethersproject/logger": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "dev": true + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, "@ethersproject/networks": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -461,7 +446,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -516,7 +500,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -537,7 +520,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -550,8 +532,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -573,7 +554,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -584,7 +564,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -635,7 +614,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", - "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1337,53 +1315,148 @@ } }, "@truffle/contract": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.0.tgz", - "integrity": "sha512-FxSR7WtV1q+1AKHhJmsbd360qFFjtkGPQeJfaDcn7wlOPG+axW9iLqLSUTlRpFkPKJnUILg2FujNM965rIQJtg==", + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.10.tgz", + "integrity": "sha512-69IZSXeQKRP3EutILqe+vLY5A5gUpeXUiZhm/Fy/qHHkP238vMjtOkTZGkY6bonYqmgk+vDY7KSYSYKzDNPdCA==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", - "@truffle/blockchain-utils": "^0.1.4", - "@truffle/contract-schema": "^3.4.9", - "@truffle/debug-utils": "^6.0.34", + "@truffle/blockchain-utils": "^0.1.6", + "@truffle/contract-schema": "^3.4.11", + "@truffle/debug-utils": "^6.0.42", "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.21", + "@truffle/interface-adapter": "^0.5.26", "bignumber.js": "^7.2.1", "debug": "^4.3.1", "ethers": "^4.0.32", - "web3": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" + "web3": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" }, "dependencies": { "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, "requires": { "defer-to-connect": "^1.0.1" } }, + "@truffle/abi-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", + "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", + "dev": true, + "requires": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.8.1" + } + }, + "@truffle/blockchain-utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", + "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", + "dev": true + }, + "@truffle/codec": { + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", + "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", + "dev": true, + "requires": { + "@truffle/abi-utils": "^0.3.6", + "@truffle/compile-common": "^0.9.1", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.8.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + } + } + }, + "@truffle/compile-common": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", + "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", + "dev": true, + "requires": { + "@truffle/error": "^0.1.1", + "colors": "1.4.0" + } + }, + "@truffle/contract-schema": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", + "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "@truffle/debug-utils": { + "version": "6.0.42", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", + "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", + "dev": true, + "requires": { + "@truffle/codec": "^0.14.11", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.5" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + } + } + }, "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1398,7 +1471,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -1406,16 +1478,40 @@ "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -1423,14 +1519,18 @@ "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "eth-lib": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -1441,41 +1541,63 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "http2-wrapper": "^1.0.0-beta.5.2", + "responselike": "^2.0.0" + }, + "dependencies": { + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + } + } + }, + "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 + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" } }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, "requires": { "json-buffer": "3.0.0" } @@ -1483,112 +1605,497 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, "requires": { "lowercase-keys": "^1.0.0" } }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", "dev": true, "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" + }, + "dependencies": { + "@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + }, + "web3-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-core-method": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "dev": true, + "requires": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-core-requestmanager": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "dev": true, + "requires": { + "util": "^0.12.0", + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" + } + }, + "web3-core-subscriptions": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1" + } + }, + "web3-eth": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-accounts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "dev": true, + "requires": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-contract": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-ens": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "dev": true, + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-personal": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "dev": true, + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-net": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-providers-http": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "dev": true, + "requires": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.1" + } + }, + "web3-providers-ipc": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "dev": true, + "requires": { + "oboe": "2.1.5", + "web3-core-helpers": "1.8.1" + } + }, + "web3-providers-ws": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1", + "websocket": "^1.0.32" + } + }, + "web3-shh": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" + } + } } }, "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", "dev": true, "requires": { "@types/node": "^12.12.6", - "got": "9.6.0", + "got": "12.1.0", "swarm-js": "^0.1.40" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "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 + }, + "got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + } + }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "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 + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + } } }, "web3-core": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" + "web3-core-requestmanager": "1.7.4" }, "dependencies": { "bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" } } }, "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", "dev": true, "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-core-method": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" + "web3-core-subscriptions": "1.7.4" } }, "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", "dev": true, "requires": { "eventemitter3": "4.0.4" @@ -1598,10 +2105,8 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, "requires": { "util": "^0.12.0", - "web3-core-helpers": "1.7.4", "web3-providers-http": "1.7.4", "web3-providers-ipc": "1.7.4", "web3-providers-ws": "1.7.4" @@ -1611,47 +2116,39 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" + "eventemitter3": "4.0.4" } }, "web3-eth": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, "requires": { "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", "web3-core-method": "1.7.4", "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", "web3-eth-accounts": "1.7.4", "web3-eth-contract": "1.7.4", "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" + "web3-net": "1.7.4" } }, "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" + "web3-utils": "1.8.1" } }, "web3-eth-accounts": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", "@ethereumjs/tx": "^3.3.2", @@ -1661,51 +2158,39 @@ "scrypt-js": "^3.0.1", "uuid": "3.3.2", "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" + "web3-core-method": "1.7.4" } }, "web3-eth-contract": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, "requires": { "@types/bn.js": "^5.1.0", "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" + "web3-core-subscriptions": "1.7.4" } }, "web3-eth-ens": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" + "web3-eth-contract": "1.7.4" } }, "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", "dev": true, "requires": { "bn.js": "^5.2.1", - "web3-utils": "1.7.4" + "web3-utils": "1.8.1" }, "dependencies": { "bn.js": { @@ -1720,34 +2205,27 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, "requires": { "@types/node": "^12.12.6", "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" + "web3-net": "1.7.4" } }, "web3-net": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, "requires": { "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" + "web3-core-method": "1.7.4" } }, "web3-providers-http": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, "requires": { - "web3-core-helpers": "1.7.4", "xhr2-cookies": "1.1.0" } }, @@ -1755,20 +2233,16 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" + "oboe": "2.1.5" } }, "web3-providers-ws": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", "websocket": "^1.0.32" } }, @@ -1776,7 +2250,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, "requires": { "web3-core": "1.7.4", "web3-core-method": "1.7.4", @@ -1785,9 +2258,9 @@ } }, "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -1904,27 +2377,25 @@ "dev": true }, "@truffle/interface-adapter": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.21.tgz", - "integrity": "sha512-2ltbu3upsWS0TAQu1kLQc048XlXNmDkCzH6iebX4dg3VBB+l7oG/pu5+/kl8t+LRfzGoEMLKwOQt7vk0Vm3PNA==", + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz", + "integrity": "sha512-fBhoqtT+CT4XKXcOijvw0RIMgyUi3FJg+n5i5PyGBsoRzqbLZd9cZq+oMNjOZPdf3GH68hsOFOaQO5tZH7oZow==", "dev": true, "requires": { "bn.js": "^5.1.3", "ethers": "^4.0.32", - "web3": "1.7.4" + "web3": "1.8.1" }, "dependencies": { "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, "requires": { "defer-to-connect": "^1.0.1" } @@ -1932,26 +2403,27 @@ "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1966,7 +2438,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -1974,8 +2445,7 @@ "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, @@ -1983,7 +2453,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -1991,14 +2460,12 @@ "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "eth-lib": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -2008,8 +2475,7 @@ "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 + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -2017,41 +2483,57 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "http2-wrapper": "^1.0.0-beta.5.2", + "responselike": "^2.0.0" + }, + "dependencies": { + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + } + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" } }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, "requires": { "json-buffer": "3.0.0" } @@ -2059,26 +2541,22 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, "requires": { "lowercase-keys": "^1.0.0" } @@ -2086,40 +2564,475 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", "dev": true, "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" + }, + "dependencies": { + "@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dev": true, + "requires": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + }, + "web3-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-core-helpers": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", + "dev": true, + "requires": { + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-core-method": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "dev": true, + "requires": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-core-promievent": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4" + } + }, + "web3-core-requestmanager": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "dev": true, + "requires": { + "util": "^0.12.0", + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" + } + }, + "web3-core-subscriptions": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1" + } + }, + "web3-eth": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-abi": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.8.1" + } + }, + "web3-eth-accounts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "dev": true, + "requires": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-contract": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-ens": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "dev": true, + "requires": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-iban": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", + "dev": true, + "requires": { + "bn.js": "^5.2.1", + "web3-utils": "1.8.1" + } + }, + "web3-eth-personal": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "dev": true, + "requires": { + "@types/node": "^12.12.6", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-net": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "web3-providers-http": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "dev": true, + "requires": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.1" + } + }, + "web3-providers-ipc": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "dev": true, + "requires": { + "oboe": "2.1.5", + "web3-core-helpers": "1.8.1" + } + }, + "web3-providers-ws": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "dev": true, + "requires": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1", + "websocket": "^1.0.32" + } + }, + "web3-shh": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "dev": true, + "requires": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" + } + }, + "web3-utils": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", + "dev": true, + "requires": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + } + } } }, "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", "dev": true, "requires": { "@types/node": "^12.12.6", - "got": "9.6.0", + "got": "12.1.0", "swarm-js": "^0.1.40" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "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 + }, + "got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + } + }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "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 + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + } } }, "web3-core": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", @@ -2134,7 +3047,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, "requires": { "web3-eth-iban": "1.7.4", "web3-utils": "1.7.4" @@ -2144,7 +3056,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", "web3-core-helpers": "1.7.4", @@ -2157,7 +3068,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, "requires": { "eventemitter3": "4.0.4" } @@ -2166,7 +3076,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, "requires": { "util": "^0.12.0", "web3-core-helpers": "1.7.4", @@ -2179,7 +3088,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, "requires": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.7.4" @@ -2189,7 +3097,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, "requires": { "web3-core": "1.7.4", "web3-core-helpers": "1.7.4", @@ -2209,7 +3116,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", "web3-utils": "1.7.4" @@ -2219,7 +3125,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, "requires": { "@ethereumjs/common": "^2.5.0", "@ethereumjs/tx": "^3.3.2", @@ -2238,7 +3143,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, "requires": { "@types/bn.js": "^5.1.0", "web3-core": "1.7.4", @@ -2254,7 +3158,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", @@ -2270,7 +3173,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, "requires": { "bn.js": "^5.2.1", "web3-utils": "1.7.4" @@ -2280,7 +3182,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, "requires": { "@types/node": "^12.12.6", "web3-core": "1.7.4", @@ -2294,7 +3195,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, "requires": { "web3-core": "1.7.4", "web3-core-method": "1.7.4", @@ -2305,7 +3205,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, "requires": { "web3-core-helpers": "1.7.4", "xhr2-cookies": "1.1.0" @@ -2315,7 +3214,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, "requires": { "oboe": "2.1.5", "web3-core-helpers": "1.7.4" @@ -2325,7 +3223,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, "requires": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.7.4", @@ -2336,7 +3233,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, "requires": { "web3-core": "1.7.4", "web3-core-method": "1.7.4", @@ -2348,7 +3244,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, "requires": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -2454,7 +3349,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, "requires": { "@types/node": "*" } @@ -2463,7 +3357,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "*", @@ -2508,8 +3401,7 @@ "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "@types/json5": { "version": "0.0.29", @@ -2521,7 +3413,6 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, "requires": { "@types/node": "*" } @@ -2541,14 +3432,12 @@ "@types/node": { "version": "18.7.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", - "dev": true + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==" }, "@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -2563,7 +3452,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, "requires": { "@types/node": "*" } @@ -2572,7 +3460,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, "requires": { "@types/node": "*" } @@ -2853,7 +3740,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -2918,8 +3804,7 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sign2": { "version": "0.7.0", @@ -2943,7 +3828,6 @@ "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -2951,8 +3835,7 @@ "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 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -3019,8 +3902,7 @@ "blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, "bluebird": { "version": "3.7.2", @@ -3031,8 +3913,7 @@ "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 + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "body-parser": { "version": "1.20.0", @@ -3117,8 +3998,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "browser-level": { "version": "1.0.1", @@ -3142,7 +4022,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -3156,7 +4035,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -3167,7 +4045,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -3179,7 +4056,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -3188,8 +4064,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -3197,7 +4072,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -3213,8 +4087,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -3222,7 +4095,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, "requires": { "base-x": "^3.0.2" } @@ -3231,7 +4103,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "requires": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -3242,7 +4113,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -3263,20 +4133,17 @@ "buffer-to-arraybuffer": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", - "dev": true + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "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 + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "dev": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -3329,7 +4196,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3549,7 +4415,6 @@ "version": "0.7.5", "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "dev": true, "requires": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -3562,7 +4427,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "dev": true, "requires": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -3574,7 +4438,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3583,8 +4446,7 @@ "class-is": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "classic-level": { "version": "1.2.0", @@ -3686,7 +4548,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -3812,7 +4673,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, "requires": { "cids": "^0.7.1", "multicodec": "^0.5.5", @@ -3837,12 +4697,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3892,14 +4746,12 @@ "crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -3909,7 +4761,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3922,7 +4773,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -3977,7 +4827,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -4021,7 +4870,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -4060,8 +4908,7 @@ "decode-uri-component": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", - "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", - "dev": true + "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==" }, "decompress-response": { "version": "6.0.0", @@ -4105,7 +4952,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -4127,7 +4973,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -4182,7 +5027,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -4230,8 +5074,7 @@ "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "domelementtype": { "version": "2.3.0", @@ -4268,12 +5111,6 @@ "no-case": "^2.2.0" } }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4294,7 +5131,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -4321,7 +5157,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -4368,7 +5203,6 @@ "version": "1.20.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -4414,7 +5248,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4425,7 +5258,6 @@ "version": "0.10.62", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -4436,7 +5268,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -4453,7 +5284,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, "requires": { "d": "^1.0.1", "ext": "^1.1.2" @@ -4891,7 +5721,6 @@ "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, "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -4900,8 +5729,7 @@ "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 + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" } } }, @@ -5398,7 +6226,6 @@ "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, "requires": { "js-sha3": "^0.8.0" } @@ -5407,7 +6234,6 @@ "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, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -5488,7 +6314,6 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, "requires": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -5500,8 +6325,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -5609,7 +6433,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -5618,8 +6441,7 @@ "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 + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, @@ -5642,14 +6464,12 @@ "eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "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, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -5760,7 +6580,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, "requires": { "type": "^2.7.2" }, @@ -5768,8 +6587,7 @@ "type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" } } }, @@ -5928,7 +6746,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -6016,14 +6833,12 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "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, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -6040,8 +6855,7 @@ "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 + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "get-caller-file": { "version": "2.0.5", @@ -6059,7 +6873,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6082,7 +6895,6 @@ "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, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -6211,7 +7023,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, "requires": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -6694,7 +7505,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -6702,8 +7512,7 @@ "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 + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "has-flag": { "version": "4.0.0", @@ -6715,7 +7524,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -6723,14 +7531,12 @@ "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 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "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, "requires": { "has-symbols": "^1.0.2" } @@ -6739,7 +7545,6 @@ "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, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -6750,7 +7555,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -6794,7 +7598,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -6834,8 +7637,7 @@ "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { "version": "2.0.0", @@ -6861,8 +7663,7 @@ "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "dev": true + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, "http-response-object": { "version": "3.0.2", @@ -6925,7 +7726,6 @@ "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, "requires": { "punycode": "2.1.0" } @@ -6933,8 +7733,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "4.0.6", @@ -6983,8 +7782,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -7096,7 +7894,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -7134,7 +7931,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7150,7 +7946,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -7168,7 +7963,6 @@ "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, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7183,8 +7977,7 @@ "is-callable": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", - "dev": true + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==" }, "is-core-module": { "version": "2.10.0", @@ -7199,7 +7992,6 @@ "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, "requires": { "has-tostringtag": "^1.0.0" } @@ -7225,14 +8017,12 @@ "is-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7249,8 +8039,7 @@ "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 + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" }, "is-lower-case": { "version": "1.1.3", @@ -7264,8 +8053,7 @@ "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 + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { "version": "7.0.0", @@ -7277,7 +8065,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7298,7 +8085,6 @@ "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, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7308,7 +8094,6 @@ "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, "requires": { "call-bind": "^1.0.2" } @@ -7317,7 +8102,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -7326,7 +8110,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -7335,7 +8118,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -7347,8 +8129,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-unicode-supported": { "version": "0.1.0", @@ -7375,7 +8156,6 @@ "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, "requires": { "call-bind": "^1.0.2" } @@ -7401,8 +8181,7 @@ "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 + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "js-tokens": { "version": "4.0.0", @@ -7493,7 +8272,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -7783,7 +8561,6 @@ "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, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -7866,7 +8643,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -7902,14 +8678,12 @@ "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dev": true, "requires": { "dom-walk": "^0.1.0" } @@ -7917,14 +8691,12 @@ "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 + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "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 + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "minimatch": { "version": "3.1.2", @@ -8220,7 +8992,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "dev": true, "requires": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -8230,7 +9001,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "dev": true, "requires": { "varint": "^5.0.0" } @@ -8239,7 +9009,6 @@ "version": "0.4.21", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, "requires": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -8250,7 +9019,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "dev": true, "requires": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -8309,8 +9077,7 @@ "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "nice-try": { "version": "1.0.5", @@ -8330,8 +9097,7 @@ "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 + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node-emoji": { "version": "1.11.0", @@ -8372,8 +9138,7 @@ "node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" }, "node-interval-tree": { "version": "2.0.1", @@ -8450,7 +9215,6 @@ "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, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -8459,8 +9223,7 @@ "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 + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" } } }, @@ -8473,26 +9236,22 @@ "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 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "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 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "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, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -8533,7 +9292,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, "requires": { "http-https": "^1.0.0" } @@ -8542,7 +9300,6 @@ "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, "requires": { "wrappy": "1" } @@ -8652,7 +9409,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -8670,8 +9426,7 @@ "parse-headers": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", - "dev": true + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "parse-json": { "version": "4.0.0", @@ -8779,7 +9534,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -8827,12 +9581,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, "prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", @@ -8898,8 +9646,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "process-nextick-args": { "version": "2.0.1", @@ -8942,7 +9689,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -8956,7 +9702,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -8965,8 +9710,7 @@ "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 + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==" }, "pure-rand": { "version": "5.0.3", @@ -8987,7 +9731,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -9003,8 +9746,7 @@ "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "rambda": { "version": "7.2.1", @@ -9016,7 +9758,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -9025,7 +9766,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -9114,7 +9854,6 @@ "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, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9169,7 +9908,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -9302,8 +10040,7 @@ "resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "resolve-from": { "version": "4.0.0", @@ -9373,7 +10110,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -9389,7 +10125,6 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, "requires": { "bn.js": "^5.2.0" }, @@ -9397,8 +10132,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -9444,14 +10178,12 @@ "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 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sc-istanbul": { "version": "0.4.6", @@ -9535,14 +10267,12 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, "requires": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -9689,8 +10419,7 @@ "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 + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -9702,7 +10431,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -9791,7 +10519,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -9807,14 +10534,12 @@ "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dev": true, "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -9825,7 +10550,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -11122,8 +11846,7 @@ "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" }, "string-width": { "version": "2.1.1", @@ -11139,7 +11862,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11150,7 +11872,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11161,7 +11882,6 @@ "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, "requires": { "safe-buffer": "~5.2.0" } @@ -11185,7 +11905,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } @@ -11475,8 +12194,7 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" }, "title-case": { "version": "2.1.1", @@ -11497,12 +12215,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11607,8 +12319,7 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.4.0", @@ -11651,7 +12362,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -11673,7 +12383,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -11729,26 +12438,15 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "url-set-query": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "dev": true + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" }, "utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", - "dev": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -11756,14 +12454,12 @@ "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -11776,8 +12472,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", @@ -11810,8 +12505,7 @@ "varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, "vary": { "version": "1.1.2", @@ -12177,7 +12871,6 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dev": true, "requires": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -12191,7 +12884,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -12199,8 +12891,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -12227,7 +12918,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12246,7 +12936,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -12343,8 +13032,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write": { "version": "1.0.3", @@ -12365,7 +13053,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, "requires": { "global": "~4.4.0", "is-function": "^1.0.1", @@ -12377,7 +13064,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -12392,20 +13078,10 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dev": true, "requires": { "xhr-request": "^1.1.0" } }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", - "dev": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", @@ -12415,8 +13091,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", @@ -12427,8 +13102,7 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "dev": true + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" }, "yallist": { "version": "3.1.1", From a3b9fac30e2c5cf24c9dce2eaee18d69a69db99d Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 22 Dec 2022 21:49:32 -0300 Subject: [PATCH 092/197] Update lockfileVersion to 2 (#3897) --- package-lock.json | 17435 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 16665 insertions(+), 770 deletions(-) diff --git a/package-lock.json b/package-lock.json index e91656361..4463d1df4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,16364 @@ { "name": "openzeppelin-solidity", "version": "4.8.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "openzeppelin-solidity", + "version": "4.8.0", + "license": "MIT", + "bin": { + "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" + }, + "devDependencies": { + "@nomicfoundation/hardhat-network-helpers": "^1.0.3", + "@nomiclabs/hardhat-truffle5": "^2.0.5", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/docs-utils": "^0.1.3", + "@openzeppelin/test-helpers": "^0.5.13", + "chai": "^4.2.0", + "eslint": "^7.32.0", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-mocha": "^10.0.3", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.2.0", + "eth-sig-util": "^3.0.0", + "ethereumjs-util": "^7.0.7", + "ethereumjs-wallet": "^1.0.1", + "glob": "^8.0.3", + "graphlib": "^2.1.8", + "hardhat": "^2.9.1", + "hardhat-gas-reporter": "^1.0.4", + "hardhat-ignore-warnings": "^0.2.0", + "keccak256": "^1.0.2", + "lodash.startcase": "^4.4.0", + "lodash.zip": "^4.2.0", + "merkletreejs": "^0.2.13", + "micromatch": "^4.0.2", + "prettier": "^2.3.0", + "prettier-plugin-solidity": "^1.0.0-beta.16", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "solhint": "^3.3.6", + "solidity-ast": "^0.4.25", + "solidity-coverage": "^0.8.0", + "solidity-docgen": "^0.6.0-beta.29", + "web3": "^1.3.0", + "yargs": "^17.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "dev": true, + "dependencies": { + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" + } + }, + "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, + "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/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "node_modules/@ensdomains/ensjs/node_modules/ethers": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", + "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", + "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.0", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.0", + "@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.0", + "@ethersproject/wordlists": "5.7.0" + } + }, + "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 + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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/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/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "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/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "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/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "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/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "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/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "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/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "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/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "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/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bignumber/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "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/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "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/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "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/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "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/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "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/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "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/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/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/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "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/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "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" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", + "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "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/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "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/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "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/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", + "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", + "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/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/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "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": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "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/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "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/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "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/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "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/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "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/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "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/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "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/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "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/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^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/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", + "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "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/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "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/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@frangio/servbot": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@frangio/servbot/-/servbot-0.2.5.tgz", + "integrity": "sha512-ogja4iAPZ1VwM5MU3C1ZhB88358F0PGbmSTGOkIZwOyLaDoMHIqOVCnavHjR7DV5h+oAI4Z4KDqlam3myQUrmg==", + "dev": true, + "engines": { + "node": ">=12.x", + "pnpm": "7.5.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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": { + "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" + } + }, + "node_modules/@metamask/eth-sig-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, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/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/@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/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", + "dev": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", + "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", + "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", + "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", + "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", + "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", + "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", + "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", + "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", + "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", + "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", + "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "dev": true, + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "dev": true, + "dependencies": { + "@types/bignumber.js": "^5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dev": true, + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, + "node_modules/@openzeppelin/contract-loader": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", + "integrity": "sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@openzeppelin/contract-loader/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": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@openzeppelin/docs-utils": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/docs-utils/-/docs-utils-0.1.3.tgz", + "integrity": "sha512-O/iJ4jEi5ryNc/T74G9gbnFwQ8QaQ2bpAVoYXLPknZJyK52GEAvxC12UMP33KodTNV3rMzeeQrSBIdI8skjDJg==", + "dev": true, + "dependencies": { + "@frangio/servbot": "^0.2.5", + "chalk": "^3.0.0", + "chokidar": "^3.5.3", + "env-paths": "^2.2.0", + "find-up": "^4.1.0", + "is-port-reachable": "^3.0.0", + "js-yaml": "^3.13.1", + "lodash.startcase": "^4.4.0", + "minimist": "^1.2.0" + }, + "bin": { + "oz-docs": "oz-docs.js" + } + }, + "node_modules/@openzeppelin/test-helpers": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", + "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", + "dev": true, + "dependencies": { + "@openzeppelin/contract-loader": "^0.6.2", + "@truffle/contract": "^4.0.35", + "ansi-colors": "^3.2.3", + "chai": "^4.2.0", + "chai-bn": "^0.2.1", + "ethjs-abi": "^0.2.1", + "lodash.flatten": "^4.4.0", + "semver": "^5.6.0", + "web3": "^1.2.5", + "web3-utils": "^1.2.5" + } + }, + "node_modules/@openzeppelin/test-helpers/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", + "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@noble/secp256k1": "~1.6.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", + "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@truffle/abi-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", + "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", + "dev": true, + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.7.4" + } + }, + "node_modules/@truffle/abi-utils/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/abi-utils/node_modules/web3-utils": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz", + "integrity": "sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A==", + "dev": true + }, + "node_modules/@truffle/codec": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", + "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", + "dev": true, + "dependencies": { + "@truffle/abi-utils": "^0.3.1", + "@truffle/compile-common": "^0.8.0", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.7.4" + } + }, + "node_modules/@truffle/codec/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/codec/node_modules/web3-utils": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/compile-common": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", + "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", + "dev": true, + "dependencies": { + "@truffle/error": "^0.1.1", + "colors": "1.4.0" + } + }, + "node_modules/@truffle/contract": { + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.10.tgz", + "integrity": "sha512-69IZSXeQKRP3EutILqe+vLY5A5gUpeXUiZhm/Fy/qHHkP238vMjtOkTZGkY6bonYqmgk+vDY7KSYSYKzDNPdCA==", + "dev": true, + "dependencies": { + "@ensdomains/ensjs": "^2.1.0", + "@truffle/blockchain-utils": "^0.1.6", + "@truffle/contract-schema": "^3.4.11", + "@truffle/debug-utils": "^6.0.42", + "@truffle/error": "^0.1.1", + "@truffle/interface-adapter": "^0.5.26", + "bignumber.js": "^7.2.1", + "debug": "^4.3.1", + "ethers": "^4.0.32", + "web3": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" + } + }, + "node_modules/@truffle/contract-schema": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", + "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", + "dev": true, + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/abi-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", + "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", + "dev": true, + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.8.1" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/blockchain-utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", + "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/@truffle/codec": { + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", + "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", + "dev": true, + "dependencies": { + "@truffle/abi-utils": "^0.3.6", + "@truffle/compile-common": "^0.9.1", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.8.1" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/codec/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/@truffle/compile-common": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", + "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", + "dev": true, + "dependencies": { + "@truffle/error": "^0.1.1", + "colors": "1.4.0" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/contract-schema": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", + "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "dev": true, + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/debug-utils": { + "version": "6.0.42", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", + "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", + "dev": true, + "dependencies": { + "@truffle/codec": "^0.14.11", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.5" + } + }, + "node_modules/@truffle/contract/node_modules/@truffle/debug-utils/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/contract/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/contract/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@truffle/contract/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@truffle/contract/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/@truffle/contract/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": ">=4" + } + }, + "node_modules/@truffle/contract/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/contract/node_modules/web3": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/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/@truffle/contract/node_modules/web3-bzz/node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/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/@truffle/contract/node_modules/web3-bzz/node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/contract/node_modules/web3-core-helpers": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", + "dev": true, + "dependencies": { + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-core-promievent": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-eth-abi": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-eth-iban": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-eth-iban/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/web3-utils": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3-utils/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-method": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "dev": true, + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-requestmanager": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "dev": true, + "dependencies": { + "util": "^0.12.0", + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-subscriptions": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "dev": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-accounts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-contract": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-ens": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "dev": true, + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-personal": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "dev": true, + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-net": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "dev": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-http": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "dev": true, + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-ipc": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "dev": true, + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-ws": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-shh": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/debug-utils": { + "version": "6.0.34", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", + "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", + "dev": true, + "dependencies": { + "@truffle/codec": "^0.14.4", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.5" + } + }, + "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/debug-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@truffle/debug-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@truffle/debug-utils/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": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", + "dev": true + }, + "node_modules/@truffle/interface-adapter": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz", + "integrity": "sha512-fBhoqtT+CT4XKXcOijvw0RIMgyUi3FJg+n5i5PyGBsoRzqbLZd9cZq+oMNjOZPdf3GH68hsOFOaQO5tZH7oZow==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.8.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/eth-lib/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/@truffle/interface-adapter/node_modules/web3": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/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/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/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/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-helpers": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", + "dev": true, + "dependencies": { + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-method": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "dev": true, + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-promievent": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-requestmanager": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "dev": true, + "dependencies": { + "util": "^0.12.0", + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-subscriptions": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "dev": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-abi": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-accounts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-contract": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-ens": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "dev": true, + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-iban": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-personal": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "dev": true, + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-net": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "dev": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-http": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "dev": true, + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-ipc": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "dev": true, + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-ws": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.1", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-shh": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-utils": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@trufflesuite/chromafi/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": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", + "dev": true + }, + "node_modules/@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", + "dev": true, + "dependencies": { + "bignumber.js": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "dev": true + }, + "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, + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@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 + }, + "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/node": { + "version": "18.7.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "dev": true + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "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/abortcontroller-polyfill": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", + "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", + "dev": 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, + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abstract-level/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/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/antlr4": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", + "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", + "dev": true + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "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/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "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" + } + }, + "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, + "engines": { + "node": "*" + } + }, + "node_modules/ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": 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==", + "dev": true, + "dependencies": { + "async": "^2.4.0" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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" + } + ] + }, + "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", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bigint-crypto-utils": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", + "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "dev": true, + "dependencies": { + "bigint-mod-arith": "^3.1.0" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bigint-mod-arith": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", + "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "dev": true, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "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 + }, + "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/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/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/body-parser/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/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/browser-stdout": { + "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 + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "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/buffer-from": { + "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 + }, + "node_modules/buffer-reverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", + "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", + "dev": true + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", + "dev": true + }, + "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/bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": 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, + "engines": { + "node": ">=6" + } + }, + "node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cbor/node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-bn": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz", + "integrity": "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==", + "dev": true, + "peerDependencies": { + "bn.js": "^4.11.0", + "chai": "^4.0.0" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true + }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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/cliui/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "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 + }, + "node_modules/commander": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "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 + }, + "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, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dev": true, + "dependencies": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "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 + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-addr-codec": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "dev": true, + "dependencies": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", + "dev": true + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "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 + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", + "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port/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/detect-port/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/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "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, + "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/emoji-regex": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", + "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", + "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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-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", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", + "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "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" + } + ], + "peerDependencies": { + "eslint": "^7.12.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1 || ^5.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/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/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/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/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-mocha": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", + "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "rambda": "^7.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", + "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "dev": true, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "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", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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/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", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "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 + }, + "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==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": 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": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/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/eth-gas-reporter/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eth-gas-reporter/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@scure/bip32": "1.1.0", + "@scure/bip39": "1.1.0" + } + }, + "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/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==", + "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" + } + }, + "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==", + "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": "*" + } + }, + "node_modules/eth-gas-reporter/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": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "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/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "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_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" + }, + "engines": { + "node": ">=6" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eth-gas-reporter/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "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==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "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 + }, + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/eth-sig-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-3.0.1.tgz", + "integrity": "sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==", + "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", + "dev": true, + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.0" + } + }, + "node_modules/eth-sig-util/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "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_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/ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dev": true, + "dependencies": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + } + }, + "node_modules/ethereum-ens/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/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/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/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "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/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "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" + } + }, + "node_modules/ethers/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/ethers/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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/ethers/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/ethers/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "node_modules/ethers/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true + }, + "node_modules/ethers/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/ethjs-abi": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", + "integrity": "sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==", + "dev": true, + "dependencies": { + "bn.js": "4.11.6", + "js-sha3": "0.5.5", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-abi/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-abi/node_modules/js-sha3": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", + "integrity": "sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==", + "dev": 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, + "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/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "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": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/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/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/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/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "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/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-check": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "dev": true, + "dependencies": { + "pure-rand": "^5.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "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-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.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "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-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "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": "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/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.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/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "dependencies": { + "minipass": "^2.6.0" + } + }, + "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/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.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/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": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "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.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { + "@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/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "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", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", + "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", + "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", + "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", + "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", + "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", + "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", + "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", + "@nomicfoundation/solidity-analyzer": "^0.0.3", + "@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.4.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/cli.js" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "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, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat-ignore-warnings": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", + "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0", + "node-interval-tree": "^2.0.1", + "solidity-comments": "^0.0.2" + } + }, + "node_modules/hardhat-ignore-warnings/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hardhat/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/hardhat/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", + "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.6.3", + "@scure/bip32": "1.1.0", + "@scure/bip39": "1.1.0" + } + }, + "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": ">=4" + } + }, + "node_modules/hardhat/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/hardhat/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": ">=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/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": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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": ">=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/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": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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==", + "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" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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": { + "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/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==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/hardhat/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "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_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/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "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/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-solidity": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz", + "integrity": "sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg==", + "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==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "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/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "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": { + "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_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "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": { + "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_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", + "dev": true + }, + "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": { + "@types/node": "^10.0.3" + } + }, + "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": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "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": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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": ">=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, + "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", + "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": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "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": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "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, + "engines": { + "node": ">=8" + } + }, + "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": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/inquirer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer/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": ">=4" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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": ">= 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, + "engines": { + "node": ">=0.10.0" + } + }, + "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": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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 + }, + "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": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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" + } + }, + "node_modules/is-callable": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "engines": { + "node": ">=0.10.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/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/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.12.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==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">=8" + } + }, + "node_modules/is-port-reachable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", + "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dev": true, + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "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 + }, + "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, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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/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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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", + "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/jsonfile": { + "version": "4.0.0", + "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": { + "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.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "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/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": { + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" + } + }, + "node_modules/keccak256/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "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/keyv": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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, + "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, + "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-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/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": ">=12" + } + }, + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "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/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, + "dependencies": { + "error-ex": "^1.2.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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/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, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "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.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "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/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "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": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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.9.0" + } + }, + "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": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.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, + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "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/merkletreejs": { + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.2.32.tgz", + "integrity": "sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.1", + "buffer-reverse": "^1.0.1", + "crypto-js": "^3.1.9-1", + "treeify": "^1.1.0", + "web3-utils": "^1.3.4" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/merkletreejs/node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.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==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "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/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">= 0.6" + } + }, + "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": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "dependencies": { + "minipass": "^2.9.0" + } + }, + "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": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dev": true, + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "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" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "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/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/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/mocha/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/mocha/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/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/glob/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": "*" + } + }, + "node_modules/mocha/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/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": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/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": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/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": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", + "dev": true + }, + "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, + "engines": { + "node": ">=10" + } + }, + "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/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "dependencies": { + "varint": "^5.0.0" + } + }, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } + }, + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "node_modules/nano-base32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==", + "dev": true + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", + "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, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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 + }, + "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/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.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==", + "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": { + "lodash": "^4.17.21" + } + }, + "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==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-interval-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", + "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "dev": true, + "dependencies": { + "shallowequal": "^1.1.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": { + "abbrev": "1" + }, + "bin": { + "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, + "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.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": 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", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?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==", + "dev": 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, + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "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/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": "*" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dev": true, + "dependencies": { + "http-https": "^1.0.0" + } + }, + "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, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "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_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, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "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-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "dev": true + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dev": true, + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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" + }, + "engines": { + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-solidity": { + "version": "1.0.0-beta.24", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz", + "integrity": "sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg==", + "dev": true, + "dependencies": { + "@solidity-parser/parser": "^0.14.3", + "emoji-regex": "^10.1.0", + "escape-string-regexp": "^4.0.0", + "semver": "^7.3.7", + "solidity-comments-extractor": "^0.0.7", + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "prettier": "^2.3.0" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/string-width/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/prettier-plugin-solidity/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", + "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rambda": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz", + "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA==", + "dev": true + }, + "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/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "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, + "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, + "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, + "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, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.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==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "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": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=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==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "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-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==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "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", + "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_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "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.", + "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", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "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_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rlp": { + "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": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/rlp/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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": { + "queue-microtask": "^1.2.2" + } + }, + "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, + "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/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": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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/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==", + "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" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "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/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "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/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": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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/send/node_modules/debug/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/send/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/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "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": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dev": true, + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "dev": true, + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/sha3/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/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, + "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": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "dev": true, + "dependencies": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "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, + "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/solc/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/solc/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, + "engines": { + "node": ">=0.10.0" + } + }, + "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": { + "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/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 + }, + "node_modules/solc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/solc/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, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/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 + }, + "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, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solc/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, + "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/solc/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/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 + }, + "node_modules/solc/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, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/solc/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, + "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/solc/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, + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/solhint": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", + "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", + "dev": true, + "dependencies": { + "@solidity-parser/parser": "^0.14.1", + "ajv": "^6.6.1", + "antlr4": "4.7.1", + "ast-parents": "0.0.1", + "chalk": "^2.4.2", + "commander": "2.18.0", + "cosmiconfig": "^5.0.7", + "eslint": "^5.6.0", + "fast-diff": "^1.1.2", + "glob": "^7.1.3", + "ignore": "^4.0.6", + "js-yaml": "^3.12.0", + "lodash": "^4.17.11", + "semver": "^6.3.0" + }, + "bin": { + "solhint": "solhint.js" + }, + "optionalDependencies": { + "prettier": "^1.14.3" + } + }, + "node_modules/solhint/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/solhint/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solhint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solhint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/solhint/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/solhint/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solhint/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/solhint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/solhint/node_modules/eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/solhint/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/solhint/node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solhint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/eslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solhint/node_modules/espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/solhint/node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/solhint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/solhint/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/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": ">=4" + } + }, + "node_modules/solhint/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/solhint/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/solhint/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/solhint/node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/solhint/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/solhint/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/solhint/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solhint/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solhint/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solhint/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solhint/node_modules/string-width/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solhint/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solhint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solhint/node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/solhint/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/solhint/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/solidity-ast": { + "version": "0.4.35", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.35.tgz", + "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", + "dev": true + }, + "node_modules/solidity-comments": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments/-/solidity-comments-0.0.2.tgz", + "integrity": "sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==", + "dev": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "solidity-comments-darwin-arm64": "0.0.2", + "solidity-comments-darwin-x64": "0.0.2", + "solidity-comments-freebsd-x64": "0.0.2", + "solidity-comments-linux-arm64-gnu": "0.0.2", + "solidity-comments-linux-arm64-musl": "0.0.2", + "solidity-comments-linux-x64-gnu": "0.0.2", + "solidity-comments-linux-x64-musl": "0.0.2", + "solidity-comments-win32-arm64-msvc": "0.0.2", + "solidity-comments-win32-ia32-msvc": "0.0.2", + "solidity-comments-win32-x64-msvc": "0.0.2" + } + }, + "node_modules/solidity-comments-darwin-arm64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz", + "integrity": "sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-darwin-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz", + "integrity": "sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "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-comments-freebsd-x64": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz", + "integrity": "sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz", + "integrity": "sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-arm64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz", + "integrity": "sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-gnu": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz", + "integrity": "sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-linux-x64-musl": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz", + "integrity": "sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-arm64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz", + "integrity": "sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-ia32-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz", + "integrity": "sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-comments-win32-x64-msvc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz", + "integrity": "sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "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" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "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/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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/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/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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_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==", + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "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": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "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\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "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": "*" + } + }, + "node_modules/solidity-coverage/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": ">=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==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "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_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/solidity-coverage/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/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==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/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/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==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-docgen": { + "version": "0.6.0-beta.29", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", + "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", + "dev": true, + "dependencies": { + "handlebars": "^4.7.7", + "solidity-ast": "^0.4.31" + }, + "peerDependencies": { + "hardhat": "^2.8.0" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": 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 + }, + "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, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": 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/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "engines": { + "node": ">=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/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + } + }, + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "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" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "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 + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "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/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": 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.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsort": { + "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": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", + "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "dev": true + }, + "node_modules/undici": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", + "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", + "dev": true, + "engines": { + "node": ">=12.18" + } + }, + "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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dev": true, + "dependencies": { + "upper-case": "^1.1.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", + "dev": true + }, + "node_modules/utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "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, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/web3": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", + "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.7.5", + "web3-core": "1.7.5", + "web3-eth": "1.7.5", + "web3-eth-personal": "1.7.5", + "web3-net": "1.7.5", + "web3-shh": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", + "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/web3-core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", + "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.7.5", + "web3-core-method": "1.7.5", + "web3-core-requestmanager": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-helpers": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", + "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "dev": true, + "dependencies": { + "web3-eth-iban": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-method": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", + "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "dev": true, + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.7.5", + "web3-core-promievent": "1.7.5", + "web3-core-subscriptions": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-promievent": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", + "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-requestmanager": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", + "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "dev": true, + "dependencies": { + "util": "^0.12.0", + "web3-core-helpers": "1.7.5", + "web3-providers-http": "1.7.5", + "web3-providers-ipc": "1.7.5", + "web3-providers-ws": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-subscriptions": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", + "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/web3-core/node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/web3-eth": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", + "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "dev": true, + "dependencies": { + "web3-core": "1.7.5", + "web3-core-helpers": "1.7.5", + "web3-core-method": "1.7.5", + "web3-core-subscriptions": "1.7.5", + "web3-eth-abi": "1.7.5", + "web3-eth-accounts": "1.7.5", + "web3-eth-contract": "1.7.5", + "web3-eth-ens": "1.7.5", + "web3-eth-iban": "1.7.5", + "web3-eth-personal": "1.7.5", + "web3-net": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", + "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", + "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "@ethereumjs/tx": "^3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "3.3.2", + "web3-core": "1.7.5", + "web3-core-helpers": "1.7.5", + "web3-core-method": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "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/web3-eth-contract": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", + "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.7.5", + "web3-core-helpers": "1.7.5", + "web3-core-method": "1.7.5", + "web3-core-promievent": "1.7.5", + "web3-core-subscriptions": "1.7.5", + "web3-eth-abi": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", + "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "dev": true, + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.7.5", + "web3-core-helpers": "1.7.5", + "web3-core-promievent": "1.7.5", + "web3-eth-abi": "1.7.5", + "web3-eth-contract": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", + "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/web3-eth-personal": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", + "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "dev": true, + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.7.5", + "web3-core-helpers": "1.7.5", + "web3-core-method": "1.7.5", + "web3-net": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/web3-net": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", + "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "dev": true, + "dependencies": { + "web3-core": "1.7.5", + "web3-core-method": "1.7.5", + "web3-utils": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-http": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", + "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "dev": true, + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", + "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "dev": true, + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", + "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.7.5", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-shh": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", + "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "web3-core": "1.7.5", + "web3-core-method": "1.7.5", + "web3-core-subscriptions": "1.7.5", + "web3-net": "1.7.5" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", + "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dev": true, + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/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/websocket/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/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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/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, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "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==", + "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/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "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/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": true, + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "dependencies": { + "xhr-request": "^1.1.0" + } + }, + "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", + "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", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "dev": true, + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "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.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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/yargs/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", @@ -208,6 +16564,7 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, "requires": { "crc-32": "^1.2.0", "ethereumjs-util": "^7.1.5" @@ -217,6 +16574,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dev": true, "requires": { "@ethereumjs/common": "^2.6.4", "ethereumjs-util": "^7.1.5" @@ -226,6 +16584,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -242,6 +16601,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -256,6 +16616,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -268,6 +16629,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -280,6 +16642,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0" } @@ -298,6 +16661,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -307,7 +16671,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -315,6 +16680,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -323,6 +16689,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0" } @@ -349,6 +16716,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -414,6 +16782,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -422,12 +16791,14 @@ "@ethersproject/logger": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "dev": true }, "@ethersproject/networks": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -446,6 +16817,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -482,7 +16854,8 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -500,6 +16873,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -520,6 +16894,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -532,7 +16907,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -554,6 +16930,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -564,6 +16941,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -614,6 +16992,7 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1336,19 +17715,6 @@ "web3-utils": "1.8.1" }, "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@truffle/abi-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", @@ -1437,7 +17803,8 @@ "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -1448,40 +17815,6 @@ "color-convert": "^1.9.0" } }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1508,19 +17841,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1531,100 +17851,19 @@ "version": "0.2.8", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", "xhr-request-promise": "^0.1.2" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "http2-wrapper": "^1.0.0-beta.5.2", - "responselike": "^2.0.0" - }, - "dependencies": { - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - } - } - }, "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 }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1634,11 +17873,6 @@ "has-flag": "^3.0.0" } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, "web3": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", @@ -2054,25 +18288,6 @@ } } }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4" - }, - "dependencies": { - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" - } - } - }, "web3-core-helpers": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", @@ -2083,15 +18298,6 @@ "web3-utils": "1.8.1" } }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-subscriptions": "1.7.4" - } - }, "web3-core-promievent": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", @@ -2101,40 +18307,6 @@ "eventemitter3": "4.0.4" } }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "requires": { - "util": "^0.12.0", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4" - } - }, "web3-eth-abi": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", @@ -2145,44 +18317,6 @@ "web3-utils": "1.8.1" } }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-method": "1.7.4" - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-eth-contract": "1.7.4" - } - }, "web3-eth-iban": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", @@ -2201,62 +18335,6 @@ } } }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "requires": { - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "requires": { - "oboe": "2.1.5" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "requires": { - "eventemitter3": "4.0.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, "web3-utils": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", @@ -2387,85 +18465,29 @@ "web3": "1.8.1" }, "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true }, "eth-lib": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -2475,97 +18497,11 @@ "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==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "requires": { - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "http2-wrapper": "^1.0.0-beta.5.2", - "responselike": "^2.0.0" - }, - "dependencies": { - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - } - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, "web3": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", @@ -3028,231 +18964,6 @@ } } } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } } } }, @@ -3349,6 +19060,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dev": true, "requires": { "@types/node": "*" } @@ -3357,6 +19069,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "*", @@ -3401,7 +19114,8 @@ "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -3413,6 +19127,7 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, "requires": { "@types/node": "*" } @@ -3432,12 +19147,14 @@ "@types/node": { "version": "18.7.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==" + "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "dev": true }, "@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dev": true, "requires": { "@types/node": "*" } @@ -3452,6 +19169,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, "requires": { "@types/node": "*" } @@ -3460,6 +19178,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dev": true, "requires": { "@types/node": "*" } @@ -3538,7 +19257,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "address": { "version": "1.2.1", @@ -3740,6 +19460,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -3804,7 +19525,8 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true }, "aws-sign2": { "version": "0.7.0", @@ -3828,6 +19550,7 @@ "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -3835,7 +19558,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -3902,7 +19626,8 @@ "blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true }, "bluebird": { "version": "3.7.2", @@ -3913,7 +19638,8 @@ "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==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, "body-parser": { "version": "1.20.0", @@ -3998,7 +19724,8 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true }, "browser-level": { "version": "1.0.1", @@ -4022,6 +19749,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -4035,6 +19763,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -4045,6 +19774,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -4056,6 +19786,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -4064,7 +19795,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -4072,6 +19804,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -4087,7 +19820,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -4095,6 +19829,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, "requires": { "base-x": "^3.0.2" } @@ -4103,6 +19838,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, "requires": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -4113,6 +19849,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4133,17 +19870,20 @@ "buffer-to-arraybuffer": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", + "dev": true }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true }, "bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "dev": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -4196,6 +19936,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -4298,7 +20039,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz", "integrity": "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==", - "dev": true + "dev": true, + "requires": {} }, "chalk": { "version": "3.0.0", @@ -4415,6 +20157,7 @@ "version": "0.7.5", "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "dev": true, "requires": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -4427,6 +20170,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "dev": true, "requires": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -4438,6 +20182,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -4446,7 +20191,8 @@ "class-is": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true }, "classic-level": { "version": "1.2.0", @@ -4548,6 +20294,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -4673,6 +20420,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, "requires": { "cids": "^0.7.1", "multicodec": "^0.5.5", @@ -4746,12 +20494,14 @@ "crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -4761,6 +20511,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -4773,6 +20524,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -4827,6 +20579,7 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -4870,6 +20623,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -4908,7 +20662,8 @@ "decode-uri-component": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", - "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==" + "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", + "dev": true }, "decompress-response": { "version": "6.0.0", @@ -4952,6 +20707,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -4973,6 +20729,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -5027,6 +20784,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -5074,7 +20832,8 @@ "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true }, "domelementtype": { "version": "2.3.0", @@ -5131,6 +20890,7 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -5157,6 +20917,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -5203,6 +20964,7 @@ "version": "1.20.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -5248,6 +21010,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5258,6 +21021,7 @@ "version": "0.10.62", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, "requires": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -5268,6 +21032,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -5284,6 +21049,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, "requires": { "d": "^1.0.1", "ext": "^1.1.2" @@ -5452,7 +21218,8 @@ "version": "16.0.3", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -5605,7 +21372,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -5721,6 +21489,7 @@ "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, "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -5729,7 +21498,8 @@ "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==" + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true } } }, @@ -6226,6 +21996,7 @@ "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, "requires": { "js-sha3": "^0.8.0" } @@ -6234,6 +22005,7 @@ "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, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -6314,6 +22086,7 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, "requires": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -6325,7 +22098,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -6433,6 +22207,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -6441,7 +22216,8 @@ "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==" + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true } } }, @@ -6464,12 +22240,14 @@ "eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true }, "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, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -6580,6 +22358,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, "requires": { "type": "^2.7.2" }, @@ -6587,7 +22366,8 @@ "type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true } } }, @@ -6746,6 +22526,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -6833,12 +22614,14 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "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, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -6855,7 +22638,8 @@ "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==" + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, "get-caller-file": { "version": "2.0.5", @@ -6873,6 +22657,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6895,6 +22680,7 @@ "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, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -7023,6 +22809,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, "requires": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -7505,6 +23292,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -7512,7 +23300,8 @@ "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==" + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -7524,6 +23313,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -7531,12 +23321,14 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "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, "requires": { "has-symbols": "^1.0.2" } @@ -7545,6 +23337,7 @@ "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, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -7555,6 +23348,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -7598,6 +23392,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -7637,7 +23432,8 @@ "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true }, "http-errors": { "version": "2.0.0", @@ -7663,7 +23459,8 @@ "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", + "dev": true }, "http-response-object": { "version": "3.0.2", @@ -7726,6 +23523,7 @@ "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, "requires": { "punycode": "2.1.0" } @@ -7733,7 +23531,8 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "4.0.6", @@ -7782,7 +23581,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.8", @@ -7894,6 +23694,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -7931,6 +23732,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7946,6 +23748,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -7963,6 +23766,7 @@ "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, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7977,7 +23781,8 @@ "is-callable": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==" + "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "dev": true }, "is-core-module": { "version": "2.10.0", @@ -7992,6 +23797,7 @@ "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, "requires": { "has-tostringtag": "^1.0.0" } @@ -8017,12 +23823,14 @@ "is-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -8039,7 +23847,8 @@ "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==" + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true }, "is-lower-case": { "version": "1.1.3", @@ -8053,7 +23862,8 @@ "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==" + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true }, "is-number": { "version": "7.0.0", @@ -8065,6 +23875,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -8085,6 +23896,7 @@ "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, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8094,6 +23906,7 @@ "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, "requires": { "call-bind": "^1.0.2" } @@ -8102,6 +23915,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -8110,6 +23924,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -8118,6 +23933,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -8129,7 +23945,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "is-unicode-supported": { "version": "0.1.0", @@ -8156,6 +23973,7 @@ "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, "requires": { "call-bind": "^1.0.2" } @@ -8181,7 +23999,8 @@ "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true }, "js-tokens": { "version": "4.0.0", @@ -8272,6 +24091,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "dev": true, "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -8530,6 +24350,12 @@ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true }, + "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 + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8539,12 +24365,6 @@ "yallist": "^3.0.2" } }, - "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 - }, "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -8561,6 +24381,7 @@ "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, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -8643,6 +24464,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -8678,12 +24500,14 @@ "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, "requires": { "dom-walk": "^0.1.0" } @@ -8691,12 +24515,14 @@ "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==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "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==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true }, "minimatch": { "version": "3.1.2", @@ -8992,6 +24818,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "dev": true, "requires": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -9001,6 +24828,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "dev": true, "requires": { "varint": "^5.0.0" } @@ -9009,6 +24837,7 @@ "version": "0.4.21", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, "requires": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -9019,6 +24848,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "dev": true, "requires": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -9077,7 +24907,8 @@ "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true }, "nice-try": { "version": "1.0.5", @@ -9097,7 +24928,8 @@ "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==" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true }, "node-emoji": { "version": "1.11.0", @@ -9138,7 +24970,8 @@ "node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true }, "node-interval-tree": { "version": "2.0.1", @@ -9215,6 +25048,7 @@ "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, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -9223,7 +25057,8 @@ "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==" + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true } } }, @@ -9236,22 +25071,26 @@ "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==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "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, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -9292,6 +25131,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dev": true, "requires": { "http-https": "^1.0.0" } @@ -9300,6 +25140,7 @@ "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, "requires": { "wrappy": "1" } @@ -9409,6 +25250,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -9426,7 +25268,8 @@ "parse-headers": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "dev": true }, "parse-json": { "version": "4.0.0", @@ -9534,6 +25377,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -9646,7 +25490,8 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -9689,6 +25534,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -9702,6 +25548,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -9710,7 +25557,8 @@ "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==" + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "dev": true }, "pure-rand": { "version": "5.0.3", @@ -9731,6 +25579,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -9746,7 +25595,8 @@ "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true }, "rambda": { "version": "7.2.1", @@ -9758,6 +25608,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -9766,6 +25617,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -9854,6 +25706,7 @@ "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, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9908,6 +25761,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -10040,7 +25894,8 @@ "resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true }, "resolve-from": { "version": "4.0.0", @@ -10110,6 +25965,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -10125,6 +25981,7 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, "requires": { "bn.js": "^5.2.0" }, @@ -10132,7 +25989,8 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true } } }, @@ -10178,12 +26036,14 @@ "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==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sc-istanbul": { "version": "0.4.6", @@ -10267,12 +26127,14 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true }, "secp256k1": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dev": true, "requires": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -10419,7 +26281,8 @@ "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==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -10431,6 +26294,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -10519,6 +26383,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -10534,12 +26399,14 @@ "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true }, "simple-get": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "dev": true, "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -10550,6 +26417,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -11846,7 +27714,17 @@ "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "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, + "requires": { + "safe-buffer": "~5.2.0" + } }, "string-width": { "version": "2.1.1", @@ -11862,6 +27740,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11872,20 +27751,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.19.5" } }, - "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==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -11905,6 +27777,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } @@ -12194,7 +28067,8 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true }, "title-case": { "version": "2.1.1", @@ -12319,7 +28193,8 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true }, "type-check": { "version": "0.4.0", @@ -12362,6 +28237,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -12383,6 +28259,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -12441,12 +28318,14 @@ "url-set-query": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", + "dev": true }, "utf-8-validate": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "dev": true, "requires": { "node-gyp-build": "^4.3.0" } @@ -12454,12 +28333,14 @@ "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -12472,7 +28353,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "utils-merge": { "version": "1.0.1", @@ -12505,7 +28387,8 @@ "varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true }, "vary": { "version": "1.1.2", @@ -12871,6 +28754,7 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dev": true, "requires": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -12884,6 +28768,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -12891,7 +28776,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true } } }, @@ -12918,6 +28804,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12936,6 +28823,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -13032,7 +28920,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "write": { "version": "1.0.3", @@ -13047,12 +28936,14 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true + "dev": true, + "requires": {} }, "xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, "requires": { "global": "~4.4.0", "is-function": "^1.0.1", @@ -13064,6 +28955,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -13078,6 +28970,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, "requires": { "xhr-request": "^1.1.0" } @@ -13091,7 +28984,8 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { "version": "5.0.8", @@ -13102,7 +28996,8 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "dev": true }, "yallist": { "version": "3.1.1", From 4072e853fe759122056a32e2b006d2c3968e0f28 Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 6 Dec 2022 11:55:49 -0300 Subject: [PATCH 093/197] Disable Foundry for slither-action --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4e92c1043..81b0b8f46 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,6 +76,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup + - run: rm foundry.toml - uses: crytic/slither-action@v0.2.0 codespell: From b709eae01d1da91902d06ace340df6b324e6f049 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 23 Dec 2022 22:28:05 -0300 Subject: [PATCH 094/197] Update Prettier Solidity (#3898) --- .prettierrc | 3 +- CHANGELOG.md | 1 + .../polygon/CrossChainEnabledPolygonChild.sol | 2 +- contracts/finance/VestingWallet.sol | 6 +- contracts/governance/Governor.sol | 27 ++--- contracts/governance/TimelockController.sol | 20 +--- .../GovernorCompatibilityBravo.sol | 17 +-- .../IGovernorCompatibilityBravo.sol | 8 +- .../extensions/GovernorCountingSimple.sol | 13 +-- .../extensions/GovernorSettings.sol | 6 +- .../extensions/GovernorTimelockControl.sol | 2 +- contracts/governance/utils/IVotes.sol | 9 +- contracts/governance/utils/Votes.sol | 12 +- contracts/interfaces/IERC1363.sol | 25 +--- contracts/interfaces/IERC1363Spender.sol | 6 +- contracts/interfaces/IERC2981.sol | 8 +- contracts/interfaces/IERC4626.sol | 12 +- contracts/metatx/MinimalForwarder.sol | 9 +- contracts/mocks/AddressImpl.sol | 6 +- contracts/mocks/CheckpointsMock.sol | 30 +---- contracts/mocks/ClonesMock.sol | 6 +- contracts/mocks/ContextMock.sol | 6 +- contracts/mocks/Create2Impl.sol | 6 +- contracts/mocks/DummyImplementation.sol | 6 +- contracts/mocks/ECDSAMock.sol | 13 +-- contracts/mocks/EIP712External.sol | 7 +- contracts/mocks/ERC1155BurnableMock.sol | 7 +- contracts/mocks/ERC1155Mock.sol | 26 +---- contracts/mocks/ERC1155ReceiverMock.sol | 7 +- contracts/mocks/ERC20CappedMock.sol | 6 +- contracts/mocks/ERC20DecimalsMock.sol | 6 +- contracts/mocks/ERC20Mock.sol | 12 +- contracts/mocks/ERC3156FlashBorrowerMock.sol | 2 +- contracts/mocks/ERC4626Mock.sol | 32 ++---- contracts/mocks/ERC721BurnableMock.sol | 6 +- .../mocks/ERC721ConsecutiveEnumerableMock.sol | 10 +- contracts/mocks/ERC721EnumerableMock.sol | 6 +- contracts/mocks/ERC721Mock.sol | 6 +- contracts/mocks/ERC721PausableMock.sol | 6 +- contracts/mocks/ERC721RoyaltyMock.sol | 6 +- contracts/mocks/ERC721URIStorageMock.sol | 6 +- contracts/mocks/ERC777Mock.sol | 20 +--- contracts/mocks/ERC777SenderRecipientMock.sol | 13 +-- .../mocks/GovernorCompatibilityBravoMock.sol | 27 ++--- .../mocks/GovernorPreventLateQuorumMock.sol | 9 +- .../mocks/GovernorTimelockCompoundMock.sol | 27 ++--- .../mocks/GovernorTimelockControlMock.sol | 18 +-- contracts/mocks/MathMock.sol | 7 +- contracts/mocks/MerkleProofWrapper.sol | 12 +- .../MultipleInheritanceInitializableMocks.sol | 7 +- contracts/mocks/SafeERC20Helper.sol | 18 +-- contracts/mocks/SafeMathMock.sol | 18 +-- contracts/mocks/SignatureCheckerMock.sol | 6 +- contracts/mocks/UUPS/UUPSLegacy.sol | 6 +- contracts/mocks/crosschain/bridges.sol | 12 +- contracts/mocks/wizard/MyGovernor1.sol | 28 ++--- contracts/mocks/wizard/MyGovernor2.sol | 28 ++--- contracts/mocks/wizard/MyGovernor3.sol | 37 +++--- contracts/proxy/Clones.sol | 9 +- contracts/proxy/ERC1967/ERC1967Upgrade.sol | 18 +-- .../TransparentUpgradeableProxy.sol | 6 +- contracts/token/ERC1155/ERC1155.sol | 36 ++---- contracts/token/ERC1155/IERC1155.sol | 16 +-- .../ERC1155/extensions/ERC1155Burnable.sol | 12 +- .../presets/ERC1155PresetMinterPauser.sol | 24 +--- contracts/token/ERC20/ERC20.sol | 36 +----- contracts/token/ERC20/IERC20.sol | 6 +- .../token/ERC20/extensions/ERC20Pausable.sol | 6 +- .../token/ERC20/extensions/ERC20Snapshot.sol | 6 +- .../token/ERC20/extensions/ERC20Votes.sol | 12 +- contracts/token/ERC20/extensions/ERC4626.sol | 19 +--- .../ERC20/presets/ERC20PresetFixedSupply.sol | 7 +- contracts/token/ERC20/utils/SafeERC20.sol | 31 +---- contracts/token/ERC20/utils/TokenTimelock.sol | 6 +- contracts/token/ERC721/ERC721.sol | 53 ++------- contracts/token/ERC721/IERC721.sol | 19 +--- .../ERC721PresetMinterPauserAutoId.sol | 16 +-- contracts/token/ERC721/utils/ERC721Holder.sol | 7 +- contracts/token/ERC777/ERC777.sol | 51 ++------- contracts/token/ERC777/IERC777.sol | 13 +-- contracts/token/common/ERC2981.sol | 6 +- contracts/utils/Address.sol | 6 +- contracts/utils/Checkpoints.sol | 80 +++---------- contracts/utils/Create2.sol | 12 +- contracts/utils/cryptography/ECDSA.sol | 26 +---- contracts/utils/cryptography/MerkleProof.sol | 12 +- .../utils/cryptography/SignatureChecker.sol | 6 +- .../utils/introspection/ERC165Checker.sol | 9 +- .../introspection/ERC1820Implementer.sol | 11 +- .../utils/introspection/IERC1820Registry.sol | 6 +- contracts/utils/math/Math.sol | 41 +++---- contracts/utils/math/SafeMath.sol | 18 +-- contracts/utils/structs/BitMaps.sol | 6 +- contracts/utils/structs/EnumerableMap.sol | 36 +----- contracts/vendor/amb/IAMB.sol | 12 +- contracts/vendor/arbitrum/IArbSys.sol | 9 +- contracts/vendor/arbitrum/IBridge.sol | 9 +- contracts/vendor/arbitrum/IOutbox.sol | 6 +- .../vendor/optimism/ICrossDomainMessenger.sol | 6 +- .../vendor/polygon/IFxMessageProcessor.sol | 6 +- package-lock.json | 107 ++++++++++++++---- package.json | 2 +- test/utils/math/Math.t.sol | 42 +++---- 103 files changed, 419 insertions(+), 1167 deletions(-) diff --git a/.prettierrc b/.prettierrc index f91ad7ee6..923a710a6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -6,8 +6,7 @@ "files": "*.sol", "options": { "singleQuote": false, - "printWidth": 120, - "explicitTypes": "always" + "printWidth": 120 } } ] diff --git a/CHANGELOG.md b/CHANGELOG.md index 369c65db1..d95b79934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased + * Reformatted codebase with latest version of Prettier Solidity. ([#3898](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3898)) * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) diff --git a/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol b/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol index 3918bfe25..fa0994834 100644 --- a/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol +++ b/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol @@ -59,7 +59,7 @@ abstract contract CrossChainEnabledPolygonChild is IFxMessageProcessor, CrossCha * then security could be compromised. */ function processMessageFromRoot( - uint256, /* stateId */ + uint256 /* stateId */, address rootMessageSender, bytes calldata data ) external override nonReentrant { diff --git a/contracts/finance/VestingWallet.sol b/contracts/finance/VestingWallet.sol index 0feac4ac6..fe67eb54f 100644 --- a/contracts/finance/VestingWallet.sol +++ b/contracts/finance/VestingWallet.sol @@ -29,11 +29,7 @@ contract VestingWallet is Context { /** * @dev Set the beneficiary, start timestamp and vesting duration of the vesting wallet. */ - constructor( - address beneficiaryAddress, - uint64 startTimestamp, - uint64 durationSeconds - ) payable { + constructor(address beneficiaryAddress, uint64 startTimestamp, uint64 durationSeconds) payable { require(beneficiaryAddress != address(0), "VestingWallet: beneficiary is zero address"); _beneficiary = beneficiaryAddress; _start = startTimestamp; diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 84b3128ff..8235fb5ec 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -314,7 +314,7 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism */ function _execute( - uint256, /* proposalId */ + uint256 /* proposalId */, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, @@ -331,9 +331,9 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive * @dev Hook before execution is triggered. */ function _beforeExecute( - uint256, /* proposalId */ + uint256 /* proposalId */, address[] memory targets, - uint256[] memory, /* values */ + uint256[] memory /* values */, bytes[] memory calldatas, bytes32 /*descriptionHash*/ ) internal virtual { @@ -350,10 +350,10 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive * @dev Hook after execution is triggered. */ function _afterExecute( - uint256, /* proposalId */ - address[] memory, /* targets */ - uint256[] memory, /* values */ - bytes[] memory, /* calldatas */ + uint256 /* proposalId */, + address[] memory /* targets */, + uint256[] memory /* values */, + bytes[] memory /* calldatas */, bytes32 /*descriptionHash*/ ) internal virtual { if (_executor() != address(this)) { @@ -540,11 +540,7 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. * Note that if the executor is simply the governor itself, use of `relay` is redundant. */ - function relay( - address target, - uint256 value, - bytes calldata data - ) external payable virtual onlyGovernance { + function relay(address target, uint256 value, bytes calldata data) external payable virtual onlyGovernance { (bool success, bytes memory returndata) = target.call{value: value}(data); Address.verifyCallResult(success, returndata, "Governor: relay reverted without message"); } @@ -560,12 +556,7 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive /** * @dev See {IERC721Receiver-onERC721Received}. */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { + function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index ef932792b..da7143499 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -74,12 +74,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver * administration through timelocked proposals. Previous versions of this contract would assign * this admin to the deployer automatically and should be renounced as well. */ - constructor( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) { + constructor(uint256 minDelay, address[] memory proposers, address[] memory executors, address admin) { _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); @@ -342,11 +337,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver /** * @dev Execute an operation's call. */ - function _execute( - address target, - uint256 value, - bytes calldata data - ) internal virtual { + function _execute(address target, uint256 value, bytes calldata data) internal virtual { (bool success, ) = target.call{value: value}(data); require(success, "TimelockController: underlying transaction reverted"); } @@ -386,12 +377,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver /** * @dev See {IERC721Receiver-onERC721Received}. */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { + function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 8d96be7d6..8d74742c5 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -118,11 +118,10 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp /** * @dev Encodes calldatas with optional function signature. */ - function _encodeCalldata(string[] memory signatures, bytes[] memory calldatas) - private - pure - returns (bytes[] memory) - { + function _encodeCalldata( + string[] memory signatures, + bytes[] memory calldatas + ) private pure returns (bytes[] memory) { bytes[] memory fullcalldatas = new bytes[](calldatas.length); for (uint256 i = 0; i < signatures.length; ++i) { @@ -163,7 +162,9 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp /** * @dev See {IGovernorCompatibilityBravo-proposals}. */ - function proposals(uint256 proposalId) + function proposals( + uint256 proposalId + ) public view virtual @@ -200,7 +201,9 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp /** * @dev See {IGovernorCompatibilityBravo-getActions}. */ - function getActions(uint256 proposalId) + function getActions( + uint256 proposalId + ) public view virtual diff --git a/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol b/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol index 83e4e1ae9..d1ec0337d 100644 --- a/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol @@ -50,7 +50,9 @@ abstract contract IGovernorCompatibilityBravo is IGovernor { /** * @dev Part of the Governor Bravo's interface: _"The official record of all proposals ever proposed"_. */ - function proposals(uint256) + function proposals( + uint256 + ) public view virtual @@ -96,7 +98,9 @@ abstract contract IGovernorCompatibilityBravo is IGovernor { /** * @dev Part of the Governor Bravo's interface: _"Gets actions of a proposal"_. */ - function getActions(uint256 proposalId) + function getActions( + uint256 proposalId + ) public view virtual diff --git a/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/governance/extensions/GovernorCountingSimple.sol index 5611fc669..f3eea9d7f 100644 --- a/contracts/governance/extensions/GovernorCountingSimple.sol +++ b/contracts/governance/extensions/GovernorCountingSimple.sol @@ -47,16 +47,9 @@ abstract contract GovernorCountingSimple is Governor { /** * @dev Accessor to the internal vote counts. */ - function proposalVotes(uint256 proposalId) - public - view - virtual - returns ( - uint256 againstVotes, - uint256 forVotes, - uint256 abstainVotes - ) - { + function proposalVotes( + uint256 proposalId + ) public view virtual returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes) { ProposalVote storage proposalVote = _proposalVotes[proposalId]; return (proposalVote.againstVotes, proposalVote.forVotes, proposalVote.abstainVotes); } diff --git a/contracts/governance/extensions/GovernorSettings.sol b/contracts/governance/extensions/GovernorSettings.sol index a3187c6e1..527f41cd8 100644 --- a/contracts/governance/extensions/GovernorSettings.sol +++ b/contracts/governance/extensions/GovernorSettings.sol @@ -22,11 +22,7 @@ abstract contract GovernorSettings is Governor { /** * @dev Initialize the governance parameters. */ - constructor( - uint256 initialVotingDelay, - uint256 initialVotingPeriod, - uint256 initialProposalThreshold - ) { + constructor(uint256 initialVotingDelay, uint256 initialVotingPeriod, uint256 initialProposalThreshold) { _setVotingDelay(initialVotingDelay); _setVotingPeriod(initialVotingPeriod); _setProposalThreshold(initialProposalThreshold); diff --git a/contracts/governance/extensions/GovernorTimelockControl.sol b/contracts/governance/extensions/GovernorTimelockControl.sol index aaeaf9409..6aa2556ab 100644 --- a/contracts/governance/extensions/GovernorTimelockControl.sol +++ b/contracts/governance/extensions/GovernorTimelockControl.sol @@ -110,7 +110,7 @@ abstract contract GovernorTimelockControl is IGovernorTimelock, Governor { * @dev Overridden execute function that run the already queued proposal through the timelock. */ function _execute( - uint256, /* proposalId */ + uint256 /* proposalId */, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, diff --git a/contracts/governance/utils/IVotes.sol b/contracts/governance/utils/IVotes.sol index 6317d7752..0bef3f920 100644 --- a/contracts/governance/utils/IVotes.sol +++ b/contracts/governance/utils/IVotes.sol @@ -50,12 +50,5 @@ interface IVotes { /** * @dev Delegates votes from signer to `delegatee`. */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) external; + function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external; } diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index ba7c2b3fe..2eecf32c6 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -136,11 +136,7 @@ abstract contract Votes is IVotes, Context, EIP712 { * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to` * should be zero. Total supply of voting units will be adjusted with mints and burns. */ - function _transferVotingUnits( - address from, - address to, - uint256 amount - ) internal virtual { + function _transferVotingUnits(address from, address to, uint256 amount) internal virtual { if (from == address(0)) { _totalCheckpoints.push(_add, amount); } @@ -153,11 +149,7 @@ abstract contract Votes is IVotes, Context, EIP712 { /** * @dev Moves delegated votes from one delegate to another. */ - function _moveDelegateVotes( - address from, - address to, - uint256 amount - ) private { + function _moveDelegateVotes(address from, address to, uint256 amount) private { if (from != to && amount > 0) { if (from != address(0)) { (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[from].push(_subtract, amount); diff --git a/contracts/interfaces/IERC1363.sol b/contracts/interfaces/IERC1363.sol index 5fad104c2..1a8dc79f4 100644 --- a/contracts/interfaces/IERC1363.sol +++ b/contracts/interfaces/IERC1363.sol @@ -38,11 +38,7 @@ interface IERC1363 is IERC165, IERC20 { * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ - function transferAndCall( - address to, - uint256 value, - bytes memory data - ) external returns (bool); + function transferAndCall(address to, uint256 value, bytes memory data) external returns (bool); /** * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver @@ -51,11 +47,7 @@ interface IERC1363 is IERC165, IERC20 { * @param value uint256 The amount of tokens to be transferred * @return true unless throwing */ - function transferFromAndCall( - address from, - address to, - uint256 value - ) external returns (bool); + function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver @@ -65,12 +57,7 @@ interface IERC1363 is IERC165, IERC20 { * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ - function transferFromAndCall( - address from, - address to, - uint256 value, - bytes memory data - ) external returns (bool); + function transferFromAndCall(address from, address to, uint256 value, bytes memory data) external returns (bool); /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender @@ -87,9 +74,5 @@ interface IERC1363 is IERC165, IERC20 { * @param value uint256 The amount of tokens to be spent * @param data bytes Additional data with no specified format, sent in call to `spender` */ - function approveAndCall( - address spender, - uint256 value, - bytes memory data - ) external returns (bool); + function approveAndCall(address spender, uint256 value, bytes memory data) external returns (bool); } diff --git a/contracts/interfaces/IERC1363Spender.sol b/contracts/interfaces/IERC1363Spender.sol index 48f6fd56d..28775e140 100644 --- a/contracts/interfaces/IERC1363Spender.sol +++ b/contracts/interfaces/IERC1363Spender.sol @@ -22,9 +22,5 @@ interface IERC1363Spender { * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` * unless throwing */ - function onApprovalReceived( - address owner, - uint256 value, - bytes memory data - ) external returns (bytes4); + function onApprovalReceived(address owner, uint256 value, bytes memory data) external returns (bytes4); } diff --git a/contracts/interfaces/IERC2981.sol b/contracts/interfaces/IERC2981.sol index 6b0558169..1c9448a91 100644 --- a/contracts/interfaces/IERC2981.sol +++ b/contracts/interfaces/IERC2981.sol @@ -18,8 +18,8 @@ interface IERC2981 is IERC165 { * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ - function royaltyInfo(uint256 tokenId, uint256 salePrice) - external - view - returns (address receiver, uint256 royaltyAmount); + function royaltyInfo( + uint256 tokenId, + uint256 salePrice + ) external view returns (address receiver, uint256 royaltyAmount); } diff --git a/contracts/interfaces/IERC4626.sol b/contracts/interfaces/IERC4626.sol index f7c5397a0..08e5de717 100644 --- a/contracts/interfaces/IERC4626.sol +++ b/contracts/interfaces/IERC4626.sol @@ -187,11 +187,7 @@ interface IERC4626 is IERC20, IERC20Metadata { * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ - function withdraw( - uint256 assets, - address receiver, - address owner - ) external returns (uint256 shares); + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); /** * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, @@ -232,9 +228,5 @@ interface IERC4626 is IERC20, IERC20Metadata { * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ - function redeem( - uint256 shares, - address receiver, - address owner - ) external returns (uint256 assets); + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); } diff --git a/contracts/metatx/MinimalForwarder.sol b/contracts/metatx/MinimalForwarder.sol index bb49c794d..9298ae675 100644 --- a/contracts/metatx/MinimalForwarder.sol +++ b/contracts/metatx/MinimalForwarder.sol @@ -44,11 +44,10 @@ contract MinimalForwarder is EIP712 { return _nonces[req.from] == req.nonce && signer == req.from; } - function execute(ForwardRequest calldata req, bytes calldata signature) - public - payable - returns (bool, bytes memory) - { + function execute( + ForwardRequest calldata req, + bytes calldata signature + ) public payable returns (bool, bytes memory) { require(verify(req, signature), "MinimalForwarder: signature does not match request"); _nonces[req.from] = req.nonce + 1; diff --git a/contracts/mocks/AddressImpl.sol b/contracts/mocks/AddressImpl.sol index 702093c73..b06bec372 100644 --- a/contracts/mocks/AddressImpl.sol +++ b/contracts/mocks/AddressImpl.sol @@ -22,11 +22,7 @@ contract AddressImpl { emit CallReturnValue(abi.decode(returnData, (string))); } - function functionCallWithValue( - address target, - bytes calldata data, - uint256 value - ) external payable { + function functionCallWithValue(address target, bytes calldata data, uint256 value) external payable { bytes memory returnData = Address.functionCallWithValue(target, data, value); emit CallReturnValue(abi.decode(returnData, (string))); } diff --git a/contracts/mocks/CheckpointsMock.sol b/contracts/mocks/CheckpointsMock.sol index f1dadabaf..874a1d1f2 100644 --- a/contracts/mocks/CheckpointsMock.sol +++ b/contracts/mocks/CheckpointsMock.sol @@ -14,15 +14,7 @@ contract CheckpointsMock { return _totalCheckpoints.latest(); } - function latestCheckpoint() - public - view - returns ( - bool, - uint256, - uint256 - ) - { + function latestCheckpoint() public view returns (bool, uint256, uint256) { return _totalCheckpoints.latestCheckpoint(); } @@ -52,15 +44,7 @@ contract Checkpoints224Mock { return _totalCheckpoints.latest(); } - function latestCheckpoint() - public - view - returns ( - bool, - uint32, - uint224 - ) - { + function latestCheckpoint() public view returns (bool, uint32, uint224) { return _totalCheckpoints.latestCheckpoint(); } @@ -90,15 +74,7 @@ contract Checkpoints160Mock { return _totalCheckpoints.latest(); } - function latestCheckpoint() - public - view - returns ( - bool, - uint96, - uint160 - ) - { + function latestCheckpoint() public view returns (bool, uint96, uint160) { return _totalCheckpoints.latestCheckpoint(); } diff --git a/contracts/mocks/ClonesMock.sol b/contracts/mocks/ClonesMock.sol index 3719b0a78..c65d30cc3 100644 --- a/contracts/mocks/ClonesMock.sol +++ b/contracts/mocks/ClonesMock.sol @@ -15,11 +15,7 @@ contract ClonesMock { _initAndEmit(implementation.clone(), initdata); } - function cloneDeterministic( - address implementation, - bytes32 salt, - bytes calldata initdata - ) public payable { + function cloneDeterministic(address implementation, bytes32 salt, bytes calldata initdata) public payable { _initAndEmit(implementation.cloneDeterministic(salt), initdata); } diff --git a/contracts/mocks/ContextMock.sol b/contracts/mocks/ContextMock.sol index f17af38a4..7759f3506 100644 --- a/contracts/mocks/ContextMock.sol +++ b/contracts/mocks/ContextMock.sol @@ -23,11 +23,7 @@ contract ContextMockCaller { context.msgSender(); } - function callData( - ContextMock context, - uint256 integerValue, - string memory stringValue - ) public { + function callData(ContextMock context, uint256 integerValue, string memory stringValue) public { context.msgData(integerValue, stringValue); } } diff --git a/contracts/mocks/Create2Impl.sol b/contracts/mocks/Create2Impl.sol index 070ad3671..6b2f4b712 100644 --- a/contracts/mocks/Create2Impl.sol +++ b/contracts/mocks/Create2Impl.sol @@ -6,11 +6,7 @@ import "../utils/Create2.sol"; import "../utils/introspection/ERC1820Implementer.sol"; contract Create2Impl { - function deploy( - uint256 value, - bytes32 salt, - bytes memory code - ) public { + function deploy(uint256 value, bytes32 salt, bytes memory code) public { Create2.deploy(value, salt, code); } diff --git a/contracts/mocks/DummyImplementation.sol b/contracts/mocks/DummyImplementation.sol index d8651340d..ddcca6604 100644 --- a/contracts/mocks/DummyImplementation.sol +++ b/contracts/mocks/DummyImplementation.sol @@ -27,11 +27,7 @@ contract DummyImplementation { value = _value; } - function initialize( - uint256 _value, - string memory _text, - uint256[] memory _values - ) public { + function initialize(uint256 _value, string memory _text, uint256[] memory _values) public { value = _value; text = _text; values = _values; diff --git a/contracts/mocks/ECDSAMock.sol b/contracts/mocks/ECDSAMock.sol index 97bd46669..cfc37d26e 100644 --- a/contracts/mocks/ECDSAMock.sol +++ b/contracts/mocks/ECDSAMock.sol @@ -13,21 +13,12 @@ contract ECDSAMock { } // solhint-disable-next-line func-name-mixedcase - function recover_v_r_s( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) public pure returns (address) { + function recover_v_r_s(bytes32 hash, uint8 v, bytes32 r, bytes32 s) public pure returns (address) { return hash.recover(v, r, s); } // solhint-disable-next-line func-name-mixedcase - function recover_r_vs( - bytes32 hash, - bytes32 r, - bytes32 vs - ) public pure returns (address) { + function recover_r_vs(bytes32 hash, bytes32 r, bytes32 vs) public pure returns (address) { return hash.recover(r, vs); } diff --git a/contracts/mocks/EIP712External.sol b/contracts/mocks/EIP712External.sol index 93f77d549..bc5b1269f 100644 --- a/contracts/mocks/EIP712External.sol +++ b/contracts/mocks/EIP712External.sol @@ -12,12 +12,7 @@ contract EIP712External is EIP712 { return _domainSeparatorV4(); } - function verify( - bytes memory signature, - address signer, - address mailTo, - string memory mailContents - ) external view { + function verify(bytes memory signature, address signer, address mailTo, string memory mailContents) external view { bytes32 digest = _hashTypedDataV4( keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents)))) ); diff --git a/contracts/mocks/ERC1155BurnableMock.sol b/contracts/mocks/ERC1155BurnableMock.sol index 62138f28d..3334523cf 100644 --- a/contracts/mocks/ERC1155BurnableMock.sol +++ b/contracts/mocks/ERC1155BurnableMock.sol @@ -7,12 +7,7 @@ import "../token/ERC1155/extensions/ERC1155Burnable.sol"; contract ERC1155BurnableMock is ERC1155Burnable { constructor(string memory uri) ERC1155(uri) {} - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { + function mint(address to, uint256 id, uint256 value, bytes memory data) public { _mint(to, id, value, data); } } diff --git a/contracts/mocks/ERC1155Mock.sol b/contracts/mocks/ERC1155Mock.sol index 0518ac26c..6bfc86cea 100644 --- a/contracts/mocks/ERC1155Mock.sol +++ b/contracts/mocks/ERC1155Mock.sol @@ -15,37 +15,19 @@ contract ERC1155Mock is ERC1155 { _setURI(newuri); } - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { + function mint(address to, uint256 id, uint256 value, bytes memory data) public { _mint(to, id, value, data); } - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory values, - bytes memory data - ) public { + function mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) public { _mintBatch(to, ids, values, data); } - function burn( - address owner, - uint256 id, - uint256 value - ) public { + function burn(address owner, uint256 id, uint256 value) public { _burn(owner, id, value); } - function burnBatch( - address owner, - uint256[] memory ids, - uint256[] memory values - ) public { + function burnBatch(address owner, uint256[] memory ids, uint256[] memory values) public { _burnBatch(owner, ids, values); } } diff --git a/contracts/mocks/ERC1155ReceiverMock.sol b/contracts/mocks/ERC1155ReceiverMock.sol index 6443a56c7..b2d505c0a 100644 --- a/contracts/mocks/ERC1155ReceiverMock.sol +++ b/contracts/mocks/ERC1155ReceiverMock.sol @@ -14,12 +14,7 @@ contract ERC1155ReceiverMock is ERC165, IERC1155Receiver { event Received(address operator, address from, uint256 id, uint256 value, bytes data, uint256 gas); event BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data, uint256 gas); - constructor( - bytes4 recRetval, - bool recReverts, - bytes4 batRetval, - bool batReverts - ) { + constructor(bytes4 recRetval, bool recReverts, bytes4 batRetval, bool batReverts) { _recRetval = recRetval; _recReverts = recReverts; _batRetval = batRetval; diff --git a/contracts/mocks/ERC20CappedMock.sol b/contracts/mocks/ERC20CappedMock.sol index edb36f205..e69aadfdf 100644 --- a/contracts/mocks/ERC20CappedMock.sol +++ b/contracts/mocks/ERC20CappedMock.sol @@ -5,11 +5,7 @@ pragma solidity ^0.8.0; import "../token/ERC20/extensions/ERC20Capped.sol"; contract ERC20CappedMock is ERC20Capped { - constructor( - string memory name, - string memory symbol, - uint256 cap - ) ERC20(name, symbol) ERC20Capped(cap) {} + constructor(string memory name, string memory symbol, uint256 cap) ERC20(name, symbol) ERC20Capped(cap) {} function mint(address to, uint256 tokenId) public { _mint(to, tokenId); diff --git a/contracts/mocks/ERC20DecimalsMock.sol b/contracts/mocks/ERC20DecimalsMock.sol index 3721f6c39..7677e9dd1 100644 --- a/contracts/mocks/ERC20DecimalsMock.sol +++ b/contracts/mocks/ERC20DecimalsMock.sol @@ -7,11 +7,7 @@ import "../token/ERC20/ERC20.sol"; contract ERC20DecimalsMock is ERC20 { uint8 private immutable _decimals; - constructor( - string memory name_, - string memory symbol_, - uint8 decimals_ - ) ERC20(name_, symbol_) { + constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) { _decimals = decimals_; } diff --git a/contracts/mocks/ERC20Mock.sol b/contracts/mocks/ERC20Mock.sol index fd7f991ba..16ffad19f 100644 --- a/contracts/mocks/ERC20Mock.sol +++ b/contracts/mocks/ERC20Mock.sol @@ -23,19 +23,11 @@ contract ERC20Mock is ERC20 { _burn(account, amount); } - function transferInternal( - address from, - address to, - uint256 value - ) public { + function transferInternal(address from, address to, uint256 value) public { _transfer(from, to, value); } - function approveInternal( - address owner, - address spender, - uint256 value - ) public { + function approveInternal(address owner, address spender, uint256 value) public { _approve(owner, spender, value); } } diff --git a/contracts/mocks/ERC3156FlashBorrowerMock.sol b/contracts/mocks/ERC3156FlashBorrowerMock.sol index 288a278fb..6a4410fcb 100644 --- a/contracts/mocks/ERC3156FlashBorrowerMock.sol +++ b/contracts/mocks/ERC3156FlashBorrowerMock.sol @@ -28,7 +28,7 @@ contract ERC3156FlashBorrowerMock is IERC3156FlashBorrower { } function onFlashLoan( - address, /*initiator*/ + address /*initiator*/, address token, uint256 amount, uint256 fee, diff --git a/contracts/mocks/ERC4626Mock.sol b/contracts/mocks/ERC4626Mock.sol index 4f80b4bd7..9c13346f0 100644 --- a/contracts/mocks/ERC4626Mock.sol +++ b/contracts/mocks/ERC4626Mock.sol @@ -5,11 +5,7 @@ pragma solidity ^0.8.0; import "../token/ERC20/extensions/ERC4626.sol"; contract ERC4626Mock is ERC4626 { - constructor( - IERC20Metadata asset, - string memory name, - string memory symbol - ) ERC20(name, symbol) ERC4626(asset) {} + constructor(IERC20Metadata asset, string memory name, string memory symbol) ERC20(name, symbol) ERC4626(asset) {} function mockMint(address account, uint256 amount) public { _mint(account, amount); @@ -38,23 +34,17 @@ contract ERC4626DecimalMock is ERC4626Mock { return _decimals; } - function _initialConvertToShares(uint256 assets, Math.Rounding rounding) - internal - view - virtual - override - returns (uint256 shares) - { - return assets.mulDiv(10**decimals(), 10**super.decimals(), rounding); + function _initialConvertToShares( + uint256 assets, + Math.Rounding rounding + ) internal view virtual override returns (uint256 shares) { + return assets.mulDiv(10 ** decimals(), 10 ** super.decimals(), rounding); } - function _initialConvertToAssets(uint256 shares, Math.Rounding rounding) - internal - view - virtual - override - returns (uint256 assets) - { - return shares.mulDiv(10**super.decimals(), 10**decimals(), rounding); + function _initialConvertToAssets( + uint256 shares, + Math.Rounding rounding + ) internal view virtual override returns (uint256 assets) { + return shares.mulDiv(10 ** super.decimals(), 10 ** decimals(), rounding); } } diff --git a/contracts/mocks/ERC721BurnableMock.sol b/contracts/mocks/ERC721BurnableMock.sol index b30dbf53d..ecf427681 100644 --- a/contracts/mocks/ERC721BurnableMock.sol +++ b/contracts/mocks/ERC721BurnableMock.sol @@ -19,11 +19,7 @@ contract ERC721BurnableMock is ERC721Burnable { _safeMint(to, tokenId); } - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { + function safeMint(address to, uint256 tokenId, bytes memory _data) public { _safeMint(to, tokenId, _data); } } diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol b/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol index cde3bd86c..f4f5c5832 100644 --- a/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol +++ b/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol @@ -17,13 +17,9 @@ contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable } } - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(ERC721, ERC721Enumerable) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } diff --git a/contracts/mocks/ERC721EnumerableMock.sol b/contracts/mocks/ERC721EnumerableMock.sol index a747925e6..b7ea94ee3 100644 --- a/contracts/mocks/ERC721EnumerableMock.sol +++ b/contracts/mocks/ERC721EnumerableMock.sol @@ -37,11 +37,7 @@ contract ERC721EnumerableMock is ERC721Enumerable { _safeMint(to, tokenId); } - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { + function safeMint(address to, uint256 tokenId, bytes memory _data) public { _safeMint(to, tokenId, _data); } diff --git a/contracts/mocks/ERC721Mock.sol b/contracts/mocks/ERC721Mock.sol index 74a092334..a3bc839ae 100644 --- a/contracts/mocks/ERC721Mock.sol +++ b/contracts/mocks/ERC721Mock.sol @@ -27,11 +27,7 @@ contract ERC721Mock is ERC721 { _safeMint(to, tokenId); } - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { + function safeMint(address to, uint256 tokenId, bytes memory _data) public { _safeMint(to, tokenId, _data); } diff --git a/contracts/mocks/ERC721PausableMock.sol b/contracts/mocks/ERC721PausableMock.sol index 8d8e818fb..753842e90 100644 --- a/contracts/mocks/ERC721PausableMock.sol +++ b/contracts/mocks/ERC721PausableMock.sol @@ -31,11 +31,7 @@ contract ERC721PausableMock is ERC721Pausable { _safeMint(to, tokenId); } - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { + function safeMint(address to, uint256 tokenId, bytes memory _data) public { _safeMint(to, tokenId, _data); } diff --git a/contracts/mocks/ERC721RoyaltyMock.sol b/contracts/mocks/ERC721RoyaltyMock.sol index 83a9074e2..6f19d5248 100644 --- a/contracts/mocks/ERC721RoyaltyMock.sol +++ b/contracts/mocks/ERC721RoyaltyMock.sol @@ -7,11 +7,7 @@ import "../token/ERC721/extensions/ERC721Royalty.sol"; contract ERC721RoyaltyMock is ERC721Royalty { constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - function setTokenRoyalty( - uint256 tokenId, - address recipient, - uint96 fraction - ) public { + function setTokenRoyalty(uint256 tokenId, address recipient, uint96 fraction) public { _setTokenRoyalty(tokenId, recipient, fraction); } diff --git a/contracts/mocks/ERC721URIStorageMock.sol b/contracts/mocks/ERC721URIStorageMock.sol index 60f9f7b7c..4bb26b1ad 100644 --- a/contracts/mocks/ERC721URIStorageMock.sol +++ b/contracts/mocks/ERC721URIStorageMock.sol @@ -41,11 +41,7 @@ contract ERC721URIStorageMock is ERC721URIStorage { _safeMint(to, tokenId); } - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { + function safeMint(address to, uint256 tokenId, bytes memory _data) public { _safeMint(to, tokenId, _data); } diff --git a/contracts/mocks/ERC777Mock.sol b/contracts/mocks/ERC777Mock.sol index f8a3b6784..59c00b307 100644 --- a/contracts/mocks/ERC777Mock.sol +++ b/contracts/mocks/ERC777Mock.sol @@ -18,12 +18,7 @@ contract ERC777Mock is Context, ERC777 { _mint(initialHolder, initialBalance, "", ""); } - function mintInternal( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) public { + function mintInternal(address to, uint256 amount, bytes memory userData, bytes memory operatorData) public { _mint(to, amount, userData, operatorData); } @@ -37,20 +32,11 @@ contract ERC777Mock is Context, ERC777 { _mint(to, amount, userData, operatorData, requireReceptionAck); } - function approveInternal( - address holder, - address spender, - uint256 value - ) public { + function approveInternal(address holder, address spender, uint256 value) public { _approve(holder, spender, value); } - function _beforeTokenTransfer( - address, - address, - address, - uint256 - ) internal override { + function _beforeTokenTransfer(address, address, address, uint256) internal override { emit BeforeTokenTransfer(); } } diff --git a/contracts/mocks/ERC777SenderRecipientMock.sol b/contracts/mocks/ERC777SenderRecipientMock.sol index 169912f69..8e8c749ce 100644 --- a/contracts/mocks/ERC777SenderRecipientMock.sol +++ b/contracts/mocks/ERC777SenderRecipientMock.sol @@ -141,21 +141,12 @@ contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient, _shouldRevertReceive = shouldRevert; } - function send( - IERC777 token, - address to, - uint256 amount, - bytes memory data - ) public { + function send(IERC777 token, address to, uint256 amount, bytes memory data) public { // This is 777's send function, not the Solidity send function token.send(to, amount, data); // solhint-disable-line check-send-result } - function burn( - IERC777 token, - uint256 amount, - bytes memory data - ) public { + function burn(IERC777 token, uint256 amount, bytes memory data) public { token.burn(amount, data); } } diff --git a/contracts/mocks/GovernorCompatibilityBravoMock.sol b/contracts/mocks/GovernorCompatibilityBravoMock.sol index 1ef0f94b9..d3b4f707d 100644 --- a/contracts/mocks/GovernorCompatibilityBravoMock.sol +++ b/contracts/mocks/GovernorCompatibilityBravoMock.sol @@ -27,12 +27,9 @@ contract GovernorCompatibilityBravoMock is GovernorVotesComp(token_) {} - function supportsInterface(bytes4 interfaceId) - public - view - override(IERC165, Governor, GovernorTimelockCompound) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(IERC165, Governor, GovernorTimelockCompound) returns (bool) { return super.supportsInterface(interfaceId); } @@ -40,21 +37,15 @@ contract GovernorCompatibilityBravoMock is return 0; } - function state(uint256 proposalId) - public - view - override(IGovernor, Governor, GovernorTimelockCompound) - returns (ProposalState) - { + function state( + uint256 proposalId + ) public view override(IGovernor, Governor, GovernorTimelockCompound) returns (ProposalState) { return super.state(proposalId); } - function proposalEta(uint256 proposalId) - public - view - override(IGovernorTimelock, GovernorTimelockCompound) - returns (uint256) - { + function proposalEta( + uint256 proposalId + ) public view override(IGovernorTimelock, GovernorTimelockCompound) returns (uint256) { return super.proposalEta(proposalId); } diff --git a/contracts/mocks/GovernorPreventLateQuorumMock.sol b/contracts/mocks/GovernorPreventLateQuorumMock.sol index d868ab22b..b6b5e7619 100644 --- a/contracts/mocks/GovernorPreventLateQuorumMock.sol +++ b/contracts/mocks/GovernorPreventLateQuorumMock.sol @@ -35,12 +35,9 @@ contract GovernorPreventLateQuorumMock is return _quorum; } - function proposalDeadline(uint256 proposalId) - public - view - override(Governor, GovernorPreventLateQuorum) - returns (uint256) - { + function proposalDeadline( + uint256 proposalId + ) public view override(Governor, GovernorPreventLateQuorum) returns (uint256) { return super.proposalDeadline(proposalId); } diff --git a/contracts/mocks/GovernorTimelockCompoundMock.sol b/contracts/mocks/GovernorTimelockCompoundMock.sol index becc72a06..75a2f3c14 100644 --- a/contracts/mocks/GovernorTimelockCompoundMock.sol +++ b/contracts/mocks/GovernorTimelockCompoundMock.sol @@ -28,21 +28,15 @@ contract GovernorTimelockCompoundMock is GovernorVotesQuorumFraction(quorumNumerator_) {} - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockCompound) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(Governor, GovernorTimelockCompound) returns (bool) { return super.supportsInterface(interfaceId); } - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { + function quorum( + uint256 blockNumber + ) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } @@ -58,12 +52,9 @@ contract GovernorTimelockCompoundMock is /** * Overriding nightmare */ - function state(uint256 proposalId) - public - view - override(Governor, GovernorTimelockCompound) - returns (ProposalState) - { + function state( + uint256 proposalId + ) public view override(Governor, GovernorTimelockCompound) returns (ProposalState) { return super.state(proposalId); } diff --git a/contracts/mocks/GovernorTimelockControlMock.sol b/contracts/mocks/GovernorTimelockControlMock.sol index ca412d1ca..671a1e0ea 100644 --- a/contracts/mocks/GovernorTimelockControlMock.sol +++ b/contracts/mocks/GovernorTimelockControlMock.sol @@ -28,21 +28,15 @@ contract GovernorTimelockControlMock is GovernorVotesQuorumFraction(quorumNumerator_) {} - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockControl) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(Governor, GovernorTimelockControl) returns (bool) { return super.supportsInterface(interfaceId); } - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { + function quorum( + uint256 blockNumber + ) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } diff --git a/contracts/mocks/MathMock.sol b/contracts/mocks/MathMock.sol index c6b1e8723..be935f91d 100644 --- a/contracts/mocks/MathMock.sol +++ b/contracts/mocks/MathMock.sol @@ -21,12 +21,7 @@ contract MathMock { return Math.ceilDiv(a, b); } - function mulDiv( - uint256 a, - uint256 b, - uint256 denominator, - Math.Rounding direction - ) public pure returns (uint256) { + function mulDiv(uint256 a, uint256 b, uint256 denominator, Math.Rounding direction) public pure returns (uint256) { return Math.mulDiv(a, b, denominator, direction); } diff --git a/contracts/mocks/MerkleProofWrapper.sol b/contracts/mocks/MerkleProofWrapper.sol index b74459dc8..60741e41c 100644 --- a/contracts/mocks/MerkleProofWrapper.sol +++ b/contracts/mocks/MerkleProofWrapper.sol @@ -5,19 +5,11 @@ pragma solidity ^0.8.0; import "../utils/cryptography/MerkleProof.sol"; contract MerkleProofWrapper { - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) public pure returns (bool) { + function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) public pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } - function verifyCalldata( - bytes32[] calldata proof, - bytes32 root, - bytes32 leaf - ) public pure returns (bool) { + function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) public pure returns (bool) { return MerkleProof.verifyCalldata(proof, root, leaf); } diff --git a/contracts/mocks/MultipleInheritanceInitializableMocks.sol b/contracts/mocks/MultipleInheritanceInitializableMocks.sol index f6d644065..b8cf9d9d5 100644 --- a/contracts/mocks/MultipleInheritanceInitializableMocks.sol +++ b/contracts/mocks/MultipleInheritanceInitializableMocks.sol @@ -108,12 +108,7 @@ contract SampleFather is Initializable, SampleGramps { contract SampleChild is Initializable, SampleMother, SampleFather { uint256 public child; - function initialize( - uint256 _mother, - string memory _gramps, - uint256 _father, - uint256 _child - ) public initializer { + function initialize(uint256 _mother, string memory _gramps, uint256 _father, uint256 _child) public initializer { __SampleChild_init(_mother, _gramps, _father, _child); } diff --git a/contracts/mocks/SafeERC20Helper.sol b/contracts/mocks/SafeERC20Helper.sol index 98fdc6444..237e32041 100644 --- a/contracts/mocks/SafeERC20Helper.sol +++ b/contracts/mocks/SafeERC20Helper.sol @@ -19,11 +19,7 @@ contract ERC20ReturnFalseMock is Context { return false; } - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { + function transferFrom(address, address, uint256) public returns (bool) { _dummy = 0; return false; } @@ -51,11 +47,7 @@ contract ERC20ReturnTrueMock is Context { return true; } - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { + function transferFrom(address, address, uint256) public returns (bool) { _dummy = 0; return true; } @@ -85,11 +77,7 @@ contract ERC20NoReturnMock is Context { _dummy = 0; } - function transferFrom( - address, - address, - uint256 - ) public { + function transferFrom(address, address, uint256) public { _dummy = 0; } diff --git a/contracts/mocks/SafeMathMock.sol b/contracts/mocks/SafeMathMock.sol index 3d1f4727e..ef504e3ab 100644 --- a/contracts/mocks/SafeMathMock.sol +++ b/contracts/mocks/SafeMathMock.sol @@ -47,27 +47,15 @@ contract SafeMathMock { return SafeMath.mod(a, b); } - function subWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { + function subWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { return SafeMath.sub(a, b, errorMessage); } - function divWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { + function divWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { return SafeMath.div(a, b, errorMessage); } - function modWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { + function modWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { return SafeMath.mod(a, b, errorMessage); } diff --git a/contracts/mocks/SignatureCheckerMock.sol b/contracts/mocks/SignatureCheckerMock.sol index 3b399c1ae..5671540ec 100644 --- a/contracts/mocks/SignatureCheckerMock.sol +++ b/contracts/mocks/SignatureCheckerMock.sol @@ -7,11 +7,7 @@ import "../utils/cryptography/SignatureChecker.sol"; contract SignatureCheckerMock { using SignatureChecker for address; - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) public view returns (bool) { + function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) public view returns (bool) { return signer.isValidSignatureNow(hash, signature); } } diff --git a/contracts/mocks/UUPS/UUPSLegacy.sol b/contracts/mocks/UUPS/UUPSLegacy.sol index e03fa862d..7a3002889 100644 --- a/contracts/mocks/UUPS/UUPSLegacy.sol +++ b/contracts/mocks/UUPS/UUPSLegacy.sol @@ -17,11 +17,7 @@ contract UUPSUpgradeableLegacyMock is UUPSUpgradeableMock { StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } - function _upgradeToAndCallSecureLegacyV1( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { + function _upgradeToAndCallSecureLegacyV1(address newImplementation, bytes memory data, bool forceCall) internal { address oldImplementation = _getImplementation(); // Initial upgrade and setup call diff --git a/contracts/mocks/crosschain/bridges.sol b/contracts/mocks/crosschain/bridges.sol index 35c7f4c06..41baffed8 100644 --- a/contracts/mocks/crosschain/bridges.sol +++ b/contracts/mocks/crosschain/bridges.sol @@ -12,11 +12,7 @@ abstract contract BaseRelayMock { address internal _currentSender; - function relayAs( - address target, - bytes calldata data, - address sender - ) external virtual { + function relayAs(address target, bytes calldata data, address sender) external virtual { address previousSender = _currentSender; _currentSender = sender; @@ -92,11 +88,7 @@ contract BridgeOptimismMock is BaseRelayMock { * Polygon */ contract BridgePolygonChildMock is BaseRelayMock { - function relayAs( - address target, - bytes calldata data, - address sender - ) external override { + function relayAs(address target, bytes calldata data, address sender) external override { IFxMessageProcessor(target).processMessageFromRoot(0, sender, data); } } diff --git a/contracts/mocks/wizard/MyGovernor1.sol b/contracts/mocks/wizard/MyGovernor1.sol index a80d8400c..37ecfd57d 100644 --- a/contracts/mocks/wizard/MyGovernor1.sol +++ b/contracts/mocks/wizard/MyGovernor1.sol @@ -14,12 +14,10 @@ contract MyGovernor1 is GovernorVotesQuorumFraction, GovernorCountingSimple { - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} + constructor( + IVotes _token, + TimelockController _timelock + ) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {} function votingDelay() public pure override returns (uint256) { return 1; // 1 block @@ -31,12 +29,9 @@ contract MyGovernor1 is // The following functions are overrides required by Solidity. - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { + function quorum( + uint256 blockNumber + ) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } @@ -76,12 +71,9 @@ contract MyGovernor1 is return super._executor(); } - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockControl) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(Governor, GovernorTimelockControl) returns (bool) { return super.supportsInterface(interfaceId); } } diff --git a/contracts/mocks/wizard/MyGovernor2.sol b/contracts/mocks/wizard/MyGovernor2.sol index 34c608c5c..1472b67d5 100644 --- a/contracts/mocks/wizard/MyGovernor2.sol +++ b/contracts/mocks/wizard/MyGovernor2.sol @@ -16,12 +16,10 @@ contract MyGovernor2 is GovernorVotesQuorumFraction, GovernorCountingSimple { - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} + constructor( + IVotes _token, + TimelockController _timelock + ) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {} function votingDelay() public pure override returns (uint256) { return 1; // 1 block @@ -37,12 +35,9 @@ contract MyGovernor2 is // The following functions are overrides required by Solidity. - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { + function quorum( + uint256 blockNumber + ) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } @@ -82,12 +77,9 @@ contract MyGovernor2 is return super._executor(); } - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockControl) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(Governor, GovernorTimelockControl) returns (bool) { return super.supportsInterface(interfaceId); } } diff --git a/contracts/mocks/wizard/MyGovernor3.sol b/contracts/mocks/wizard/MyGovernor3.sol index 70e4e87f0..320342290 100644 --- a/contracts/mocks/wizard/MyGovernor3.sol +++ b/contracts/mocks/wizard/MyGovernor3.sol @@ -14,12 +14,10 @@ contract MyGovernor is GovernorVotes, GovernorVotesQuorumFraction { - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} + constructor( + IVotes _token, + TimelockController _timelock + ) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {} function votingDelay() public pure override returns (uint256) { return 1; // 1 block @@ -35,21 +33,15 @@ contract MyGovernor is // The following functions are overrides required by Solidity. - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { + function quorum( + uint256 blockNumber + ) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) { return super.quorum(blockNumber); } - function state(uint256 proposalId) - public - view - override(Governor, IGovernor, GovernorTimelockControl) - returns (ProposalState) - { + function state( + uint256 proposalId + ) public view override(Governor, IGovernor, GovernorTimelockControl) returns (ProposalState) { return super.state(proposalId); } @@ -85,12 +77,9 @@ contract MyGovernor is return super._executor(); } - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, IERC165, GovernorTimelockControl) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view override(Governor, IERC165, GovernorTimelockControl) returns (bool) { return super.supportsInterface(interfaceId); } } diff --git a/contracts/proxy/Clones.sol b/contracts/proxy/Clones.sol index 93ea0cec7..712519892 100644 --- a/contracts/proxy/Clones.sol +++ b/contracts/proxy/Clones.sol @@ -79,11 +79,10 @@ library Clones { /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ - function predictDeterministicAddress(address implementation, bytes32 salt) - internal - view - returns (address predicted) - { + function predictDeterministicAddress( + address implementation, + bytes32 salt + ) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } diff --git a/contracts/proxy/ERC1967/ERC1967Upgrade.sol b/contracts/proxy/ERC1967/ERC1967Upgrade.sol index 77fbdd165..0f32d4d23 100644 --- a/contracts/proxy/ERC1967/ERC1967Upgrade.sol +++ b/contracts/proxy/ERC1967/ERC1967Upgrade.sol @@ -62,11 +62,7 @@ abstract contract ERC1967Upgrade { * * Emits an {Upgraded} event. */ - function _upgradeToAndCall( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { + function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); @@ -78,11 +74,7 @@ abstract contract ERC1967Upgrade { * * Emits an {Upgraded} event. */ - function _upgradeToAndCallUUPS( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { + function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. @@ -171,11 +163,7 @@ abstract contract ERC1967Upgrade { * * Emits a {BeaconUpgraded} event. */ - function _upgradeBeaconToAndCall( - address newBeacon, - bytes memory data, - bool forceCall - ) internal { + function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { diff --git a/contracts/proxy/transparent/TransparentUpgradeableProxy.sol b/contracts/proxy/transparent/TransparentUpgradeableProxy.sol index 4de85075a..3685360e7 100644 --- a/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +++ b/contracts/proxy/transparent/TransparentUpgradeableProxy.sol @@ -31,11 +31,7 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. */ - constructor( - address _logic, - address admin_, - bytes memory _data - ) payable ERC1967Proxy(_logic, _data) { + constructor(address _logic, address admin_, bytes memory _data) payable ERC1967Proxy(_logic, _data) { _changeAdmin(admin_); } diff --git a/contracts/token/ERC1155/ERC1155.sol b/contracts/token/ERC1155/ERC1155.sol index e33faf80c..b20b711d5 100644 --- a/contracts/token/ERC1155/ERC1155.sol +++ b/contracts/token/ERC1155/ERC1155.sol @@ -79,13 +79,10 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { * * - `accounts` and `ids` must have the same length. */ - function balanceOfBatch(address[] memory accounts, uint256[] memory ids) - public - view - virtual - override - returns (uint256[] memory) - { + function balanceOfBatch( + address[] memory accounts, + uint256[] memory ids + ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); @@ -263,12 +260,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ - function _mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { + function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); @@ -330,11 +322,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ - function _burn( - address from, - uint256 id, - uint256 amount - ) internal virtual { + function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); @@ -363,11 +351,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { * * - `ids` and `amounts` must have the same length. */ - function _burnBatch( - address from, - uint256[] memory ids, - uint256[] memory amounts - ) internal virtual { + function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); @@ -396,11 +380,7 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { * * Emits an {ApprovalForAll} event. */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); diff --git a/contracts/token/ERC1155/IERC1155.sol b/contracts/token/ERC1155/IERC1155.sol index 05f74dc4f..eae0b7029 100644 --- a/contracts/token/ERC1155/IERC1155.sol +++ b/contracts/token/ERC1155/IERC1155.sol @@ -60,10 +60,10 @@ interface IERC1155 is IERC165 { * * - `accounts` and `ids` must have the same length. */ - function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) - external - view - returns (uint256[] memory); + function balanceOfBatch( + address[] calldata accounts, + uint256[] calldata ids + ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, @@ -96,13 +96,7 @@ interface IERC1155 is IERC165 { * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes calldata data - ) external; + function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. diff --git a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol index cfaa2359d..cc81957a7 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Burnable.sol @@ -12,11 +12,7 @@ import "../ERC1155.sol"; * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { - function burn( - address account, - uint256 id, - uint256 value - ) public virtual { + function burn(address account, uint256 id, uint256 value) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" @@ -25,11 +21,7 @@ abstract contract ERC1155Burnable is ERC1155 { _burn(account, id, value); } - function burnBatch( - address account, - uint256[] memory ids, - uint256[] memory values - ) public virtual { + function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" diff --git a/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol b/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol index e57fdcc39..fd7729aa7 100644 --- a/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol +++ b/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol @@ -49,12 +49,7 @@ contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155B * * - the caller must have the `MINTER_ROLE`. */ - function mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) public virtual { + function mint(address to, uint256 id, uint256 amount, bytes memory data) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mint(to, id, amount, data); @@ -63,12 +58,7 @@ contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155B /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. */ - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) public virtual { + function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mintBatch(to, ids, amounts, data); @@ -105,13 +95,9 @@ contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155B /** * @dev See {IERC165-supportsInterface}. */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerable, ERC1155) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view virtual override(AccessControlEnumerable, ERC1155) returns (bool) { return super.supportsInterface(interfaceId); } diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index 102bc8504..dfca5a79b 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -155,11 +155,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual override returns (bool) { + function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); @@ -223,11 +219,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ - function _transfer( - address from, - address to, - uint256 amount - ) internal virtual { + function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); @@ -313,11 +305,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { + function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); @@ -333,11 +321,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * * Might emit an {Approval} event. */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { + function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); @@ -361,11 +345,7 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes @@ -381,9 +361,5 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} + function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } diff --git a/contracts/token/ERC20/IERC20.sol b/contracts/token/ERC20/IERC20.sol index b816bfed0..66c4e4d88 100644 --- a/contracts/token/ERC20/IERC20.sol +++ b/contracts/token/ERC20/IERC20.sol @@ -74,9 +74,5 @@ interface IERC20 { * * Emits a {Transfer} event. */ - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); } diff --git a/contracts/token/ERC20/extensions/ERC20Pausable.sol b/contracts/token/ERC20/extensions/ERC20Pausable.sol index e448e96a6..d0b224f4b 100644 --- a/contracts/token/ERC20/extensions/ERC20Pausable.sol +++ b/contracts/token/ERC20/extensions/ERC20Pausable.sol @@ -21,11 +21,7 @@ abstract contract ERC20Pausable is ERC20, Pausable { * * - the contract must not be paused. */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20Pausable: token transfer while paused"); diff --git a/contracts/token/ERC20/extensions/ERC20Snapshot.sol b/contracts/token/ERC20/extensions/ERC20Snapshot.sol index 0b46fc660..ee104b0ec 100644 --- a/contracts/token/ERC20/extensions/ERC20Snapshot.sol +++ b/contracts/token/ERC20/extensions/ERC20Snapshot.sol @@ -120,11 +120,7 @@ abstract contract ERC20Snapshot is ERC20 { // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index 0fd57cecf..bf1c2fd5d 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -197,11 +197,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { * * Emits a {IVotes-DelegateVotesChanged} event. */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { + function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); @@ -222,11 +218,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } - function _moveVotingPower( - address src, - address dst, - uint256 amount - ) private { + function _moveVotingPower(address src, address dst, uint256 amount) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 3ffcd7bfd..9b26aefeb 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -153,11 +153,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { } /** @dev See {IERC4626-withdraw}. */ - function withdraw( - uint256 assets, - address receiver, - address owner - ) public virtual override returns (uint256) { + function withdraw(uint256 assets, address receiver, address owner) public virtual override returns (uint256) { require(assets <= maxWithdraw(owner), "ERC4626: withdraw more than max"); uint256 shares = previewWithdraw(assets); @@ -167,11 +163,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { } /** @dev See {IERC4626-redeem}. */ - function redeem( - uint256 shares, - address receiver, - address owner - ) public virtual override returns (uint256) { + function redeem(uint256 shares, address receiver, address owner) public virtual override returns (uint256) { require(shares <= maxRedeem(owner), "ERC4626: redeem more than max"); uint256 assets = previewRedeem(shares); @@ -230,12 +222,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { /** * @dev Deposit/mint common workflow. */ - function _deposit( - address caller, - address receiver, - uint256 assets, - uint256 shares - ) internal virtual { + function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual { // If _asset is ERC777, `transferFrom` can trigger a reenterancy BEFORE the transfer happens through the // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer, // calls the vault, which is assumed not malicious. diff --git a/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol b/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol index 52afef3ab..e8268145d 100644 --- a/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol +++ b/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol @@ -24,12 +24,7 @@ contract ERC20PresetFixedSupply is ERC20Burnable { * * See {ERC20-constructor}. */ - constructor( - string memory name, - string memory symbol, - uint256 initialSupply, - address owner - ) ERC20(name, symbol) { + constructor(string memory name, string memory symbol, uint256 initialSupply, address owner) ERC20(name, symbol) { _mint(owner, initialSupply); } } diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index bfc381f9b..028711ddf 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -19,20 +19,11 @@ import "../../../utils/Address.sol"; library SafeERC20 { using Address for address; - function safeTransfer( - IERC20 token, - address to, - uint256 value - ) internal { + function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } - function safeTransferFrom( - IERC20 token, - address from, - address to, - uint256 value - ) internal { + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } @@ -43,11 +34,7 @@ library SafeERC20 { * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ - function safeApprove( - IERC20 token, - address spender, - uint256 value - ) internal { + function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' @@ -58,20 +45,12 @@ library SafeERC20 { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } - function safeIncreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } - function safeDecreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); diff --git a/contracts/token/ERC20/utils/TokenTimelock.sol b/contracts/token/ERC20/utils/TokenTimelock.sol index d879a7e7d..ed855b7bc 100644 --- a/contracts/token/ERC20/utils/TokenTimelock.sol +++ b/contracts/token/ERC20/utils/TokenTimelock.sol @@ -29,11 +29,7 @@ contract TokenTimelock { * `beneficiary_` when {release} is invoked after `releaseTime_`. The release time is specified as a Unix timestamp * (in seconds). */ - constructor( - IERC20 token_, - address beneficiary_, - uint256 releaseTime_ - ) { + constructor(IERC20 token_, address beneficiary_, uint256 releaseTime_) { require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time"); _token = token_; _beneficiary = beneficiary_; diff --git a/contracts/token/ERC721/ERC721.sol b/contracts/token/ERC721/ERC721.sol index 80fc22de0..6bf620b4f 100644 --- a/contracts/token/ERC721/ERC721.sol +++ b/contracts/token/ERC721/ERC721.sol @@ -147,11 +147,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { /** * @dev See {IERC721-transferFrom}. */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { + function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); @@ -161,23 +157,14 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { /** * @dev See {IERC721-safeTransferFrom}. */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { + function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory data - ) public virtual override { + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } @@ -200,12 +187,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { * * Emits a {Transfer} event. */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { + function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } @@ -259,11 +241,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ - function _safeMint( - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { + function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), @@ -352,11 +330,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { * * Emits a {Transfer} event. */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal virtual { + function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); @@ -399,11 +373,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { * * Emits an {ApprovalForAll} event. */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); @@ -467,7 +437,7 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { function _beforeTokenTransfer( address from, address to, - uint256, /* firstTokenId */ + uint256 /* firstTokenId */, uint256 batchSize ) internal virtual { if (batchSize > 1) { @@ -494,10 +464,5 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual {} + function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} } diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 22020bab0..646530aa5 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -51,12 +51,7 @@ interface IERC721 is IERC165 { * * Emits a {Transfer} event. */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes calldata data - ) external; + function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients @@ -72,11 +67,7 @@ interface IERC721 is IERC165 { * * Emits a {Transfer} event. */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) external; + function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. @@ -94,11 +85,7 @@ interface IERC721 is IERC165 { * * Emits a {Transfer} event. */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) external; + function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. diff --git a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol index 06b377324..478e5808d 100644 --- a/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ b/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol @@ -51,11 +51,7 @@ contract ERC721PresetMinterPauserAutoId is * Token URIs will be autogenerated based on `baseURI` and their token IDs. * See {ERC721-tokenURI}. */ - constructor( - string memory name, - string memory symbol, - string memory baseTokenURI - ) ERC721(name, symbol) { + constructor(string memory name, string memory symbol, string memory baseTokenURI) ERC721(name, symbol) { _baseTokenURI = baseTokenURI; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); @@ -128,13 +124,9 @@ contract ERC721PresetMinterPauserAutoId is /** * @dev See {IERC165-supportsInterface}. */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerable, ERC721, ERC721Enumerable) - returns (bool) - { + function supportsInterface( + bytes4 interfaceId + ) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } } diff --git a/contracts/token/ERC721/utils/ERC721Holder.sol b/contracts/token/ERC721/utils/ERC721Holder.sol index 394926d51..cfa533a47 100644 --- a/contracts/token/ERC721/utils/ERC721Holder.sol +++ b/contracts/token/ERC721/utils/ERC721Holder.sol @@ -17,12 +17,7 @@ contract ERC721Holder is IERC721Receiver { * * Always returns `IERC721Receiver.onERC721Received.selector`. */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { + function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index 7c35bf5a8..c1503c4df 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -57,11 +57,7 @@ contract ERC777 is Context, IERC777, IERC20 { /** * @dev `defaultOperators` may be an empty array. */ - constructor( - string memory name_, - string memory symbol_, - address[] memory defaultOperators_ - ) { + constructor(string memory name_, string memory symbol_, address[] memory defaultOperators_) { _name = name_; _symbol = symbol_; @@ -127,11 +123,7 @@ contract ERC777 is Context, IERC777, IERC20 { * * Also emits a {IERC20-Transfer} event for ERC20 compatibility. */ - function send( - address recipient, - uint256 amount, - bytes memory data - ) public virtual override { + function send(address recipient, uint256 amount, bytes memory data) public virtual override { _send(_msgSender(), recipient, amount, data, "", true); } @@ -272,11 +264,7 @@ contract ERC777 is Context, IERC777, IERC20 { * * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events. */ - function transferFrom( - address holder, - address recipient, - uint256 amount - ) public virtual override returns (bool) { + function transferFrom(address holder, address recipient, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(holder, spender, amount); _send(holder, recipient, amount, "", "", false); @@ -301,12 +289,7 @@ contract ERC777 is Context, IERC777, IERC20 { * - if `account` is a contract, it must implement the {IERC777Recipient} * interface. */ - function _mint( - address account, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) internal virtual { + function _mint(address account, uint256 amount, bytes memory userData, bytes memory operatorData) internal virtual { _mint(account, amount, userData, operatorData, true); } @@ -387,12 +370,7 @@ contract ERC777 is Context, IERC777, IERC20 { * @param data bytes extra information provided by the token holder * @param operatorData bytes extra information provided by the operator (if any) */ - function _burn( - address from, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) internal virtual { + function _burn(address from, uint256 amount, bytes memory data, bytes memory operatorData) internal virtual { require(from != address(0), "ERC777: burn from the zero address"); address operator = _msgSender(); @@ -439,11 +417,7 @@ contract ERC777 is Context, IERC777, IERC20 { * * Note that accounts cannot have allowance issued by their operators. */ - function _approve( - address holder, - address spender, - uint256 value - ) internal virtual { + function _approve(address holder, address spender, uint256 value) internal virtual { require(holder != address(0), "ERC777: approve from the zero address"); require(spender != address(0), "ERC777: approve to the zero address"); @@ -510,11 +484,7 @@ contract ERC777 is Context, IERC777, IERC20 { * * Might emit an {IERC20-Approval} event. */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { + function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC777: insufficient allowance"); @@ -538,10 +508,5 @@ contract ERC777 is Context, IERC777, IERC20 { * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256 amount - ) internal virtual {} + function _beforeTokenTransfer(address operator, address from, address to, uint256 amount) internal virtual {} } diff --git a/contracts/token/ERC777/IERC777.sol b/contracts/token/ERC777/IERC777.sol index 2af7771b0..d3bede626 100644 --- a/contracts/token/ERC777/IERC777.sol +++ b/contracts/token/ERC777/IERC777.sol @@ -83,11 +83,7 @@ interface IERC777 { * - if `recipient` is a contract, it must implement the {IERC777Recipient} * interface. */ - function send( - address recipient, - uint256 amount, - bytes calldata data - ) external; + function send(address recipient, uint256 amount, bytes calldata data) external; /** * @dev Destroys `amount` tokens from the caller's account, reducing the @@ -191,12 +187,7 @@ interface IERC777 { * - `account` must have at least `amount` tokens. * - the caller must be an operator for `account`. */ - function operatorBurn( - address account, - uint256 amount, - bytes calldata data, - bytes calldata operatorData - ) external; + function operatorBurn(address account, uint256 amount, bytes calldata data, bytes calldata operatorData) external; event Sent( address indexed operator, diff --git a/contracts/token/common/ERC2981.sol b/contracts/token/common/ERC2981.sol index 604dba304..84cb6b8de 100644 --- a/contracts/token/common/ERC2981.sol +++ b/contracts/token/common/ERC2981.sol @@ -91,11 +91,7 @@ abstract contract ERC2981 is IERC2981, ERC165 { * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ - function _setTokenRoyalty( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) internal virtual { + function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index e89512342..70d03e3d2 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -111,11 +111,7 @@ library Address { * * _Available since v3.1._ */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 942acb92e..0e0a136a0 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -104,15 +104,9 @@ library Checkpoints { * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value * in the most recent checkpoint. */ - function latestCheckpoint(History storage self) - internal - view - returns ( - bool exists, - uint32 _blockNumber, - uint224 _value - ) - { + function latestCheckpoint( + History storage self + ) internal view returns (bool exists, uint32 _blockNumber, uint224 _value) { uint256 pos = self._checkpoints.length; if (pos == 0) { return (false, 0, 0); @@ -133,11 +127,7 @@ library Checkpoints { * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, * or by updating the last one. */ - function _insert( - Checkpoint[] storage self, - uint32 key, - uint224 value - ) private returns (uint224, uint224) { + function _insert(Checkpoint[] storage self, uint32 key, uint224 value) private returns (uint224, uint224) { uint256 pos = self.length; if (pos > 0) { @@ -230,11 +220,7 @@ library Checkpoints { * * Returns previous value and new value. */ - function push( - Trace224 storage self, - uint32 key, - uint224 value - ) internal returns (uint224, uint224) { + function push(Trace224 storage self, uint32 key, uint224 value) internal returns (uint224, uint224) { return _insert(self._checkpoints, key, value); } @@ -268,15 +254,7 @@ library Checkpoints { * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value * in the most recent checkpoint. */ - function latestCheckpoint(Trace224 storage self) - internal - view - returns ( - bool exists, - uint32 _key, - uint224 _value - ) - { + function latestCheckpoint(Trace224 storage self) internal view returns (bool exists, uint32 _key, uint224 _value) { uint256 pos = self._checkpoints.length; if (pos == 0) { return (false, 0, 0); @@ -297,11 +275,7 @@ library Checkpoints { * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, * or by updating the last one. */ - function _insert( - Checkpoint224[] storage self, - uint32 key, - uint224 value - ) private returns (uint224, uint224) { + function _insert(Checkpoint224[] storage self, uint32 key, uint224 value) private returns (uint224, uint224) { uint256 pos = self.length; if (pos > 0) { @@ -373,11 +347,10 @@ library Checkpoints { /** * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. */ - function _unsafeAccess(Checkpoint224[] storage self, uint256 pos) - private - pure - returns (Checkpoint224 storage result) - { + function _unsafeAccess( + Checkpoint224[] storage self, + uint256 pos + ) private pure returns (Checkpoint224 storage result) { assembly { mstore(0, self.slot) result.slot := add(keccak256(0, 0x20), pos) @@ -398,11 +371,7 @@ library Checkpoints { * * Returns previous value and new value. */ - function push( - Trace160 storage self, - uint96 key, - uint160 value - ) internal returns (uint160, uint160) { + function push(Trace160 storage self, uint96 key, uint160 value) internal returns (uint160, uint160) { return _insert(self._checkpoints, key, value); } @@ -436,15 +405,7 @@ library Checkpoints { * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value * in the most recent checkpoint. */ - function latestCheckpoint(Trace160 storage self) - internal - view - returns ( - bool exists, - uint96 _key, - uint160 _value - ) - { + function latestCheckpoint(Trace160 storage self) internal view returns (bool exists, uint96 _key, uint160 _value) { uint256 pos = self._checkpoints.length; if (pos == 0) { return (false, 0, 0); @@ -465,11 +426,7 @@ library Checkpoints { * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, * or by updating the last one. */ - function _insert( - Checkpoint160[] storage self, - uint96 key, - uint160 value - ) private returns (uint160, uint160) { + function _insert(Checkpoint160[] storage self, uint96 key, uint160 value) private returns (uint160, uint160) { uint256 pos = self.length; if (pos > 0) { @@ -541,11 +498,10 @@ library Checkpoints { /** * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. */ - function _unsafeAccess(Checkpoint160[] storage self, uint256 pos) - private - pure - returns (Checkpoint160 storage result) - { + function _unsafeAccess( + Checkpoint160[] storage self, + uint256 pos + ) private pure returns (Checkpoint160 storage result) { assembly { mstore(0, self.slot) result.slot := add(keccak256(0, 0x20), pos) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 8df86d669..2255a4df8 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -27,11 +27,7 @@ library Create2 { * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) internal returns (address addr) { + function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) { require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); /// @solidity memory-safe-assembly @@ -53,11 +49,7 @@ library Create2 { * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash, - address deployer - ) internal pure returns (address addr) { + function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index 4b1d66b09..3f996520e 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -98,11 +98,7 @@ library ECDSA { * * _Available since v4.3._ */ - function tryRecover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address, RecoverError) { + function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); @@ -113,11 +109,7 @@ library ECDSA { * * _Available since v4.2._ */ - function recover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address) { + function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; @@ -129,12 +121,7 @@ library ECDSA { * * _Available since v4.3._ */ - function tryRecover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address, RecoverError) { + function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most @@ -161,12 +148,7 @@ library ECDSA { * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ - function recover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address) { + function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 47c60eb01..0ce87faf2 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -24,11 +24,7 @@ library MerkleProof { * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) internal pure returns (bool) { + function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } @@ -37,11 +33,7 @@ library MerkleProof { * * _Available since v4.7._ */ - function verifyCalldata( - bytes32[] calldata proof, - bytes32 root, - bytes32 leaf - ) internal pure returns (bool) { + function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index 77fe98282..e06778deb 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -21,11 +21,7 @@ library SignatureChecker { * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) internal view returns (bool) { + function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); if (error == ECDSA.RecoverError.NoError && recovered == signer) { return true; diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index 4c5fe2092..40ffd68f7 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -48,11 +48,10 @@ library ERC165Checker { * * _Available since v3.4._ */ - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) - internal - view - returns (bool[] memory) - { + function getSupportedInterfaces( + address account, + bytes4[] memory interfaceIds + ) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); diff --git a/contracts/utils/introspection/ERC1820Implementer.sol b/contracts/utils/introspection/ERC1820Implementer.sol index 1b5139658..ac5a884c0 100644 --- a/contracts/utils/introspection/ERC1820Implementer.sol +++ b/contracts/utils/introspection/ERC1820Implementer.sol @@ -21,13 +21,10 @@ contract ERC1820Implementer is IERC1820Implementer { /** * @dev See {IERC1820Implementer-canImplementInterfaceForAddress}. */ - function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) - public - view - virtual - override - returns (bytes32) - { + function canImplementInterfaceForAddress( + bytes32 interfaceHash, + address account + ) public view virtual override returns (bytes32) { return _supportedInterfaces[interfaceHash][account] ? _ERC1820_ACCEPT_MAGIC : bytes32(0x00); } diff --git a/contracts/utils/introspection/IERC1820Registry.sol b/contracts/utils/introspection/IERC1820Registry.sol index 42cf46a8a..a146bc2a6 100644 --- a/contracts/utils/introspection/IERC1820Registry.sol +++ b/contracts/utils/introspection/IERC1820Registry.sol @@ -64,11 +64,7 @@ interface IERC1820Registry { * queried for support, unless `implementer` is the caller. See * {IERC1820Implementer-canImplementInterfaceForAddress}. */ - function setInterfaceImplementer( - address account, - bytes32 _interfaceHash, - address implementer - ) external; + function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external; /** * @dev Returns the implementer of `interfaceHash` for `account`. If no such diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index 0ed5460e0..f3a83b0ff 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -52,11 +52,7 @@ library Math { * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator - ) internal pure returns (uint256 result) { + function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 @@ -137,12 +133,7 @@ library Math { /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator, - Rounding rounding - ) internal pure returns (uint256) { + function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; @@ -258,31 +249,31 @@ library Math { function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { - if (value >= 10**64) { - value /= 10**64; + if (value >= 10 ** 64) { + value /= 10 ** 64; result += 64; } - if (value >= 10**32) { - value /= 10**32; + if (value >= 10 ** 32) { + value /= 10 ** 32; result += 32; } - if (value >= 10**16) { - value /= 10**16; + if (value >= 10 ** 16) { + value /= 10 ** 16; result += 16; } - if (value >= 10**8) { - value /= 10**8; + if (value >= 10 ** 8) { + value /= 10 ** 8; result += 8; } - if (value >= 10**4) { - value /= 10**4; + if (value >= 10 ** 4) { + value /= 10 ** 4; result += 4; } - if (value >= 10**2) { - value /= 10**2; + if (value >= 10 ** 2) { + value /= 10 ** 2; result += 2; } - if (value >= 10**1) { + if (value >= 10 ** 1) { result += 1; } } @@ -296,7 +287,7 @@ library Math { function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); - return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); + return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } diff --git a/contracts/utils/math/SafeMath.sol b/contracts/utils/math/SafeMath.sol index 550f0e779..2f48fb736 100644 --- a/contracts/utils/math/SafeMath.sol +++ b/contracts/utils/math/SafeMath.sol @@ -165,11 +165,7 @@ library SafeMath { * * - Subtraction cannot overflow. */ - function sub( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; @@ -188,11 +184,7 @@ library SafeMath { * * - The divisor cannot be zero. */ - function div( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; @@ -214,11 +206,7 @@ library SafeMath { * * - The divisor cannot be zero. */ - function mod( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; diff --git a/contracts/utils/structs/BitMaps.sol b/contracts/utils/structs/BitMaps.sol index a2ddc4709..eb67bfab0 100644 --- a/contracts/utils/structs/BitMaps.sol +++ b/contracts/utils/structs/BitMaps.sol @@ -23,11 +23,7 @@ library BitMaps { /** * @dev Sets the bit at `index` to the boolean `value`. */ - function setTo( - BitMap storage bitmap, - uint256 index, - bool value - ) internal { + function setTo(BitMap storage bitmap, uint256 index, bool value) internal { if (value) { set(bitmap, index); } else { diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index a3fda61d8..d359671f4 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -70,11 +70,7 @@ library EnumerableMap { * Returns true if the key was added to the map, that is if it was not * already present. */ - function set( - Bytes32ToBytes32Map storage map, - bytes32 key, - bytes32 value - ) internal returns (bool) { + function set(Bytes32ToBytes32Map storage map, bytes32 key, bytes32 value) internal returns (bool) { map._values[key] = value; return map._keys.add(key); } @@ -173,11 +169,7 @@ library EnumerableMap { * Returns true if the key was added to the map, that is if it was not * already present. */ - function set( - UintToUintMap storage map, - uint256 key, - uint256 value - ) internal returns (bool) { + function set(UintToUintMap storage map, uint256 key, uint256 value) internal returns (bool) { return set(map._inner, bytes32(key), bytes32(value)); } @@ -244,11 +236,7 @@ library EnumerableMap { * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ - function get( - UintToUintMap storage map, - uint256 key, - string memory errorMessage - ) internal view returns (uint256) { + function get(UintToUintMap storage map, uint256 key, string memory errorMessage) internal view returns (uint256) { return uint256(get(map._inner, bytes32(key), errorMessage)); } @@ -265,11 +253,7 @@ library EnumerableMap { * Returns true if the key was added to the map, that is if it was not * already present. */ - function set( - UintToAddressMap storage map, - uint256 key, - address value - ) internal returns (bool) { + function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } @@ -357,11 +341,7 @@ library EnumerableMap { * Returns true if the key was added to the map, that is if it was not * already present. */ - function set( - AddressToUintMap storage map, - address key, - uint256 value - ) internal returns (bool) { + function set(AddressToUintMap storage map, address key, uint256 value) internal returns (bool) { return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value)); } @@ -449,11 +429,7 @@ library EnumerableMap { * Returns true if the key was added to the map, that is if it was not * already present. */ - function set( - Bytes32ToUintMap storage map, - bytes32 key, - uint256 value - ) internal returns (bool) { + function set(Bytes32ToUintMap storage map, bytes32 key, uint256 value) internal returns (bool) { return set(map._inner, key, bytes32(value)); } diff --git a/contracts/vendor/amb/IAMB.sol b/contracts/vendor/amb/IAMB.sol index 1a5d7080f..73a2bd24b 100644 --- a/contracts/vendor/amb/IAMB.sol +++ b/contracts/vendor/amb/IAMB.sol @@ -31,17 +31,9 @@ interface IAMB { function failedMessageSender(bytes32 _messageId) external view returns (address); - function requireToPassMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); + function requireToPassMessage(address _contract, bytes calldata _data, uint256 _gas) external returns (bytes32); - function requireToConfirmMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); + function requireToConfirmMessage(address _contract, bytes calldata _data, uint256 _gas) external returns (bytes32); function sourceChainId() external view returns (uint256); diff --git a/contracts/vendor/arbitrum/IArbSys.sol b/contracts/vendor/arbitrum/IArbSys.sol index aac5dd53a..9b79d5c16 100644 --- a/contracts/vendor/arbitrum/IArbSys.sol +++ b/contracts/vendor/arbitrum/IArbSys.sol @@ -92,14 +92,7 @@ interface IArbSys { * @return root root hash of the send history * @return partials hashes of partial subtrees in the send history tree */ - function sendMerkleTreeState() - external - view - returns ( - uint256 size, - bytes32 root, - bytes32[] memory partials - ); + function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials); /** * @notice creates a send txn from L2 to L1 diff --git a/contracts/vendor/arbitrum/IBridge.sol b/contracts/vendor/arbitrum/IBridge.sol index 7518f5d13..e71bedce0 100644 --- a/contracts/vendor/arbitrum/IBridge.sol +++ b/contracts/vendor/arbitrum/IBridge.sol @@ -77,14 +77,7 @@ interface IBridge { uint256 afterDelayedMessagesRead, uint256 prevMessageCount, uint256 newMessageCount - ) - external - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ); + ) external returns (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc); /** * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type diff --git a/contracts/vendor/arbitrum/IOutbox.sol b/contracts/vendor/arbitrum/IOutbox.sol index 4f809dbf4..22fa58f40 100644 --- a/contracts/vendor/arbitrum/IOutbox.sol +++ b/contracts/vendor/arbitrum/IOutbox.sol @@ -113,9 +113,5 @@ interface IOutbox { bytes calldata data ) external pure returns (bytes32); - function calculateMerkleRoot( - bytes32[] memory proof, - uint256 path, - bytes32 item - ) external pure returns (bytes32); + function calculateMerkleRoot(bytes32[] memory proof, uint256 path, bytes32 item) external pure returns (bytes32); } diff --git a/contracts/vendor/optimism/ICrossDomainMessenger.sol b/contracts/vendor/optimism/ICrossDomainMessenger.sol index 9cc797701..cc01a48ab 100644 --- a/contracts/vendor/optimism/ICrossDomainMessenger.sol +++ b/contracts/vendor/optimism/ICrossDomainMessenger.sol @@ -30,9 +30,5 @@ interface ICrossDomainMessenger { * @param _message Message to send to the target. * @param _gasLimit Gas limit for the provided message. */ - function sendMessage( - address _target, - bytes calldata _message, - uint32 _gasLimit - ) external; + function sendMessage(address _target, bytes calldata _message, uint32 _gasLimit) external; } diff --git a/contracts/vendor/polygon/IFxMessageProcessor.sol b/contracts/vendor/polygon/IFxMessageProcessor.sol index 9f42eb647..be73e6f53 100644 --- a/contracts/vendor/polygon/IFxMessageProcessor.sol +++ b/contracts/vendor/polygon/IFxMessageProcessor.sol @@ -3,9 +3,5 @@ pragma solidity ^0.8.0; interface IFxMessageProcessor { - function processMessageFromRoot( - uint256 stateId, - address rootMessageSender, - bytes calldata data - ) external; + function processMessageFromRoot(uint256 stateId, address rootMessageSender, bytes calldata data) external; } diff --git a/package-lock.json b/package-lock.json index 4463d1df4..c6a0aa03b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "merkletreejs": "^0.2.13", "micromatch": "^4.0.2", "prettier": "^2.3.0", - "prettier-plugin-solidity": "^1.0.0-beta.16", + "prettier-plugin-solidity": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "solhint": "^3.3.6", @@ -1836,9 +1836,9 @@ } }, "node_modules/@solidity-parser/parser": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", - "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" @@ -5893,9 +5893,9 @@ } }, "node_modules/emoji-regex": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", - "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "node_modules/encodeurl": { @@ -11661,15 +11661,15 @@ } }, "node_modules/prettier-plugin-solidity": { - "version": "1.0.0-beta.24", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz", - "integrity": "sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.0.tgz", + "integrity": "sha512-5gq0T49ifvXH/6x1STuKyWjTUgi6ICoV65yNtKlg/vZEvocFtSpByJOJICBfqPwNsnv4vhhWIqkLGSUJmWum2w==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.14.3", - "emoji-regex": "^10.1.0", + "@solidity-parser/parser": "^0.14.5", + "emoji-regex": "^10.2.1", "escape-string-regexp": "^4.0.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "solidity-comments-extractor": "^0.0.7", "string-width": "^4.2.3" }, @@ -11698,6 +11698,33 @@ "node": ">=8" } }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prettier-plugin-solidity/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11730,6 +11757,12 @@ "node": ">=8" } }, + "node_modules/prettier-plugin-solidity/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/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -17585,9 +17618,9 @@ "dev": true }, "@solidity-parser/parser": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.3.tgz", - "integrity": "sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, "requires": { "antlr4ts": "^0.5.0-alpha.4" @@ -20902,9 +20935,9 @@ } }, "emoji-regex": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz", - "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "encodeurl": { @@ -25432,15 +25465,15 @@ "dev": true }, "prettier-plugin-solidity": { - "version": "1.0.0-beta.24", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz", - "integrity": "sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.0.tgz", + "integrity": "sha512-5gq0T49ifvXH/6x1STuKyWjTUgi6ICoV65yNtKlg/vZEvocFtSpByJOJICBfqPwNsnv4vhhWIqkLGSUJmWum2w==", "dev": true, "requires": { - "@solidity-parser/parser": "^0.14.3", - "emoji-regex": "^10.1.0", + "@solidity-parser/parser": "^0.14.5", + "emoji-regex": "^10.2.1", "escape-string-regexp": "^4.0.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "solidity-comments-extractor": "^0.0.7", "string-width": "^4.2.3" }, @@ -25457,6 +25490,24 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "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, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -25484,6 +25535,12 @@ "requires": { "ansi-regex": "^5.0.1" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, diff --git a/package.json b/package.json index 7ffdedcee..4bc8f6e25 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "merkletreejs": "^0.2.13", "micromatch": "^4.0.2", "prettier": "^2.3.0", - "prettier-plugin-solidity": "^1.0.0-beta.16", + "prettier-plugin-solidity": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "solhint": "^3.3.6", diff --git a/test/utils/math/Math.t.sol b/test/utils/math/Math.t.sol index c1c6f447d..5542baf9d 100644 --- a/test/utils/math/Math.t.sol +++ b/test/utils/math/Math.t.sol @@ -70,16 +70,16 @@ contract MathTest is Test { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf2Bigger(result + 1, input)); } else { - assertEq(2**result, input); + assertEq(2 ** result, input); } } function _powerOf2Bigger(uint256 value, uint256 ref) private pure returns (bool) { - return value >= 256 || 2**value > ref; // 2**256 overflows uint256 + return value >= 256 || 2 ** value > ref; // 2**256 overflows uint256 } function _powerOf2Smaller(uint256 value, uint256 ref) private pure returns (bool) { - return 2**value < ref; + return 2 ** value < ref; } // LOG10 @@ -97,16 +97,16 @@ contract MathTest is Test { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf10Bigger(result + 1, input)); } else { - assertEq(10**result, input); + assertEq(10 ** result, input); } } function _powerOf10Bigger(uint256 value, uint256 ref) private pure returns (bool) { - return value >= 78 || 10**value > ref; // 10**78 overflows uint256 + return value >= 78 || 10 ** value > ref; // 10**78 overflows uint256 } function _powerOf10Smaller(uint256 value, uint256 ref) private pure returns (bool) { - return 10**value < ref; + return 10 ** value < ref; } // LOG256 @@ -124,24 +124,20 @@ contract MathTest is Test { assertFalse(rounding == Math.Rounding.Up); assertTrue(_powerOf256Bigger(result + 1, input)); } else { - assertEq(256**result, input); + assertEq(256 ** result, input); } } function _powerOf256Bigger(uint256 value, uint256 ref) private pure returns (bool) { - return value >= 32 || 256**value > ref; // 256**32 overflows uint256 + return value >= 32 || 256 ** value > ref; // 256**32 overflows uint256 } function _powerOf256Smaller(uint256 value, uint256 ref) private pure returns (bool) { - return 256**value < ref; + return 256 ** value < ref; } // MULDIV - function testMulDiv( - uint256 x, - uint256 y, - uint256 d - ) public { + function testMulDiv(uint256 x, uint256 y, uint256 d) public { // Full precision for x * y (uint256 xyHi, uint256 xyLo) = _mulHighLow(x, y); @@ -163,11 +159,7 @@ contract MathTest is Test { assertEq(xyLo, qdRemLo); } - function testMulDivDomain( - uint256 x, - uint256 y, - uint256 d - ) public { + function testMulDivDomain(uint256 x, uint256 y, uint256 d) public { (uint256 xyHi, ) = _mulHighLow(x, y); // Violate {testMulDiv} assumption (covers d is 0 and result overflow) @@ -180,11 +172,7 @@ contract MathTest is Test { } // External call - function muldiv( - uint256 x, - uint256 y, - uint256 d - ) external pure returns (uint256) { + function muldiv(uint256 x, uint256 y, uint256 d) external pure returns (uint256) { return Math.mulDiv(x, y, d); } @@ -194,11 +182,7 @@ contract MathTest is Test { return Math.Rounding(r); } - function _mulmod( - uint256 x, - uint256 y, - uint256 z - ) private pure returns (uint256 r) { + function _mulmod(uint256 x, uint256 y, uint256 z) private pure returns (uint256 r) { assembly { r := mulmod(x, y, z) } From 446cd9f5fb5d982863ffaecf5dd40489f595d7f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Dec 2022 22:56:03 -0300 Subject: [PATCH 095/197] Update lockfile (#3788) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 5246 +++++++++++---------------------------------- 1 file changed, 1274 insertions(+), 3972 deletions(-) diff --git a/package-lock.json b/package-lock.json index c6a0aa03b..8d8a2ca16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,9 +59,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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==", "dev": true, "engines": { "node": ">=6.9.0" @@ -153,12 +153,12 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -210,9 +210,9 @@ } }, "node_modules/@ensdomains/ensjs/node_modules/ethers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", - "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, "funding": [ { @@ -240,10 +240,10 @@ "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.0", + "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.0", + "@ethersproject/providers": "5.7.2", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", @@ -253,7 +253,7 @@ "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.0", + "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } }, @@ -285,23 +285,23 @@ } }, "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", "dev": true, "dependencies": { "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "ethereumjs-util": "^7.1.1" } }, "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", "dev": true, "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" } }, "node_modules/@ethersproject/abi": { @@ -665,9 +665,9 @@ ] }, "node_modules/@ethersproject/networks": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", - "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, "funding": [ { @@ -723,9 +723,9 @@ } }, "node_modules/@ethersproject/providers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", - "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "dev": true, "funding": [ { @@ -999,9 +999,9 @@ } }, "node_modules/@ethersproject/web": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", - "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, "funding": [ { @@ -1357,9 +1357,9 @@ } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", - "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz", + "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==", "dev": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -1369,30 +1369,30 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", - "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", + "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", "dev": true, "engines": { "node": ">= 12" }, "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", - "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", + "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", "cpu": [ "arm64" ], @@ -1406,9 +1406,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", - "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", + "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", "cpu": [ "x64" ], @@ -1422,9 +1422,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", - "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", + "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", "cpu": [ "x64" ], @@ -1438,9 +1438,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", - "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", + "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", "cpu": [ "arm64" ], @@ -1454,9 +1454,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", - "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", + "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", "cpu": [ "arm64" ], @@ -1470,9 +1470,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", - "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", + "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", "cpu": [ "x64" ], @@ -1486,9 +1486,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", - "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", + "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", "cpu": [ "x64" ], @@ -1502,9 +1502,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", - "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", + "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", "cpu": [ "arm64" ], @@ -1518,9 +1518,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", - "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", + "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", "cpu": [ "ia32" ], @@ -1534,9 +1534,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", - "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", + "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", "cpu": [ "x64" ], @@ -1857,54 +1857,30 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", - "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", + "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", "dev": true, "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", - "web3-utils": "1.7.4" - } - }, - "node_modules/@truffle/abi-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/abi-utils/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" + "web3-utils": "1.8.1" } }, "node_modules/@truffle/blockchain-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz", - "integrity": "sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", + "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", "dev": true }, "node_modules/@truffle/codec": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", - "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", + "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", "dev": true, "dependencies": { - "@truffle/abi-utils": "^0.3.1", - "@truffle/compile-common": "^0.8.0", + "@truffle/abi-utils": "^0.3.6", + "@truffle/compile-common": "^0.9.1", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -1912,7 +1888,7 @@ "lodash": "^4.17.21", "semver": "7.3.7", "utf8": "^3.0.0", - "web3-utils": "1.7.4" + "web3-utils": "1.8.1" } }, "node_modules/@truffle/codec/node_modules/bn.js": { @@ -1921,28 +1897,43 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "node_modules/@truffle/codec/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": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/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/@truffle/compile-common": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", - "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", + "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", "dev": true, "dependencies": { "@truffle/error": "^0.1.1", @@ -1972,67 +1963,6 @@ } }, "node_modules/@truffle/contract-schema": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", - "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", - "dev": true, - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - } - }, - "node_modules/@truffle/contract/node_modules/@truffle/abi-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", - "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", - "dev": true, - "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.8.1" - } - }, - "node_modules/@truffle/contract/node_modules/@truffle/blockchain-utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", - "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/@truffle/codec": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", - "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", - "dev": true, - "dependencies": { - "@truffle/abi-utils": "^0.3.6", - "@truffle/compile-common": "^0.9.1", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.8.1" - } - }, - "node_modules/@truffle/contract/node_modules/@truffle/codec/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/@truffle/compile-common": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", - "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.1.1", - "colors": "1.4.0" - } - }, - "node_modules/@truffle/contract/node_modules/@truffle/contract-schema": { "version": "3.4.11", "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", @@ -2042,7 +1972,7 @@ "debug": "^4.3.1" } }, - "node_modules/@truffle/contract/node_modules/@truffle/debug-utils": { + "node_modules/@truffle/debug-utils": { "version": "6.0.42", "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", @@ -2056,734 +1986,6 @@ "highlightjs-solidity": "^2.0.5" } }, - "node_modules/@truffle/contract/node_modules/@truffle/debug-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/contract/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/contract/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/contract/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@truffle/contract/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/contract/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": ">=4" - } - }, - "node_modules/@truffle/contract/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/contract/node_modules/web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/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/@truffle/contract/node_modules/web3-bzz/node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/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/@truffle/contract/node_modules/web3-bzz/node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz/node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", - "dev": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", - "dev": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", - "dev": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3/node_modules/web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.34", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", - "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", - "dev": true, - "dependencies": { - "@truffle/codec": "^0.14.4", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.5" - } - }, "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -2878,643 +2080,12 @@ "web3": "1.8.1" } }, - "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/@truffle/interface-adapter/node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib/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/@truffle/interface-adapter/node_modules/web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/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/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/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/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz/node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", - "dev": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", - "dev": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", - "dev": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3/node_modules/web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", @@ -3628,21 +2199,21 @@ } }, "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "dependencies": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "node_modules/@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", "dev": true }, "node_modules/@types/concat-stream": { @@ -3707,9 +2278,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", "dev": true }, "node_modules/@types/pbkdf2": { @@ -3745,12 +2316,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -3770,9 +2335,9 @@ } }, "node_modules/abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", "dev": true }, "node_modules/abstract-level": { @@ -3852,9 +2417,9 @@ } }, "node_modules/address": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", - "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -3999,9 +2564,9 @@ "dev": true }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -4027,15 +2592,15 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -4064,14 +2629,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4082,14 +2647,14 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "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==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -4296,9 +2861,9 @@ } }, "node_modules/bigint-crypto-utils": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", - "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", + "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", "dev": true, "dependencies": { "bigint-mod-arith": "^3.1.0" @@ -4308,9 +2873,9 @@ } }, "node_modules/bigint-mod-arith": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", - "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", "dev": true, "engines": { "node": ">=10.4.0" @@ -4353,9 +2918,9 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -4366,7 +2931,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4391,33 +2956,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -4615,9 +3153,9 @@ "dev": true }, "node_modules/bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -4627,6 +3165,18 @@ "node": ">=6.14.2" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4790,23 +3340,23 @@ } }, "node_modules/cbor/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true, "engines": { "node": "*" } }, "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -5072,14 +3622,17 @@ "dev": true }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "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.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { @@ -5578,9 +4131,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", - "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -5614,15 +4167,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-is": { @@ -5704,37 +4257,19 @@ } }, "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "dependencies": { "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "4" }, "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, - "node_modules/detect-port/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/detect-port/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/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -5968,22 +4503,23 @@ } }, "node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -5993,8 +4529,9 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" }, "engines": { @@ -6456,9 +4993,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -7560,14 +6097,14 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -7586,7 +6123,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -7619,66 +6156,12 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/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/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -7780,9 +6263,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -7833,6 +6316,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/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/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -7875,9 +6391,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "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": [ { @@ -8247,9 +6763,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -8307,9 +6823,9 @@ } }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8361,14 +6877,26 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, + "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/got": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", @@ -8474,24 +7002,24 @@ } }, "node_modules/hardhat": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", - "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.4.tgz", + "integrity": "sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", - "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", - "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", - "@nomicfoundation/solidity-analyzer": "^0.0.3", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", @@ -8564,9 +7092,9 @@ } }, "node_modules/hardhat-ignore-warnings": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", - "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.6.tgz", + "integrity": "sha512-GQgvjprONI8VF8b85+QJ8H9v3L9TCCtQvUx+9QaRL+sCPw1cOZHfhlEz9V6Lq7GNCQMqBORVzNzUzoP/tKAEQQ==", "dev": true, "dependencies": { "minimatch": "^5.1.0", @@ -8584,9 +7112,9 @@ } }, "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9073,15 +7601,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", @@ -9119,9 +7638,9 @@ } }, "node_modules/http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, "dependencies": { "quick-lru": "^5.1.1", @@ -9198,9 +7717,9 @@ } }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", + "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==", "dev": true }, "node_modules/import-fresh": { @@ -9385,12 +7904,12 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -9520,9 +8039,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "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, "engines": { "node": ">= 0.4" @@ -9532,9 +8051,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -9750,15 +8269,15 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "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==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { @@ -9898,6 +8417,18 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -9988,9 +8519,9 @@ } }, "node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -10238,9 +8769,9 @@ } }, "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "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" @@ -10378,9 +8909,9 @@ } }, "node_modules/merkletreejs/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true, "engines": { "node": "*" @@ -10506,10 +9037,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "2.9.0", @@ -10565,12 +9099,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -10629,13 +9162,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "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/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/mocha/node_modules/emoji-regex": { @@ -10680,16 +9215,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10750,6 +9275,15 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/minimatch/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": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11053,9 +9587,9 @@ } }, "node_modules/node-interval-tree": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", - "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.1.2.tgz", + "integrity": "sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA==", "dev": true, "dependencies": { "shallowequal": "^1.1.0" @@ -11223,15 +9757,15 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, "dependencies": { - "array.prototype.reduce": "^1.0.4", + "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.8" @@ -11241,14 +9775,14 @@ } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11272,6 +9806,18 @@ "http-https": "^1.0.0" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -11457,9 +10003,9 @@ } }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "dependencies": { "entities": "^4.4.0" @@ -11646,9 +10192,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -11698,33 +10244,6 @@ "node": ">=8" } }, - "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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prettier-plugin-solidity/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11757,12 +10276,6 @@ "node": ">=8" } }, - "node_modules/prettier-plugin-solidity/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/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11788,9 +10301,9 @@ } }, "node_modules/promise": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", - "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "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": { "asap": "~2.0.6" @@ -11849,14 +10362,20 @@ } }, "node_modules/pure-rand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", - "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] }, "node_modules/qs": { "version": "6.11.0", @@ -11920,9 +10439,9 @@ } }, "node_modules/rambda": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz", - "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", + "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", "dev": true }, "node_modules/randombytes": { @@ -12082,33 +10601,21 @@ } }, "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "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": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": ">=6.0.0" } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regexp.prototype.flags": { @@ -12522,6 +11029,20 @@ } ] }, + "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": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12649,9 +11170,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -12726,27 +11247,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", @@ -13798,9 +12298,9 @@ } }, "node_modules/solidity-ast": { - "version": "0.4.35", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.35.tgz", - "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", + "version": "0.4.39", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.39.tgz", + "integrity": "sha512-91d4HMzV9x3ZG1fXRtAFFq2UjJrQXkyWdrmzXqBlueOSGB+v+0+iiLfZIPnTE0apndG2zm23qkZQJf8IbRrf7w==", "dev": true }, "node_modules/solidity-comments": { @@ -14539,13 +13039,13 @@ } }, "node_modules/solidity-docgen": { - "version": "0.6.0-beta.29", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", - "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", + "version": "0.6.0-beta.32", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.32.tgz", + "integrity": "sha512-LGcosbgqxrqTo9winVq3+Xz1shS9k4p+RKwqPVPI0HtjfsKF9Mc5GzBzOUhce9uwzy0yJfhf832whfY1UKt4Aw==", "dev": true, "dependencies": { "handlebars": "^4.7.7", - "solidity-ast": "^0.4.31" + "solidity-ast": "^0.4.38" }, "peerDependencies": { "hardhat": "^2.8.0" @@ -14673,6 +13173,15 @@ "node": ">=8" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -14682,6 +13191,15 @@ "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/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -14714,28 +13232,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "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==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14882,9 +13400,9 @@ } }, "node_modules/swarm-js/node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "dependencies": { "@sindresorhus/is": "^4.0.0", @@ -14961,9 +13479,9 @@ } }, "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -14977,9 +13495,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -15223,18 +13741,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -15339,9 +13845,9 @@ } }, "node_modules/uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, "bin": { @@ -15373,16 +13879,19 @@ } }, "node_modules/underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "node_modules/undici": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", - "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", + "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, "engines": { "node": ">=12.18" } @@ -15436,9 +13945,9 @@ "dev": true }, "node_modules/utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15455,16 +13964,15 @@ "dev": true }, "node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -15538,28 +14046,28 @@ } }, "node_modules/web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15578,56 +14086,56 @@ "dev": true }, "node_modules/web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", "dev": true, "dependencies": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", "dev": true, "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", "dev": true, "dependencies": { "eventemitter3": "4.0.4" @@ -15637,29 +14145,29 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", "dev": true, "dependencies": { "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" }, "engines": { "node": ">=8.0.0" @@ -15672,67 +14180,67 @@ "dev": true }, "node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true, "engines": { "node": "*" } }, "node_modules/web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", "dev": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", "dev": true, "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" @@ -15750,61 +14258,60 @@ } }, "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "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.", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", "dev": true, "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", "dev": true, "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" @@ -15817,17 +14324,17 @@ "dev": true }, "node_modules/web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", "dev": true, "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" @@ -15840,55 +14347,55 @@ "dev": true }, "node_modules/web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", "dev": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", "dev": true, "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", "dev": true, "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", + "web3-core-helpers": "1.8.1", "websocket": "^1.0.32" }, "engines": { @@ -15896,25 +14403,25 @@ } }, "node_modules/web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", "dev": true, "dependencies": { "bn.js": "^5.2.1", @@ -16021,17 +14528,17 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -16267,18 +14774,18 @@ "dev": true }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "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.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -16403,9 +14910,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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==", "dev": true }, "@babel/highlight": { @@ -16478,12 +14985,12 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@ensdomains/address-encoder": { @@ -16531,9 +15038,9 @@ }, "dependencies": { "ethers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.0.tgz", - "integrity": "sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, "requires": { "@ethersproject/abi": "5.7.0", @@ -16551,10 +15058,10 @@ "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.0", + "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.0", + "@ethersproject/providers": "5.7.2", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", @@ -16564,7 +15071,7 @@ "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.0", + "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } } @@ -16594,23 +15101,23 @@ } }, "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", "dev": true, "requires": { "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "ethereumjs-util": "^7.1.1" } }, "@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", "dev": true, "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" } }, "@ethersproject/abi": { @@ -16828,9 +15335,9 @@ "dev": true }, "@ethersproject/networks": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.0.tgz", - "integrity": "sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" @@ -16856,9 +15363,9 @@ } }, "@ethersproject/providers": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.0.tgz", - "integrity": "sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", @@ -17022,9 +15529,9 @@ } }, "@ethersproject/web": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.0.tgz", - "integrity": "sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", @@ -17301,99 +15808,99 @@ } }, "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", - "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz", + "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==", "dev": true, "requires": { "ethereumjs-util": "^7.1.4" } }, "@nomicfoundation/solidity-analyzer": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz", - "integrity": "sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", + "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", "dev": true, "requires": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.0.3", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.0.3", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.0.3", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.0.3" + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" } }, "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz", - "integrity": "sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", + "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz", - "integrity": "sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", + "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz", - "integrity": "sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", + "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz", - "integrity": "sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", + "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz", - "integrity": "sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", + "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz", - "integrity": "sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", + "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz", - "integrity": "sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", + "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz", - "integrity": "sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", + "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz", - "integrity": "sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", + "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz", - "integrity": "sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", + "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", "dev": true, "optional": true }, @@ -17636,53 +16143,30 @@ } }, "@truffle/abi-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.1.tgz", - "integrity": "sha512-tieaDgwDm2IH1wJuVF/waREVFvzXHSF6AkQfd71DQwpwnrl/9I1iKu+1WpQyFqxu+6WMfCYhzMEbssQBt4Zniw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", + "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", "dev": true, "requires": { "change-case": "3.0.2", "fast-check": "3.1.1", - "web3-utils": "1.7.4" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } + "web3-utils": "1.8.1" } }, "@truffle/blockchain-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz", - "integrity": "sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", + "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", "dev": true }, "@truffle/codec": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.4.tgz", - "integrity": "sha512-il9dFzALUbd1JMPOVcxnIjTQ1fiJEPHfBYbqVQfWZfzAN0Kw+x1eaKunIU+NvrNRycvkXk4itWUTui5sMlXBBA==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", + "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", "dev": true, "requires": { - "@truffle/abi-utils": "^0.3.1", - "@truffle/compile-common": "^0.8.0", + "@truffle/abi-utils": "^0.3.6", + "@truffle/compile-common": "^0.9.1", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -17690,7 +16174,7 @@ "lodash": "^4.17.21", "semver": "7.3.7", "utf8": "^3.0.0", - "web3-utils": "1.7.4" + "web3-utils": "1.8.1" }, "dependencies": { "bn.js": { @@ -17699,27 +16183,36 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "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, "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "yallist": "^4.0.0" } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@truffle/compile-common": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.8.0.tgz", - "integrity": "sha512-3mtEC73dQODTI3/ZwonunVHyPS2BGexXSBIv4pOgMrWwnZPcHlo2+IW2+m2At/DnZehL78bkF993Vti2pJfx6Q==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", + "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", "dev": true, "requires": { "@truffle/error": "^0.1.1", @@ -17746,657 +16239,12 @@ "web3-core-promievent": "1.8.1", "web3-eth-abi": "1.8.1", "web3-utils": "1.8.1" - }, - "dependencies": { - "@truffle/abi-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", - "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", - "dev": true, - "requires": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.8.1" - } - }, - "@truffle/blockchain-utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", - "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==", - "dev": true - }, - "@truffle/codec": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", - "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", - "dev": true, - "requires": { - "@truffle/abi-utils": "^0.3.6", - "@truffle/compile-common": "^0.9.1", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.8.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "@truffle/compile-common": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", - "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", - "dev": true, - "requires": { - "@truffle/error": "^0.1.1", - "colors": "1.4.0" - } - }, - "@truffle/contract-schema": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", - "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", - "dev": true, - "requires": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - } - }, - "@truffle/debug-utils": { - "version": "6.0.42", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", - "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", - "dev": true, - "requires": { - "@truffle/codec": "^0.14.11", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.5" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", - "dev": true, - "requires": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - }, - "web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" - } - }, - "web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" - } - }, - "web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", - "dev": true, - "requires": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" - } - }, - "web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" - } - }, - "web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" - } - } - } - }, - "web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "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 - }, - "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "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 - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - } - } - }, - "web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", - "dev": true, - "requires": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" - } - }, - "web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.8.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - } } }, "@truffle/contract-schema": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.9.tgz", - "integrity": "sha512-nhYMXWbUs6dMYHL1f8DTkRk/uo1sADK0yeSYXo/p/7nqnjlHzqrr75BBsKbB7OFIVT05des+GFNQJqBaRZVdxQ==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", + "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", "dev": true, "requires": { "ajv": "^6.10.0", @@ -18404,12 +16252,12 @@ } }, "@truffle/debug-utils": { - "version": "6.0.34", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.34.tgz", - "integrity": "sha512-GbGnC9ESJXYHjzQKOV6yeFzvXDnW1yIvpfHXyc4PMDnnFoqX2OxP8mGmMzFKW2Uhqg89wl4GMPLuxycMkodWrw==", + "version": "6.0.42", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", + "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", "dev": true, "requires": { - "@truffle/codec": "^0.14.4", + "@truffle/codec": "^0.14.11", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -18498,505 +16346,11 @@ "web3": "1.8.1" }, "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true - }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "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 - } - } - }, - "web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", - "dev": true, - "requires": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - }, - "web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", - "dev": true, - "requires": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" - } - }, - "web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" - } - }, - "web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" - } - }, - "web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", - "dev": true, - "requires": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.8.1" - } - }, - "web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" - } - }, - "web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" - } - }, - "web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" - } - }, - "web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", - "dev": true, - "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" - } - }, - "web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "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 - }, - "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "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 - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - } - } } } }, @@ -19099,21 +16453,21 @@ } }, "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "requires": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", "dev": true }, "@types/concat-stream": { @@ -19178,9 +16532,9 @@ "dev": true }, "@types/node": { - "version": "18.7.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.17.tgz", - "integrity": "sha512-0UyfUnt02zIuqp7yC8RYtDkp/vo8bFaQ13KkSEvUAohPOAlnVNbj5Fi3fgPSuwzakS+EvvnnZ4x9y7i6ASaSPQ==", + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", "dev": true }, "@types/pbkdf2": { @@ -19216,12 +16570,6 @@ "@types/node": "*" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -19238,9 +16586,9 @@ } }, "abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", "dev": true }, "abstract-level": { @@ -19294,9 +16642,9 @@ "requires": {} }, "address": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", - "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true }, "adm-zip": { @@ -19400,9 +16748,9 @@ "dev": true }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -19425,15 +16773,15 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -19450,26 +16798,26 @@ "dev": true }, "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "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==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } @@ -19630,18 +16978,18 @@ "dev": true }, "bigint-crypto-utils": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz", - "integrity": "sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", + "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", "dev": true, "requires": { "bigint-mod-arith": "^3.1.0" } }, "bigint-mod-arith": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz", - "integrity": "sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", "dev": true }, "bignumber.js": { @@ -19675,9 +17023,9 @@ "dev": true }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", @@ -19688,7 +17036,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -19708,24 +17056,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } } } }, @@ -19913,14 +17243,23 @@ "dev": true }, "bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "dev": true, "requires": { "node-gyp-build": "^4.3.0" } }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "requires": { + "streamsearch": "^1.1.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -20046,22 +17385,22 @@ }, "dependencies": { "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true } } }, "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -20273,13 +17612,13 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "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, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "dependencies": { @@ -20693,9 +18032,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.1.tgz", - "integrity": "sha512-XZHyaFJ6QMWhYmlz+UcmtaLeecNiXwkTGzCqG5WByt+1P1HnU6Siwf0TeP3OsZmlnGqQRSEMIxue0LLCaGY3dw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "decompress-response": { @@ -20716,9 +18055,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -20781,30 +18120,13 @@ "dev": true }, "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, "requires": { "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "debug": "4" } }, "diff": { @@ -20994,22 +18316,23 @@ } }, "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -21019,8 +18342,9 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" } }, @@ -21388,9 +18712,9 @@ }, "dependencies": { "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "semver": { @@ -22287,14 +19611,14 @@ } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -22313,7 +19637,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -22340,50 +19664,11 @@ "ms": "2.0.0" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true } } }, @@ -22474,9 +19759,9 @@ "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -22517,6 +19802,38 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -22550,9 +19867,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { @@ -22819,9 +20136,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -22880,9 +20197,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -22919,13 +20236,22 @@ } }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", @@ -23006,24 +20332,24 @@ } }, "hardhat": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz", - "integrity": "sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==", + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.4.tgz", + "integrity": "sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0-rc.3", - "@nomicfoundation/ethereumjs-common": "^3.0.0-rc.3", - "@nomicfoundation/ethereumjs-evm": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0-rc.3", - "@nomicfoundation/ethereumjs-trie": "^5.0.0-rc.3", - "@nomicfoundation/ethereumjs-tx": "^4.0.0-rc.3", - "@nomicfoundation/ethereumjs-util": "^8.0.0-rc.3", - "@nomicfoundation/ethereumjs-vm": "^6.0.0-rc.3", - "@nomicfoundation/solidity-analyzer": "^0.0.3", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", "@types/lru-cache": "^5.1.0", @@ -23291,9 +20617,9 @@ } }, "hardhat-ignore-warnings": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.0.tgz", - "integrity": "sha512-fetYwdpjAg6pl7oxOAL0yZQTKt/87KgDV5P7sEoIORXaoqCBvRGcGAQLJZ8hCiWNZ+vZKYw/9oVVZVlFcOxZTw==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.6.tgz", + "integrity": "sha512-GQgvjprONI8VF8b85+QJ8H9v3L9TCCtQvUx+9QaRL+sCPw1cOZHfhlEz9V6Lq7GNCQMqBORVzNzUzoP/tKAEQQ==", "dev": true, "requires": { "minimatch": "^5.1.0", @@ -23311,9 +20637,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -23479,14 +20805,6 @@ "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } } }, "http-https": { @@ -23524,9 +20842,9 @@ } }, "http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, "requires": { "quick-lru": "^5.1.1", @@ -23574,9 +20892,9 @@ "dev": true }, "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", + "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==", "dev": true }, "import-fresh": { @@ -23724,12 +21042,12 @@ } }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -23812,15 +21130,15 @@ "dev": true }, "is-callable": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.5.tgz", - "integrity": "sha512-ZIWRujF6MvYGkEuHMYtFRkL2wAtFw89EHfKlXrkPkjQZZRWeh9L1q3SV13NIfHnqxugjLvAOkEHx9mb1zcMnEw==", + "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 }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -23963,15 +21281,15 @@ } }, "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "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==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, @@ -24093,6 +21411,15 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -24161,9 +21488,9 @@ } }, "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -24354,9 +21681,9 @@ } }, "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dev": true, "requires": { "get-func-name": "^2.0.0" @@ -24470,9 +21797,9 @@ }, "dependencies": { "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true } } @@ -24567,9 +21894,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "minipass": { @@ -24619,12 +21946,11 @@ } }, "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -24666,13 +21992,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "emoji-regex": { @@ -24705,16 +22033,6 @@ "path-is-absolute": "^1.0.0" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -24757,6 +22075,17 @@ "dev": true, "requires": { "brace-expansion": "^2.0.1" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + } } }, "ms": { @@ -25007,9 +22336,9 @@ "dev": true }, "node-interval-tree": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.0.1.tgz", - "integrity": "sha512-KodzC8le4U8LOmCvn1wSyIY8eplzRSjsLMzs0EjLteCXWDjRpCTzrjtQ4t8jh3w3r6OIglha1zChzjRYMVwuLA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-interval-tree/-/node-interval-tree-2.1.2.tgz", + "integrity": "sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA==", "dev": true, "requires": { "shallowequal": "^1.1.0" @@ -25132,26 +22461,26 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, "requires": { - "array.prototype.reduce": "^1.0.4", + "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obliterator": { @@ -25169,6 +22498,15 @@ "http-https": "^1.0.0" } }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -25315,9 +22653,9 @@ } }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "requires": { "entities": "^4.4.0" @@ -25459,9 +22797,9 @@ "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, "prettier-plugin-solidity": { @@ -25490,24 +22828,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -25535,12 +22855,6 @@ "requires": { "ansi-regex": "^5.0.1" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -25563,9 +22877,9 @@ "dev": true }, "promise": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", - "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "requires": { "asap": "~2.0.6" @@ -25618,9 +22932,9 @@ "dev": true }, "pure-rand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.3.tgz", - "integrity": "sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", "dev": true }, "qs": { @@ -25656,9 +22970,9 @@ "dev": true }, "rambda": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.2.1.tgz", - "integrity": "sha512-Wswj8ZvzdI3VhaGPkZAxaCTwuMmGtgWt7Zxsgyo4P+iTmVnkojvyWaOep5q3ZjMIecW0wtQa66GWxaKkZ24RAA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", + "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", "dev": true }, "randombytes": { @@ -25789,29 +23103,18 @@ } }, "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "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, "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "minimatch": "^3.0.5" } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regexp.prototype.flags": { @@ -26096,6 +23399,17 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "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, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -26199,9 +23513,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26267,21 +23581,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true } } }, @@ -27114,9 +24413,9 @@ } }, "solidity-ast": { - "version": "0.4.35", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.35.tgz", - "integrity": "sha512-F5bTDLh3rmDxRmLSrs3qt3nvxJprWSEkS7h2KmuXDx7XTfJ6ZKVTV1rtPIYCqJAuPsU/qa8YUeFn7jdOAZcTPA==", + "version": "0.4.39", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.39.tgz", + "integrity": "sha512-91d4HMzV9x3ZG1fXRtAFFq2UjJrQXkyWdrmzXqBlueOSGB+v+0+iiLfZIPnTE0apndG2zm23qkZQJf8IbRrf7w==", "dev": true }, "solidity-comments": { @@ -27645,13 +24944,13 @@ } }, "solidity-docgen": { - "version": "0.6.0-beta.29", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.29.tgz", - "integrity": "sha512-63p3w6wj1WFhhC8pXTI3bz5qUTFuGmLNHFnwwpjZ6Qv8dF2WGDt0pg1rbA6c3bL/A4d0ATN66Mte1saGKVWdHg==", + "version": "0.6.0-beta.32", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.32.tgz", + "integrity": "sha512-LGcosbgqxrqTo9winVq3+Xz1shS9k4p+RKwqPVPI0HtjfsKF9Mc5GzBzOUhce9uwzy0yJfhf832whfY1UKt4Aw==", "dev": true, "requires": { "handlebars": "^4.7.7", - "solidity-ast": "^0.4.31" + "solidity-ast": "^0.4.38" } }, "source-map": { @@ -27762,12 +25061,24 @@ } } }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, "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 }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -27794,25 +25105,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "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==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -27922,9 +25233,9 @@ } }, "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", @@ -27985,9 +25296,9 @@ } }, "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -27998,9 +25309,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -28201,17 +25512,6 @@ "json5": "^1.0.1", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "tslib": { @@ -28300,9 +25600,9 @@ } }, "uglify-js": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.0.tgz", - "integrity": "sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, @@ -28325,16 +25625,19 @@ } }, "underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "undici": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", - "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", - "dev": true + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", + "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", + "dev": true, + "requires": { + "busboy": "^1.6.0" + } }, "universalify": { "version": "0.1.2", @@ -28379,9 +25682,9 @@ "dev": true }, "utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "dev": true, "requires": { "node-gyp-build": "^4.3.0" @@ -28394,16 +25697,15 @@ "dev": true }, "util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", "which-typed-array": "^1.1.2" } }, @@ -28465,24 +25767,24 @@ } }, "web3": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.5.tgz", - "integrity": "sha512-3jHZTWyXt975AOXgnZKayiSWDLpoSKk9fZtLk1hURQtt7AdSbXPT8AK9ooBCm0Dt3GYaOeNcHGaiHC3gtyqhLg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", + "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", "dev": true, "requires": { - "web3-bzz": "1.7.5", - "web3-core": "1.7.5", - "web3-eth": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-shh": "1.7.5", - "web3-utils": "1.7.5" + "web3-bzz": "1.8.1", + "web3-core": "1.8.1", + "web3-eth": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-shh": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-bzz": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.5.tgz", - "integrity": "sha512-Z53sY0YK/losqjJncmL4vP0zZI9r6tiXg6o7R6e1JD2Iy7FH3serQvU+qXmPjqEBzsnhf8wTG+YcBPB3RHpr0Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", + "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", "dev": true, "requires": { "@types/node": "^12.12.6", @@ -28499,18 +25801,18 @@ } }, "web3-core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.5.tgz", - "integrity": "sha512-UgOWXZr1fR/3cUQJKWbfMwRxj1/N7o6RSd/dHqdXBlOD+62EjNZItFmLRg5veq5kp9YfXzrNw9bnDkXfsL+nKQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", + "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-requestmanager": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-requestmanager": "1.8.1", + "web3-utils": "1.8.1" }, "dependencies": { "@types/node": { @@ -28520,115 +25822,115 @@ "dev": true }, "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "dev": true } } }, "web3-core-helpers": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.5.tgz", - "integrity": "sha512-lDDjTks6Q6aNUO87RYrY2xub3UWTKr/RIWxpHJODEqkLxZS1dWdyliJ6aIx3031VQwsNT5HE7NvABe/t0p3iDQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", + "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", "dev": true, "requires": { - "web3-eth-iban": "1.7.5", - "web3-utils": "1.7.5" + "web3-eth-iban": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-core-method": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.5.tgz", - "integrity": "sha512-ApTvq1Llzlbxmy0n4L7QaE6NodIsR80VJqk8qN4kLg30SGznt/pNJFebryLI2kpyDmxSgj1TjEWzmHJBp6FhYg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", + "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-utils": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-core-promievent": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.5.tgz", - "integrity": "sha512-uZ1VRErVuhiLtHlyt3oEH/JSvAf6bWPndChHR9PG7i1Zfqm6ZVCeM91ICTPmiL8ddsGQOxASpnJk4vhApcTIww==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", + "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", "dev": true, "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.5.tgz", - "integrity": "sha512-3KpfxW/wVH4mgwWEsSJGHKrtRVoijWlDxtUrm17xgtqRNZ2mFolifKnHAUKa0fY48C9CrxmcCiMIi3W4G6WYRw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", + "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", "dev": true, "requires": { "util": "^0.12.0", - "web3-core-helpers": "1.7.5", - "web3-providers-http": "1.7.5", - "web3-providers-ipc": "1.7.5", - "web3-providers-ws": "1.7.5" + "web3-core-helpers": "1.8.1", + "web3-providers-http": "1.8.1", + "web3-providers-ipc": "1.8.1", + "web3-providers-ws": "1.8.1" } }, "web3-core-subscriptions": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.5.tgz", - "integrity": "sha512-YK6utQ7Wwjbe4XZOIA8quWGBPi1lFDS1A+jQYwxKKrCvm6BloBNc3FhvrcSYlDhLe/kOy8+2Je8i9amndgT4ww==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", + "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" } }, "web3-eth": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.5.tgz", - "integrity": "sha512-BucjvqZyDWYkGlsFX+OnOBub0YutlC1KZiNGibdmvtNX0NQK+8iw1uzAoL9yTTwCSszL7lnkFe8N+HCOl9B4Dw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", + "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-accounts": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-eth-ens": "1.7.5", - "web3-eth-iban": "1.7.5", - "web3-eth-personal": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-accounts": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-eth-ens": "1.8.1", + "web3-eth-iban": "1.8.1", + "web3-eth-personal": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-eth-abi": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.5.tgz", - "integrity": "sha512-qWHvF7sayxql9BD1yqK9sZRLBQ66eJzGeaU53Y1PRq2iFPrhY6NUWxQ3c3ps0rg+dyObvRbloviWpKXcS4RE/A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", + "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.5" + "web3-utils": "1.8.1" } }, "web3-eth-accounts": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.5.tgz", - "integrity": "sha512-AzMLoTj3RGwKpyp3x3TtHrEeU4VpR99iMOD6NKrWSDumS6QEi0lCo+y7QZhdTlINw3iIA3SFIdvbAOO4NCHSDg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", + "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", "dev": true, "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", "ethereumjs-util": "^7.0.10", "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "uuid": "^9.0.0", + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" }, "dependencies": { "eth-lib": { @@ -28643,53 +25945,53 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true } } }, "web3-eth-contract": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.5.tgz", - "integrity": "sha512-qab7NPJRKRlTs58ozsqK8YIEwWpxIm3vD/okSIKBGkFx5gIHWW+vGmMh5PDSfefLJM9rCd+T+Lc0LYvtME7uqg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", + "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-eth-ens": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.5.tgz", - "integrity": "sha512-k1Q0msdRv/wac2egpZBIwG3n/sa/KdrVmVJvFm471gLTL4xfUizV5qJjkDVf+ikf9JyDvWJTs5eWNUUbOFIw/A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", + "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-promievent": "1.7.5", - "web3-eth-abi": "1.7.5", - "web3-eth-contract": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-promievent": "1.8.1", + "web3-eth-abi": "1.8.1", + "web3-eth-contract": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-eth-iban": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.5.tgz", - "integrity": "sha512-mn2W5t/1IpL8OZvzAabLKT4kvwRnZSJ9K0tctndl9sDNWkfITYQibEEhUaNNA50Q5fJKgVudHI/m0gwIVTyG8Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", + "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", "dev": true, "requires": { "bn.js": "^5.2.1", - "web3-utils": "1.7.5" + "web3-utils": "1.8.1" }, "dependencies": { "bn.js": { @@ -28701,17 +26003,17 @@ } }, "web3-eth-personal": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.5.tgz", - "integrity": "sha512-txh2P/eN8I4AOUKFi9++KKddoD0tWfCuu9Y1Kc41jSRbk6smO88Fum0KWNmYFYhSCX2qiknS1DfqsONl3igoKQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", + "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", "dev": true, "requires": { "@types/node": "^12.12.6", - "web3-core": "1.7.5", - "web3-core-helpers": "1.7.5", - "web3-core-method": "1.7.5", - "web3-net": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-helpers": "1.8.1", + "web3-core-method": "1.8.1", + "web3-net": "1.8.1", + "web3-utils": "1.8.1" }, "dependencies": { "@types/node": { @@ -28723,65 +26025,65 @@ } }, "web3-net": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.5.tgz", - "integrity": "sha512-xwuCb2YWw49PmW81AJQ/G+Xi2ikRsYyZXSgyPt4LmZuKjiqg/6kSdK8lZvUi3Pi3wM+QDBXbpr73M/WEkW0KvA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", + "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-utils": "1.7.5" + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-utils": "1.8.1" } }, "web3-providers-http": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.5.tgz", - "integrity": "sha512-vPgr4Kzy0M3CHtoP/Bh7qwK/D9h2fhjpoqctdMWVJseOfeTgfOphCKN0uwV8w2VpZgDPXA8aeTdBx5OjmDdStA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", + "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", "dev": true, "requires": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" } }, "web3-providers-ipc": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.5.tgz", - "integrity": "sha512-aNHx+RAROzO+apDEzy8Zncj78iqWBadIXtpmFDg7uiTn8i+oO+IcP1Yni7jyzkltsysVJHgHWG4kPx50ANCK3Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", + "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", "dev": true, "requires": { "oboe": "2.1.5", - "web3-core-helpers": "1.7.5" + "web3-core-helpers": "1.8.1" } }, "web3-providers-ws": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.5.tgz", - "integrity": "sha512-9uJNVVkIGC8PmM9kNbgPth56HDMSSsxZh3ZEENdwO3LNWemaADiQYUDCsD/dMVkn0xsGLHP5dgAy4Q5msqySLg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", + "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.5", + "web3-core-helpers": "1.8.1", "websocket": "^1.0.32" } }, "web3-shh": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.5.tgz", - "integrity": "sha512-aCIWJyLMH5H76OybU4ZpUCJ93yNOPATGhJ+KboRPU8QZDzS2CcVhtEzyl27bbvw+rSnVroMLqBgTXBB4mmKI7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", + "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", "dev": true, "requires": { - "web3-core": "1.7.5", - "web3-core-method": "1.7.5", - "web3-core-subscriptions": "1.7.5", - "web3-net": "1.7.5" + "web3-core": "1.8.1", + "web3-core-method": "1.8.1", + "web3-core-subscriptions": "1.8.1", + "web3-net": "1.8.1" } }, "web3-utils": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.5.tgz", - "integrity": "sha512-9AqNOziQky4wNQadEwEfHiBdOZqopIHzQQVzmvvv6fJwDSMhP+khqmAZC7YTiGjs0MboyZ8tWNivqSO1699XQw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", + "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -28877,17 +26179,17 @@ "dev": true }, "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "is-typed-array": "^1.1.10" } }, "wide-align": { @@ -29063,18 +26365,18 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "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.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { "ansi-regex": { From f799475d930b4e26477b7c09140e9859177fcda3 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 28 Dec 2022 17:02:40 -0300 Subject: [PATCH 096/197] Fix links to Wizard (#3901) --- docs/modules/ROOT/pages/erc1155.adoc | 2 +- docs/modules/ROOT/pages/erc20.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/ROOT/pages/erc1155.adoc b/docs/modules/ROOT/pages/erc1155.adoc index 0ca933865..b47d7a072 100644 --- a/docs/modules/ROOT/pages/erc1155.adoc +++ b/docs/modules/ROOT/pages/erc1155.adoc @@ -150,4 +150,4 @@ A preset ERC1155 is available, https://github.com/OpenZeppelin/openzeppelin-cont This contract is ready to deploy without having to write any Solidity code. It can be used as-is for quick prototyping and testing, but is also suitable for production environments. -NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. +NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. diff --git a/docs/modules/ROOT/pages/erc20.adoc b/docs/modules/ROOT/pages/erc20.adoc index bcb510c51..168b02493 100644 --- a/docs/modules/ROOT/pages/erc20.adoc +++ b/docs/modules/ROOT/pages/erc20.adoc @@ -82,4 +82,4 @@ A preset ERC20 is available, https://github.com/OpenZeppelin/openzeppelin-contra This contract is ready to deploy without having to write any Solidity code. It can be used as-is for quick prototyping and testing, but is also suitable for production environments. -NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. +NOTE: Contract presets are now deprecated in favor of https://wizard.openzeppelin.com[Contracts Wizard] as a more powerful alternative. From 7a6a9d1516218739b0159cd88d6ce3a287052f0b Mon Sep 17 00:00:00 2001 From: Matteo Casonato Date: Wed, 28 Dec 2022 22:23:24 +0100 Subject: [PATCH 097/197] Add Strings.equal (#3774) Co-authored-by: Francisco --- CHANGELOG.md | 1 + contracts/mocks/StringsMock.sol | 4 ++++ contracts/utils/Strings.sol | 7 +++++++ test/utils/Strings.test.js | 25 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d95b79934..58bec1469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) + * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) ### Deprecations diff --git a/contracts/mocks/StringsMock.sol b/contracts/mocks/StringsMock.sol index 90a6c94b3..81389fad4 100644 --- a/contracts/mocks/StringsMock.sol +++ b/contracts/mocks/StringsMock.sol @@ -20,4 +20,8 @@ contract StringsMock { function toHexString(address addr) public pure returns (string memory) { return Strings.toHexString(addr); } + + function equal(string memory a, string memory b) public pure returns (bool) { + return Strings.equal(a, b); + } } diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index 76aa3640a..e7597f12e 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -67,4 +67,11 @@ library Strings { function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } + + /** + * @dev Returns true if the two strings are equal. + */ + function equal(string memory a, string memory b) internal pure returns (bool) { + return keccak256(bytes(a)) == keccak256(bytes(b)); + } } diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index 7abc859ff..db9e25438 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -83,4 +83,29 @@ contract('Strings', function (accounts) { expect(await this.strings.methods['toHexString(address)'](addr)).to.equal(addr); }); }); + + describe('equal', function () { + it('compares two empty strings', async function () { + expect(await this.strings.methods['equal(string,string)']('', '')).to.equal(true); + }); + + it('compares two equal strings', async function () { + expect(await this.strings.methods['equal(string,string)']('a', 'a')).to.equal(true); + }); + + it('compares two different strings', async function () { + expect(await this.strings.methods['equal(string,string)']('a', 'b')).to.equal(false); + }); + + it('compares two different strings of different lengths', async function () { + expect(await this.strings.methods['equal(string,string)']('a', 'aa')).to.equal(false); + expect(await this.strings.methods['equal(string,string)']('aa', 'a')).to.equal(false); + }); + + it('compares two different strings of different (big) lengths', async function () { + const str1 = 'a'.repeat(201); + const str2 = 'a'.repeat(200) + 'b'; + expect(await this.strings.methods['equal(string,string)'](str1, str2)).to.equal(false); + }); + }); }); From 96ff934ad099505bfe985e2175b7b2637f06f900 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Wed, 28 Dec 2022 23:34:44 +0100 Subject: [PATCH 098/197] Update `forge-std` submodule to `v1.2.0` (#3885) Signed-off-by: Pascal Marco Caversaccio --- lib/forge-std | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/forge-std b/lib/forge-std index ca8d6e00e..eb980e1d4 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit ca8d6e00ea9cb035f6856ff732203c9a3c48b966 +Subproject commit eb980e1d4f0e8173ec27da77297ae411840c8ccb From 8335676b0e99944eef6a742e16dcd9ff6e68e609 Mon Sep 17 00:00:00 2001 From: ganone <89295500+galadd@users.noreply.github.com> Date: Wed, 28 Dec 2022 14:46:52 -0800 Subject: [PATCH 099/197] Add Strings.toString for signed integers (#3773) Co-authored-by: Hadrien Croubois Co-authored-by: Gbolahan <89295500+GbolahanAnon@users.noreply.github.com> Co-authored-by: Francisco Giordano --- CHANGELOG.md | 1 + contracts/mocks/StringsMock.sol | 4 ++++ contracts/utils/Strings.sol | 8 +++++++ test/utils/Strings.test.js | 42 ++++++++++++++++++++++++++++----- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58bec1469..5549260a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) + * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) ### Deprecations diff --git a/contracts/mocks/StringsMock.sol b/contracts/mocks/StringsMock.sol index 81389fad4..9f98e2778 100644 --- a/contracts/mocks/StringsMock.sol +++ b/contracts/mocks/StringsMock.sol @@ -9,6 +9,10 @@ contract StringsMock { return Strings.toString(value); } + function toString(int256 value) public pure returns (string memory) { + return Strings.toString(value); + } + function toHexString(uint256 value) public pure returns (string memory) { return Strings.toHexString(value); } diff --git a/contracts/utils/Strings.sol b/contracts/utils/Strings.sol index e7597f12e..3a037f477 100644 --- a/contracts/utils/Strings.sol +++ b/contracts/utils/Strings.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import "./math/Math.sol"; +import "./math/SignedMath.sol"; /** * @dev String operations. @@ -37,6 +38,13 @@ library Strings { } } + /** + * @dev Converts a `int256` to its ASCII `string` decimal representation. + */ + function toString(int256 value) internal pure returns (string memory) { + return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); + } + /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index db9e25438..67e414e44 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -10,7 +10,7 @@ contract('Strings', function (accounts) { }); describe('toString', function () { - for (const [ key, value ] of Object.entries([ + const values = [ '0', '7', '10', @@ -29,13 +29,43 @@ contract('Strings', function (accounts) { '12345678901234567890123456789012345678901234567890', '123456789012345678901234567890123456789012345678901234567890', '1234567890123456789012345678901234567890123456789012345678901234567890', - ].reduce((acc, value) => Object.assign(acc, { [value]: new BN(value) }), { - MAX_UINT256: constants.MAX_UINT256.toString(), - }))) { - it(`converts ${key}`, async function () { + ]; + + describe('uint256', function () { + it('converts MAX_UINT256', async function () { + const value = constants.MAX_UINT256; expect(await this.strings.methods['toString(uint256)'](value)).to.equal(value.toString(10)); }); - } + + for (const value of values) { + it(`converts ${value}`, async function () { + expect(await this.strings.methods['toString(uint256)'](value)).to.equal(value); + }); + } + }); + + describe('int256', function () { + it('converts MAX_INT256', async function () { + const value = constants.MAX_INT256; + expect(await this.strings.methods['toString(int256)'](value)).to.equal(value.toString(10)); + }); + + it('converts MIN_INT256', async function () { + const value = constants.MIN_INT256; + expect(await this.strings.methods['toString(int256)'](value)).to.equal(value.toString(10)); + }); + + for (const value of values) { + it(`convert ${value}`, async function () { + expect(await this.strings.methods['toString(int256)'](value)).to.equal(value); + }); + + it(`convert negative ${value}`, async function () { + const negated = new BN(value).neg(); + expect(await this.strings.methods['toString(int256)'](negated)).to.equal(negated.toString(10)); + }); + } + }); }); describe('toHexString', function () { From cafe5eb985cee6d4c51a40957c8b0e945dbd4136 Mon Sep 17 00:00:00 2001 From: robriks <80549215+robriks@users.noreply.github.com> Date: Wed, 28 Dec 2022 18:07:29 -0500 Subject: [PATCH 100/197] Update blurb on GovernorVotes compatibility (#3764) --- contracts/governance/README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/governance/README.adoc b/contracts/governance/README.adoc index f711c63cf..9bfa64fea 100644 --- a/contracts/governance/README.adoc +++ b/contracts/governance/README.adoc @@ -20,7 +20,7 @@ For a written walkthrough, check out our guide on xref:ROOT:governance.adoc[How Votes modules determine the source of voting power, and sometimes quorum number. -* {GovernorVotes}: Extracts voting weight from an {ERC20Votes} token. +* {GovernorVotes}: Extracts voting weight from an {ERC20Votes}, or since v4.5 an {ERC721Votes} token. * {GovernorVotesComp}: Extracts voting weight from a COMP-like or {ERC20VotesComp} token. From b0db207e4e542ac6bc868ec25a99938ea8d88883 Mon Sep 17 00:00:00 2001 From: Pierre Grimaud Date: Thu, 29 Dec 2022 00:16:56 +0100 Subject: [PATCH 101/197] Fix typos in testing files (#3899) --- contracts/mocks/MultipleInheritanceInitializableMocks.sol | 8 ++++---- test/governance/Governor.test.js | 6 +++--- .../compatibility/GovernorCompatibilityBravo.test.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/mocks/MultipleInheritanceInitializableMocks.sol b/contracts/mocks/MultipleInheritanceInitializableMocks.sol index b8cf9d9d5..e79cd92c8 100644 --- a/contracts/mocks/MultipleInheritanceInitializableMocks.sol +++ b/contracts/mocks/MultipleInheritanceInitializableMocks.sol @@ -16,7 +16,7 @@ import "../proxy/utils/Initializable.sol"; // -- Child -- /** - * Sample base intializable contract that is a human + * Sample base initializable contract that is a human */ contract SampleHuman is Initializable { bool public isHuman; @@ -37,7 +37,7 @@ contract SampleHuman is Initializable { } /** - * Sample base intializable contract that defines a field mother + * Sample base initializable contract that defines a field mother */ contract SampleMother is Initializable, SampleHuman { uint256 public mother; @@ -59,7 +59,7 @@ contract SampleMother is Initializable, SampleHuman { } /** - * Sample base intializable contract that defines a field gramps + * Sample base initializable contract that defines a field gramps */ contract SampleGramps is Initializable, SampleHuman { string public gramps; @@ -81,7 +81,7 @@ contract SampleGramps is Initializable, SampleHuman { } /** - * Sample base intializable contract that defines a field father and extends from gramps + * Sample base initializable contract that defines a field father and extends from gramps */ contract SampleFather is Initializable, SampleGramps { uint256 public father; diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index bd10dcd68..b1d0b0515 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -454,7 +454,7 @@ contract('Governor', function (accounts) { await expectRevert(this.helper.propose(), 'Governor: empty proposal'); }); - it('missmatch #1', async function () { + it('mismatch #1', async function () { this.helper.setProposal({ targets: [ ], values: [ web3.utils.toWei('0') ], @@ -463,7 +463,7 @@ contract('Governor', function (accounts) { await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); }); - it('missmatch #2', async function () { + it('mismatch #2', async function () { this.helper.setProposal({ targets: [ this.receiver.address ], values: [ ], @@ -472,7 +472,7 @@ contract('Governor', function (accounts) { await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); }); - it('missmatch #3', async function () { + it('mismatch #3', async function () { this.helper.setProposal({ targets: [ this.receiver.address ], values: [ web3.utils.toWei('0') ], diff --git a/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/test/governance/compatibility/GovernorCompatibilityBravo.test.js index 79950474c..f46efd622 100644 --- a/test/governance/compatibility/GovernorCompatibilityBravo.test.js +++ b/test/governance/compatibility/GovernorCompatibilityBravo.test.js @@ -168,7 +168,7 @@ contract('GovernorCompatibilityBravo', function (accounts) { ); }); - it('double voting is forbiden', async function () { + it('double voting is forbidden', async function () { await this.helper.propose({ from: proposer }); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); From bc50d373e37a6250f931a5dba3847bc88e46797e Mon Sep 17 00:00:00 2001 From: Paul Razvan Berg Date: Thu, 29 Dec 2022 01:32:50 +0200 Subject: [PATCH 102/197] Rename approved parameter in IERC721 (#3900) Co-authored-by: Francisco --- contracts/token/ERC721/IERC721.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/token/ERC721/IERC721.sol b/contracts/token/ERC721/IERC721.sol index 646530aa5..7b60a9f51 100644 --- a/contracts/token/ERC721/IERC721.sol +++ b/contracts/token/ERC721/IERC721.sol @@ -112,7 +112,7 @@ interface IERC721 is IERC165 { * * Emits an {ApprovalForAll} event. */ - function setApprovalForAll(address operator, bool _approved) external; + function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. From cc27aed3910f3c3c67fa5ee7ababeac06e6e48a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Thu, 29 Dec 2022 13:11:15 -0600 Subject: [PATCH 103/197] Improve Strings `equal` tests (#3902) Co-authored-by: Francisco --- test/utils/Strings.test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index 67e414e44..6c4c3423b 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -132,10 +132,16 @@ contract('Strings', function (accounts) { expect(await this.strings.methods['equal(string,string)']('aa', 'a')).to.equal(false); }); - it('compares two different strings of different (big) lengths', async function () { + it('compares two different large strings', async function () { const str1 = 'a'.repeat(201); const str2 = 'a'.repeat(200) + 'b'; expect(await this.strings.methods['equal(string,string)'](str1, str2)).to.equal(false); }); + + it('compares two equal large strings', async function () { + const str1 = 'a'.repeat(201); + const str2 = 'a'.repeat(201); + expect(await this.strings.methods['equal(string,string)'](str1, str2)).to.equal(true); + }); }); }); From 2336bd3e8e050d0e81caf30e89dcc9a9106e1a1f Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 29 Dec 2022 17:08:12 -0300 Subject: [PATCH 104/197] Simplify ESLint config (#3903) --- .eslintrc | 66 +- package-lock.json | 1477 ++++++----------- package.json | 8 +- test/access/AccessControl.behavior.js | 2 +- test/proxy/Clones.test.js | 2 +- test/proxy/utils/Initializable.test.js | 2 +- test/proxy/utils/UUPSUpgradeable.test.js | 2 +- test/security/ReentrancyGuard.test.js | 2 +- test/token/ERC721/ERC721.behavior.js | 2 +- test/utils/Arrays.test.js | 2 +- test/utils/Checkpoints.test.js | 2 +- test/utils/Counters.test.js | 2 +- test/utils/Strings.test.js | 2 +- test/utils/TimersBlockNumberImpl.test.js | 2 +- test/utils/TimersTimestamp.test.js | 2 +- test/utils/cryptography/MerkleProof.test.js | 2 +- test/utils/introspection/ERC165.test.js | 2 +- .../utils/introspection/ERC165Checker.test.js | 2 +- .../utils/introspection/ERC165Storage.test.js | 2 +- test/utils/math/Math.test.js | 2 +- test/utils/math/SafeCast.test.js | 2 +- test/utils/math/SafeMath.test.js | 2 +- test/utils/math/SignedMath.test.js | 2 +- test/utils/math/SignedSafeMath.test.js | 2 +- test/utils/structs/BitMap.test.js | 2 +- test/utils/structs/DoubleEndedQueue.test.js | 2 +- 26 files changed, 515 insertions(+), 1082 deletions(-) diff --git a/.eslintrc b/.eslintrc index 095d2754d..a5418c5e4 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,62 +1,20 @@ { + "root": true, "extends" : [ - "standard" - ], - "plugins": [ - "mocha" + "eslint:recommended", + "prettier", ], "env": { - "browser" : true, - "node" : true, - "mocha" : true, - "jest" : true, + "es2022": true, + "browser": true, + "node": true, + "mocha": true, }, "globals" : { - "artifacts": false, - "contract": false, - "assert": false, - "web3": false, - "usePlugin": false, - "extendEnvironment": false, - }, - "rules": { - - // Strict mode - "strict": ["error", "global"], - - // Code style - "array-bracket-spacing": ["off"], - "camelcase": ["error", {"properties": "always"}], - "comma-dangle": ["error", "always-multiline"], - "comma-spacing": ["error", {"before": false, "after": true}], - "dot-notation": ["error", {"allowKeywords": true, "allowPattern": ""}], - "eol-last": ["error", "always"], - "eqeqeq": ["error", "smart"], - "generator-star-spacing": ["error", "before"], - "indent": ["error", 2], - "linebreak-style": ["error", "unix"], - "max-len": ["error", 120, 2], - "no-debugger": "off", - "no-dupe-args": "error", - "no-dupe-keys": "error", - "no-mixed-spaces-and-tabs": ["error", "smart-tabs"], - "no-redeclare": ["error", {"builtinGlobals": true}], - "no-trailing-spaces": ["error", { "skipBlankLines": false }], - "no-undef": "error", - "no-use-before-define": "off", - "no-var": "error", - "object-curly-spacing": ["error", "always"], - "prefer-const": "error", - "quotes": ["error", "single"], - "semi": ["error", "always"], - "space-before-function-paren": ["error", "always"], - - "mocha/no-exclusive-tests": ["error"], - - "promise/always-return": "off", - "promise/avoid-new": "off", - }, - "parserOptions": { - "ecmaVersion": 2020 + "artifacts": "readonly", + "contract": "readonly", + "web3": "readonly", + "extendEnvironment": "readonly", + "expect": "readonly", } } diff --git a/package-lock.json b/package-lock.json index 8d8a2ca16..9473a1be3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,8 @@ "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", - "eslint": "^7.32.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-mocha": "^10.0.3", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.2.0", + "eslint": "^8.30.0", + "eslint-config-prettier": "^8.5.0", "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", @@ -265,23 +261,53 @@ "dev": true }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/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": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/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": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/@ethereumjs/common": { @@ -1055,19 +1081,32 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -2250,12 +2289,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -2396,9 +2429,9 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2591,25 +2624,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2628,24 +2642,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", @@ -2716,15 +2712,6 @@ "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", "dev": true }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -4547,15 +4534,6 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "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", @@ -4738,334 +4716,93 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "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" - } - ], - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/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/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/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/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", - "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - }, - "engines": { - "node": ">=14.0.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-mocha/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/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": ">= 4" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", - "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, "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.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "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" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-scope/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" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=4.0" } }, "node_modules/eslint/node_modules/ansi-regex": { @@ -5077,6 +4814,12 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5093,6 +4836,136 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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/eslint/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/eslint/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": ">= 4" + } + }, + "node_modules/eslint/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": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5106,26 +4979,29 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esprima": { @@ -6930,6 +6806,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "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==", + "dev": true + }, "node_modules/graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -8192,6 +8074,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -8350,6 +8241,16 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "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", @@ -8417,18 +8318,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -8724,12 +8613,6 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "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/lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", @@ -9774,23 +9657,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obliterator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", @@ -10438,12 +10304,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rambda": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", - "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", - "dev": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11510,32 +11370,6 @@ "node": ">=8" } }, - "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, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/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, - "engines": { - "node": ">=8" - } - }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -13271,15 +13105,6 @@ "node": ">=4" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -13478,103 +13303,6 @@ "get-port": "^3.1.0" } }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/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/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "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" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -13729,18 +13457,6 @@ "node": ">=0.6" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -14000,12 +13716,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "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", @@ -15084,20 +14794,43 @@ "dev": true }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + } } }, "@ethereumjs/common": { @@ -15561,16 +15294,22 @@ "dev": true }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -16504,12 +16243,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -16629,9 +16362,9 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-jsx": { @@ -16772,19 +16505,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -16797,18 +16517,6 @@ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, "array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", @@ -16867,12 +16575,6 @@ "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -18354,15 +18056,6 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "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, - "requires": { - "has": "^1.0.3" - } - }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -18497,51 +18190,50 @@ } }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { @@ -18550,6 +18242,12 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -18560,6 +18258,90 @@ "supports-color": "^7.1.0" } }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "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, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + }, + "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, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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, + "requires": { + "p-limit": "^3.0.2" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -18571,215 +18353,46 @@ } } }, - "eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz", - "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "rambda": "^7.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz", - "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==", + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, "requires": {} }, "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.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" + "estraverse": "^5.2.0" }, "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -20279,6 +19892,12 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "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==", + "dev": true + }, "graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -21231,6 +20850,12 @@ "has-tostringtag": "^1.0.0" } }, + "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 + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -21347,6 +20972,12 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -21411,15 +21042,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -21646,12 +21268,6 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, "lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", @@ -22472,17 +22088,6 @@ "es-abstract": "^1.20.4" } }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, "obliterator": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", @@ -22969,12 +22574,6 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "rambda": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", - "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -23786,25 +23385,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "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 - } - } - }, "snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -25135,12 +24715,6 @@ "ansi-regex": "^3.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, "strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -25295,83 +24869,6 @@ "get-port": "^3.1.0" } }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "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 - }, - "json-schema-traverse": { - "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 - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -25502,18 +24999,6 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -25727,12 +25212,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "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", diff --git a/package.json b/package.json index 4bc8f6e25..c20e7f883 100644 --- a/package.json +++ b/package.json @@ -59,12 +59,8 @@ "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", "chai": "^4.2.0", - "eslint": "^7.32.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-mocha": "^10.0.3", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^5.2.0", + "eslint": "^8.30.0", + "eslint-config-prettier": "^8.5.0", "eth-sig-util": "^3.0.0", "ethereumjs-util": "^7.0.7", "ethereumjs-wallet": "^1.0.1", diff --git a/test/access/AccessControl.behavior.js b/test/access/AccessControl.behavior.js index 53dfa3ddb..2edd3fd4a 100644 --- a/test/access/AccessControl.behavior.js +++ b/test/access/AccessControl.behavior.js @@ -7,7 +7,7 @@ const DEFAULT_ADMIN_ROLE = '0x00000000000000000000000000000000000000000000000000 const ROLE = web3.utils.soliditySha3('ROLE'); const OTHER_ROLE = web3.utils.soliditySha3('OTHER_ROLE'); -function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, otherAdmin, otherAuthorized) { +function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, otherAdmin) { shouldSupportInterfaces(['AccessControl']); describe('default admin', function () { diff --git a/test/proxy/Clones.test.js b/test/proxy/Clones.test.js index 65e5ac11b..0393a3331 100644 --- a/test/proxy/Clones.test.js +++ b/test/proxy/Clones.test.js @@ -6,7 +6,7 @@ const shouldBehaveLikeClone = require('./Clones.behaviour'); const ClonesMock = artifacts.require('ClonesMock'); -contract('Clones', function (accounts) { +contract('Clones', function () { describe('clone', function () { shouldBehaveLikeClone(async (implementation, initData, opts = {}) => { const factory = await ClonesMock.new(); diff --git a/test/proxy/utils/Initializable.test.js b/test/proxy/utils/Initializable.test.js index 2c0c147f6..39c820b9d 100644 --- a/test/proxy/utils/Initializable.test.js +++ b/test/proxy/utils/Initializable.test.js @@ -10,7 +10,7 @@ const DisableBad1 = artifacts.require('DisableBad1'); const DisableBad2 = artifacts.require('DisableBad2'); const DisableOk = artifacts.require('DisableOk'); -contract('Initializable', function (accounts) { +contract('Initializable', function () { describe('basic testing without inheritance', function () { beforeEach('deploying', async function () { this.contract = await InitializableMock.new(); diff --git a/test/proxy/utils/UUPSUpgradeable.test.js b/test/proxy/utils/UUPSUpgradeable.test.js index 466081d20..cd465143e 100644 --- a/test/proxy/utils/UUPSUpgradeable.test.js +++ b/test/proxy/utils/UUPSUpgradeable.test.js @@ -8,7 +8,7 @@ const UUPSUpgradeableUnsafeMock = artifacts.require('UUPSUpgradeableUnsafeMock') const UUPSUpgradeableLegacyMock = artifacts.require('UUPSUpgradeableLegacyMock'); const CountersImpl = artifacts.require('CountersImpl'); -contract('UUPSUpgradeable', function (accounts) { +contract('UUPSUpgradeable', function () { before(async function () { this.implInitial = await UUPSUpgradeableMock.new(); this.implUpgradeOk = await UUPSUpgradeableMock.new(); diff --git a/test/security/ReentrancyGuard.test.js b/test/security/ReentrancyGuard.test.js index c7f7d4697..172a29b1f 100644 --- a/test/security/ReentrancyGuard.test.js +++ b/test/security/ReentrancyGuard.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ReentrancyMock = artifacts.require('ReentrancyMock'); const ReentrancyAttack = artifacts.require('ReentrancyAttack'); -contract('ReentrancyGuard', function (accounts) { +contract('ReentrancyGuard', function () { beforeEach(async function () { this.reentrancyMock = await ReentrancyMock.new(); expect(await this.reentrancyMock.counter()).to.be.bignumber.equal('0'); diff --git a/test/token/ERC721/ERC721.behavior.js b/test/token/ERC721/ERC721.behavior.js index 021398449..7c91671df 100644 --- a/test/token/ERC721/ERC721.behavior.js +++ b/test/token/ERC721/ERC721.behavior.js @@ -83,7 +83,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another await this.token.setApprovalForAll(operator, true, { from: owner }); }); - const transferWasSuccessful = function ({ owner, tokenId, approved }) { + const transferWasSuccessful = function ({ owner, tokenId }) { it('transfers the ownership of the given token ID to the given address', async function () { expect(await this.token.ownerOf(tokenId)).to.be.equal(this.toWhom); }); diff --git a/test/utils/Arrays.test.js b/test/utils/Arrays.test.js index 8c287ccff..5d32e510a 100644 --- a/test/utils/Arrays.test.js +++ b/test/utils/Arrays.test.js @@ -6,7 +6,7 @@ const AddressArraysMock = artifacts.require('AddressArraysMock'); const Bytes32ArraysMock = artifacts.require('Bytes32ArraysMock'); const Uint256ArraysMock = artifacts.require('Uint256ArraysMock'); -contract('Arrays', function (accounts) { +contract('Arrays', function () { describe('findUpperBound', function () { context('Even number of elements', function () { const EVEN_ELEMENTS_ARRAY = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; diff --git a/test/utils/Checkpoints.test.js b/test/utils/Checkpoints.test.js index 87335da9b..abc5c9b36 100644 --- a/test/utils/Checkpoints.test.js +++ b/test/utils/Checkpoints.test.js @@ -9,7 +9,7 @@ const CheckpointsMock = artifacts.require('CheckpointsMock'); const first = (array) => array.length ? array[0] : undefined; const last = (array) => array.length ? array[array.length - 1] : undefined; -contract('Checkpoints', function (accounts) { +contract('Checkpoints', function () { describe('History checkpoints', function () { beforeEach(async function () { this.checkpoint = await CheckpointsMock.new(); diff --git a/test/utils/Counters.test.js b/test/utils/Counters.test.js index 04be4c0c8..2159fd08d 100644 --- a/test/utils/Counters.test.js +++ b/test/utils/Counters.test.js @@ -4,7 +4,7 @@ const { expect } = require('chai'); const CountersImpl = artifacts.require('CountersImpl'); -contract('Counters', function (accounts) { +contract('Counters', function () { beforeEach(async function () { this.counter = await CountersImpl.new(); }); diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index 6c4c3423b..6d8e3aa3c 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -4,7 +4,7 @@ const { expect } = require('chai'); const StringsMock = artifacts.require('StringsMock'); -contract('Strings', function (accounts) { +contract('Strings', function () { before(async function () { this.strings = await StringsMock.new(); }); diff --git a/test/utils/TimersBlockNumberImpl.test.js b/test/utils/TimersBlockNumberImpl.test.js index d9f83d933..ee0d54bfb 100644 --- a/test/utils/TimersBlockNumberImpl.test.js +++ b/test/utils/TimersBlockNumberImpl.test.js @@ -3,7 +3,7 @@ const { expect } = require('chai'); const TimersBlockNumberImpl = artifacts.require('TimersBlockNumberImpl'); -contract('TimersBlockNumber', function (accounts) { +contract('TimersBlockNumber', function () { beforeEach(async function () { this.instance = await TimersBlockNumberImpl.new(); this.now = await web3.eth.getBlock('latest').then(({ number }) => number); diff --git a/test/utils/TimersTimestamp.test.js b/test/utils/TimersTimestamp.test.js index b08118d4f..fc32de7d0 100644 --- a/test/utils/TimersTimestamp.test.js +++ b/test/utils/TimersTimestamp.test.js @@ -3,7 +3,7 @@ const { expect } = require('chai'); const TimersTimestampImpl = artifacts.require('TimersTimestampImpl'); -contract('TimersTimestamp', function (accounts) { +contract('TimersTimestamp', function () { beforeEach(async function () { this.instance = await TimersTimestampImpl.new(); this.now = await web3.eth.getBlock('latest').then(({ timestamp }) => timestamp); diff --git a/test/utils/cryptography/MerkleProof.test.js b/test/utils/cryptography/MerkleProof.test.js index 2d4aacdac..7af3d38d7 100644 --- a/test/utils/cryptography/MerkleProof.test.js +++ b/test/utils/cryptography/MerkleProof.test.js @@ -8,7 +8,7 @@ const { expect } = require('chai'); const MerkleProofWrapper = artifacts.require('MerkleProofWrapper'); -contract('MerkleProof', function (accounts) { +contract('MerkleProof', function () { beforeEach(async function () { this.merkleProof = await MerkleProofWrapper.new(); }); diff --git a/test/utils/introspection/ERC165.test.js b/test/utils/introspection/ERC165.test.js index c891500e3..fabad8cdc 100644 --- a/test/utils/introspection/ERC165.test.js +++ b/test/utils/introspection/ERC165.test.js @@ -2,7 +2,7 @@ const { shouldSupportInterfaces } = require('./SupportsInterface.behavior'); const ERC165Mock = artifacts.require('ERC165Mock'); -contract('ERC165', function (accounts) { +contract('ERC165', function () { beforeEach(async function () { this.mock = await ERC165Mock.new(); }); diff --git a/test/utils/introspection/ERC165Checker.test.js b/test/utils/introspection/ERC165Checker.test.js index 90409a899..f4abf44f8 100644 --- a/test/utils/introspection/ERC165Checker.test.js +++ b/test/utils/introspection/ERC165Checker.test.js @@ -16,7 +16,7 @@ const DUMMY_UNSUPPORTED_ID = '0xbaddcafe'; const DUMMY_UNSUPPORTED_ID_2 = '0xbaadcafe'; const DUMMY_ACCOUNT = '0x1111111111111111111111111111111111111111'; -contract('ERC165Checker', function (accounts) { +contract('ERC165Checker', function () { beforeEach(async function () { this.mock = await ERC165CheckerMock.new(); }); diff --git a/test/utils/introspection/ERC165Storage.test.js b/test/utils/introspection/ERC165Storage.test.js index 568d64576..9c2792de8 100644 --- a/test/utils/introspection/ERC165Storage.test.js +++ b/test/utils/introspection/ERC165Storage.test.js @@ -4,7 +4,7 @@ const { shouldSupportInterfaces } = require('./SupportsInterface.behavior'); const ERC165Mock = artifacts.require('ERC165StorageMock'); -contract('ERC165Storage', function (accounts) { +contract('ERC165Storage', function () { beforeEach(async function () { this.mock = await ERC165Mock.new(); }); diff --git a/test/utils/math/Math.test.js b/test/utils/math/Math.test.js index 2b5448b54..51df28d12 100644 --- a/test/utils/math/Math.test.js +++ b/test/utils/math/Math.test.js @@ -5,7 +5,7 @@ const { Rounding } = require('../../helpers/enums.js'); const MathMock = artifacts.require('MathMock'); -contract('Math', function (accounts) { +contract('Math', function () { const min = new BN('1234'); const max = new BN('5678'); const MAX_UINT256_SUB1 = MAX_UINT256.sub(new BN('1')); diff --git a/test/utils/math/SafeCast.test.js b/test/utils/math/SafeCast.test.js index 97fc22e92..1399350a5 100644 --- a/test/utils/math/SafeCast.test.js +++ b/test/utils/math/SafeCast.test.js @@ -4,7 +4,7 @@ const { range } = require('../../../scripts/helpers'); const SafeCastMock = artifacts.require('SafeCastMock'); -contract('SafeCast', async (accounts) => { +contract('SafeCast', async function () { beforeEach(async function () { this.safeCast = await SafeCastMock.new(); }); diff --git a/test/utils/math/SafeMath.test.js b/test/utils/math/SafeMath.test.js index 7c9b937a8..4c2cfe551 100644 --- a/test/utils/math/SafeMath.test.js +++ b/test/utils/math/SafeMath.test.js @@ -15,7 +15,7 @@ function expectStruct (value, expected) { } } -contract('SafeMath', function (accounts) { +contract('SafeMath', function () { beforeEach(async function () { this.safeMath = await SafeMathMock.new(); }); diff --git a/test/utils/math/SignedMath.test.js b/test/utils/math/SignedMath.test.js index 8e9826f02..f1bcc18b3 100644 --- a/test/utils/math/SignedMath.test.js +++ b/test/utils/math/SignedMath.test.js @@ -4,7 +4,7 @@ const { MIN_INT256, MAX_INT256 } = constants; const SignedMathMock = artifacts.require('SignedMathMock'); -contract('SignedMath', function (accounts) { +contract('SignedMath', function () { const min = new BN('-1234'); const max = new BN('5678'); diff --git a/test/utils/math/SignedSafeMath.test.js b/test/utils/math/SignedSafeMath.test.js index c6aa15ed9..c14d40be0 100644 --- a/test/utils/math/SignedSafeMath.test.js +++ b/test/utils/math/SignedSafeMath.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const SignedSafeMathMock = artifacts.require('SignedSafeMathMock'); -contract('SignedSafeMath', function (accounts) { +contract('SignedSafeMath', function () { beforeEach(async function () { this.safeMath = await SignedSafeMathMock.new(); }); diff --git a/test/utils/structs/BitMap.test.js b/test/utils/structs/BitMap.test.js index 58d70ca8f..4d85bcfbf 100644 --- a/test/utils/structs/BitMap.test.js +++ b/test/utils/structs/BitMap.test.js @@ -3,7 +3,7 @@ const { expect } = require('chai'); const BitMap = artifacts.require('BitMapMock'); -contract('BitMap', function (accounts) { +contract('BitMap', function () { const keyA = new BN('7891'); const keyB = new BN('451'); const keyC = new BN('9592328'); diff --git a/test/utils/structs/DoubleEndedQueue.test.js b/test/utils/structs/DoubleEndedQueue.test.js index 545c82a72..667df77ca 100644 --- a/test/utils/structs/DoubleEndedQueue.test.js +++ b/test/utils/structs/DoubleEndedQueue.test.js @@ -10,7 +10,7 @@ async function getContent (deque) { return values; } -contract('DoubleEndedQueue', function (accounts) { +contract('DoubleEndedQueue', function () { const bytesA = '0xdeadbeef'.padEnd(66, '0'); const bytesB = '0x0123456789'.padEnd(66, '0'); const bytesC = '0x42424242'.padEnd(66, '0'); From ccc175a9ed6afff646d7777bb57598fac6f7787b Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 30 Dec 2022 16:51:22 -0300 Subject: [PATCH 105/197] Add /out to .gitignore (#3908) --- .gitignore | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index c60c5d945..2f5220de1 100644 --- a/.gitignore +++ b/.gitignore @@ -54,9 +54,12 @@ allFiredEvents .coverage_cache .coverage_contracts -# hardhat -cache -artifacts +# Hardhat +/cache +/artifacts + +# Foundry +/out # Certora .certora* From a4596cab053d46e0bf2957e2ed490cb3921539ee Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Fri, 30 Dec 2022 23:00:53 +0100 Subject: [PATCH 106/197] Add warning on `SELFDESTRUCT` usage with `isContract` (#3875) Co-authored-by: Francisco --- contracts/utils/Address.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/utils/Address.sol b/contracts/utils/Address.sol index 70d03e3d2..433a866d7 100644 --- a/contracts/utils/Address.sol +++ b/contracts/utils/Address.sol @@ -22,6 +22,10 @@ library Address { * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed + * + * Furthermore, `isContract` will also return true if the target contract within + * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, + * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] From 0892f877b885d63bc3aed4a36a795f2004f16b15 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Mon, 2 Jan 2023 17:45:42 -0300 Subject: [PATCH 107/197] Fix base for Renovate config --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 0ec3e857e..f6df03630 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,6 @@ { "extends": [ - "github>OpenZeppelin/code-style" + "github>OpenZeppelin/configs" ], "packageRules": [ { From 4fc19ddb8dd1de3b828c32942896d527cf0e8eda Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Mon, 2 Jan 2023 18:03:24 -0300 Subject: [PATCH 108/197] Add label to Renovate PRs --- renovate.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/renovate.json b/renovate.json index f6df03630..875bf6ec4 100644 --- a/renovate.json +++ b/renovate.json @@ -1,11 +1,4 @@ { - "extends": [ - "github>OpenZeppelin/configs" - ], - "packageRules": [ - { - "extends": ["packages:eslint"], - "enabled": false - } - ] + "extends": ["github>OpenZeppelin/configs"], + "labels": ["ignore-changelog"] } From 276b32a5ecbab5c52fe6dfd450108d7964df0843 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Jan 2023 21:42:08 +0000 Subject: [PATCH 109/197] Update lockfile (#3909) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 1151 +++++++++++++++++---------------------------- 1 file changed, 443 insertions(+), 708 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9473a1be3..5524f8a12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,12 +46,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { @@ -261,9 +264,9 @@ "dev": true }, "node_modules/@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -289,15 +292,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/@eslint/eslintrc/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": ">= 4" - } - }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2311,9 +2305,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "node_modules/@types/pbkdf2": { @@ -2712,6 +2706,15 @@ "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", "dev": true }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -3631,12 +3634,6 @@ "node": ">=8" } }, - "node_modules/cliui/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/cliui/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", @@ -4415,9 +4412,9 @@ } }, "node_modules/emoji-regex": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", - "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "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/encodeurl": { @@ -4528,6 +4525,24 @@ "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", @@ -4716,12 +4731,12 @@ } }, "node_modules/eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", + "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.0", + "@eslint/eslintrc": "^1.4.1", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4772,9 +4787,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -4796,13 +4811,40 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint/node_modules/ansi-regex": { @@ -4836,42 +4878,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4900,15 +4906,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/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": ">= 4" - } - }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4995,15 +4992,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5029,15 +5017,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", @@ -5050,7 +5029,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==", @@ -5059,15 +5038,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", @@ -5476,21 +5446,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "node_modules/eth-gas-reporter/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==", - "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_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", @@ -6139,9 +6094,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "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" @@ -6752,15 +6707,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globby/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": ">= 4" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6884,9 +6830,9 @@ } }, "node_modules/hardhat": { - "version": "2.12.4", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.4.tgz", - "integrity": "sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw==", + "version": "2.12.5", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", + "integrity": "sha512-f/t7+hLlhsnQZ6LDXyV+8rHGRZFZY1sgFvgrwr9fBjMdGp1Bu6hHq1KXS4/VFZfZcVdL1DAWWEkryinZhqce+A==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -7187,18 +7133,6 @@ "node": ">=0.10.0" } }, - "node_modules/hardhat/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": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hardhat/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -7590,9 +7524,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -7932,18 +7866,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -8352,9 +8274,9 @@ } }, "node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -8559,18 +8481,6 @@ "node": ">=0.10.0" } }, - "node_modules/load-json-file/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, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9056,12 +8966,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/mocha/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/mocha/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9622,21 +9526,18 @@ } }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { @@ -10073,73 +9974,20 @@ } }, "node_modules/prettier-plugin-solidity": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.0.tgz", - "integrity": "sha512-5gq0T49ifvXH/6x1STuKyWjTUgi6ICoV65yNtKlg/vZEvocFtSpByJOJICBfqPwNsnv4vhhWIqkLGSUJmWum2w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz", + "integrity": "sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg==", "dev": true, "dependencies": { "@solidity-parser/parser": "^0.14.5", - "emoji-regex": "^10.2.1", - "escape-string-regexp": "^4.0.0", "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7", - "string-width": "^4.2.3" + "solidity-comments-extractor": "^0.0.7" }, "engines": { "node": ">=12" }, "peerDependencies": { - "prettier": "^2.3.0" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/string-width/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/prettier-plugin-solidity/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, "node_modules/process": { @@ -10649,17 +10497,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "path-parse": "^1.0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11370,6 +11213,47 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -11643,15 +11527,6 @@ "node": ">=0.4.0" } }, - "node_modules/solhint/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/solhint/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -11664,15 +11539,6 @@ "node": ">=4" } }, - "node_modules/solhint/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/solhint/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -11727,12 +11593,6 @@ "semver": "bin/semver" } }, - "node_modules/solhint/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/solhint/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -11849,6 +11709,15 @@ "node": ">=6.0.0" } }, + "node_modules/solhint/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/solhint/node_modules/file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -11919,6 +11788,15 @@ "node": ">=4" } }, + "node_modules/solhint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/solhint/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -12031,46 +11909,6 @@ "node": ">=0.10.0" } }, - "node_modules/solhint/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/string-width/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/solhint/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -12092,21 +11930,6 @@ "node": ">=4" } }, - "node_modules/solhint/node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/solhint/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -12132,9 +11955,9 @@ } }, "node_modules/solidity-ast": { - "version": "0.4.39", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.39.tgz", - "integrity": "sha512-91d4HMzV9x3ZG1fXRtAFFq2UjJrQXkyWdrmzXqBlueOSGB+v+0+iiLfZIPnTE0apndG2zm23qkZQJf8IbRrf7w==", + "version": "0.4.40", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.40.tgz", + "integrity": "sha512-M8uLBT2jgFB7B0iVAC5a2l71J8vim7aEm03AZkaHbDqyrl1pE+i5PriMEw6WlwGfHp3/Ym7cn9BqvVLQgRk+Yw==", "dev": true }, "node_modules/solidity-comments": { @@ -12703,21 +12526,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "node_modules/solidity-coverage/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==", - "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_modules/solidity-coverage/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -12873,9 +12681,9 @@ } }, "node_modules/solidity-docgen": { - "version": "0.6.0-beta.32", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.32.tgz", - "integrity": "sha512-LGcosbgqxrqTo9winVq3+Xz1shS9k4p+RKwqPVPI0HtjfsKF9Mc5GzBzOUhce9uwzy0yJfhf832whfY1UKt4Aw==", + "version": "0.6.0-beta.34", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.34.tgz", + "integrity": "sha512-igdGrkg8gT1jn+B2NwzjEtSf+7NTrSi/jz88zO7MZWgETmcWbXaxgAsQP4BQeC4YFeH0Pie1NsLP7+9qDgvFtA==", "dev": true, "dependencies": { "handlebars": "^4.7.7", @@ -13105,6 +12913,18 @@ "node": ">=4" } }, + "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, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -13151,18 +12971,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/swap-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", @@ -13303,6 +13111,62 @@ "get-port": "^3.1.0" } }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/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/table/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -14325,12 +14189,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/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/wrap-ansi/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", @@ -14546,12 +14404,6 @@ "node": ">=8" } }, - "node_modules/yargs/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/yargs/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", @@ -14611,12 +14463,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.18.6" } }, "@babel/helper-validator-identifier": { @@ -14794,9 +14646,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", - "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -14816,12 +14668,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -16265,9 +16111,9 @@ "dev": true }, "@types/node": { - "version": "18.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "@types/pbkdf2": { @@ -16575,6 +16421,12 @@ "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -17330,12 +17182,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "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 - }, "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", @@ -17959,9 +17805,9 @@ } }, "emoji-regex": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", - "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "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 }, "encodeurl": { @@ -18048,6 +17894,20 @@ "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" + }, + "dependencies": { + "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, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + } } }, "es-array-method-boxes-properly": { @@ -18190,12 +18050,12 @@ } }, "eslint": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", - "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", + "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.0", + "@eslint/eslintrc": "^1.4.1", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -18258,29 +18118,6 @@ "supports-color": "^7.1.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -18300,12 +18137,6 @@ "is-glob": "^4.0.3" } }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -18354,9 +18185,9 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "requires": {} }, @@ -18368,16 +18199,31 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, "espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", @@ -18387,14 +18233,6 @@ "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - } } }, "esprima": { @@ -18410,14 +18248,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -18427,20 +18257,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -18762,18 +18584,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -19372,9 +19182,9 @@ "dev": true }, "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -19847,12 +19657,6 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true } } }, @@ -19951,9 +19755,9 @@ } }, "hardhat": { - "version": "2.12.4", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.4.tgz", - "integrity": "sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw==", + "version": "2.12.5", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", + "integrity": "sha512-f/t7+hLlhsnQZ6LDXyV+8rHGRZFZY1sgFvgrwr9fBjMdGp1Bu6hHq1KXS4/VFZfZcVdL1DAWWEkryinZhqce+A==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", @@ -20151,15 +19955,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -20505,9 +20300,9 @@ "dev": true }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "immutable": { @@ -20754,15 +20549,6 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -21070,9 +20856,9 @@ } }, "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "dev": true, "requires": { "node-addon-api": "^2.0.0", @@ -21217,15 +21003,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true - }, - "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, - "requires": { - "is-utf8": "^0.2.0" - } } } }, @@ -21619,12 +21396,6 @@ "wrap-ansi": "^7.0.0" } }, - "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 - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -22065,15 +21836,15 @@ "dev": true }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { @@ -22408,59 +22179,14 @@ "dev": true }, "prettier-plugin-solidity": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.0.tgz", - "integrity": "sha512-5gq0T49ifvXH/6x1STuKyWjTUgi6ICoV65yNtKlg/vZEvocFtSpByJOJICBfqPwNsnv4vhhWIqkLGSUJmWum2w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz", + "integrity": "sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg==", "dev": true, "requires": { "@solidity-parser/parser": "^0.14.5", - "emoji-regex": "^10.2.1", - "escape-string-regexp": "^4.0.0", "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7", - "string-width": "^4.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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 - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } + "solidity-comments-extractor": "^0.0.7" } }, "process": { @@ -22840,14 +22566,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "path-parse": "^1.0.6" } }, "resolve-alpn": { @@ -23385,6 +23109,43 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + } + } + }, "snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -23613,12 +23374,6 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -23628,12 +23383,6 @@ "color-convert": "^1.9.0" } }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -23681,12 +23430,6 @@ } } }, - "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 - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -23781,6 +23524,12 @@ "eslint-visitor-keys": "^1.0.0" } }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -23833,6 +23582,12 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -23912,39 +23667,6 @@ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -23960,18 +23682,6 @@ "has-flag": "^3.0.0" } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -23993,9 +23703,9 @@ } }, "solidity-ast": { - "version": "0.4.39", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.39.tgz", - "integrity": "sha512-91d4HMzV9x3ZG1fXRtAFFq2UjJrQXkyWdrmzXqBlueOSGB+v+0+iiLfZIPnTE0apndG2zm23qkZQJf8IbRrf7w==", + "version": "0.4.40", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.40.tgz", + "integrity": "sha512-M8uLBT2jgFB7B0iVAC5a2l71J8vim7aEm03AZkaHbDqyrl1pE+i5PriMEw6WlwGfHp3/Ym7cn9BqvVLQgRk+Yw==", "dev": true }, "solidity-comments": { @@ -24385,18 +24095,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -24524,9 +24222,9 @@ } }, "solidity-docgen": { - "version": "0.6.0-beta.32", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.32.tgz", - "integrity": "sha512-LGcosbgqxrqTo9winVq3+Xz1shS9k4p+RKwqPVPI0HtjfsKF9Mc5GzBzOUhce9uwzy0yJfhf832whfY1UKt4Aw==", + "version": "0.6.0-beta.34", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.34.tgz", + "integrity": "sha512-igdGrkg8gT1jn+B2NwzjEtSf+7NTrSi/jz88zO7MZWgETmcWbXaxgAsQP4BQeC4YFeH0Pie1NsLP7+9qDgvFtA==", "dev": true, "requires": { "handlebars": "^4.7.7", @@ -24715,6 +24413,15 @@ "ansi-regex": "^3.0.0" } }, + "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, + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -24745,12 +24452,6 @@ "has-flag": "^4.0.0" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, "swap-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", @@ -24869,6 +24570,52 @@ "get-port": "^3.1.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -25721,12 +25468,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "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 - }, "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", @@ -25864,12 +25605,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "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 - }, "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", From a81b0d0b2136a0cca6029048be25c4e2bb230d49 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 3 Jan 2023 02:04:49 +0100 Subject: [PATCH 110/197] Use unchecked in MerkleProof.processMultiProof (#3869) Signed-off-by: Pascal Marco Caversaccio Co-authored-by: Francisco --- CHANGELOG.md | 1 + contracts/utils/cryptography/MerkleProof.sol | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5549260a5..58f21d999 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) + * `MerkleProof`: optimize by using unchecked arithmetic. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) ### Deprecations diff --git a/contracts/utils/cryptography/MerkleProof.sol b/contracts/utils/cryptography/MerkleProof.sol index 0ce87faf2..3862fdbfe 100644 --- a/contracts/utils/cryptography/MerkleProof.sol +++ b/contracts/utils/cryptography/MerkleProof.sol @@ -135,7 +135,7 @@ library MerkleProof { // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. - // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the + // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; @@ -146,7 +146,9 @@ library MerkleProof { } if (totalHashes > 0) { - return hashes[totalHashes - 1]; + unchecked { + return hashes[totalHashes - 1]; + } } else if (leavesLen > 0) { return leaves[0]; } else { @@ -185,7 +187,7 @@ library MerkleProof { // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. - // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the + // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; @@ -196,7 +198,9 @@ library MerkleProof { } if (totalHashes > 0) { - return hashes[totalHashes - 1]; + unchecked { + return hashes[totalHashes - 1]; + } } else if (leavesLen > 0) { return leaves[0]; } else { From c1d9da4052a75232dca1fafac80c4a2cb82fe518 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 3 Jan 2023 15:38:13 +0100 Subject: [PATCH 111/197] Use hardhat-exposed to reduce the need for mocks (#3666) Co-authored-by: Francisco --- .gitignore | 3 + .../mocks/AccessControlCrossChainMock.sol | 16 +- .../mocks/AccessControlEnumerableMock.sol | 17 -- contracts/mocks/AccessControlMock.sol | 17 -- contracts/mocks/AddressImpl.sol | 42 --- contracts/mocks/Base64Mock.sol | 11 - contracts/mocks/BitmapMock.sol | 27 -- contracts/mocks/CallReceiverMock.sol | 8 +- contracts/mocks/CheckpointsMock.sol | 96 ------- contracts/mocks/ClonesMock.sol | 32 --- contracts/mocks/CountersImpl.sol | 27 -- contracts/mocks/Create2Impl.sol | 30 -- contracts/mocks/DoubleEndedQueueMock.sol | 58 ---- contracts/mocks/ECDSAMock.sol | 32 --- ...{EIP712External.sol => EIP712Verifier.sol} | 12 +- contracts/mocks/ERC1155BurnableMock.sol | 13 - contracts/mocks/ERC1155Mock.sol | 33 --- contracts/mocks/ERC1155PausableMock.sol | 29 -- contracts/mocks/ERC1155SupplyMock.sol | 21 -- contracts/mocks/ERC1155URIStorageMock.sol | 22 -- .../ERC165/ERC165InterfacesSupported.sol | 58 ---- contracts/mocks/ERC165CheckerMock.sol | 29 -- contracts/mocks/ERC165Mock.sol | 7 - contracts/mocks/ERC165StorageMock.sol | 11 - contracts/mocks/ERC1820ImplementerMock.sol | 11 - contracts/mocks/ERC20BurnableMock.sol | 16 -- contracts/mocks/ERC20CappedMock.sol | 13 - contracts/mocks/ERC20DecimalsMock.sol | 25 -- contracts/mocks/ERC20Mock.sol | 25 +- contracts/mocks/ERC20PausableMock.sol | 33 --- contracts/mocks/ERC20PermitMock.sol | 20 -- contracts/mocks/ERC20SnapshotMock.sol | 28 -- contracts/mocks/ERC20VotesCompMock.sol | 21 -- contracts/mocks/ERC20VotesMock.sol | 21 -- contracts/mocks/ERC20WrapperMock.sol | 17 -- contracts/mocks/ERC4626Mock.sol | 40 +-- contracts/mocks/ERC721BurnableMock.sol | 25 -- contracts/mocks/ERC721EnumerableMock.sol | 47 --- contracts/mocks/ERC721Mock.sol | 37 --- contracts/mocks/ERC721PausableMock.sol | 41 --- contracts/mocks/ERC721RoyaltyMock.sol | 29 -- contracts/mocks/ERC721URIStorageMock.sol | 51 ---- contracts/mocks/ERC721VotesMock.sol | 25 -- contracts/mocks/ERC777Mock.sol | 42 --- contracts/mocks/EnumerableMapMock.sol | 221 --------------- contracts/mocks/EnumerableSetMock.sol | 111 -------- contracts/mocks/GovernorCompMock.sol | 31 -- contracts/mocks/GovernorMock.sol | 50 ---- contracts/mocks/GovernorVoteMock.sol | 31 -- contracts/mocks/MathMock.sol | 43 --- contracts/mocks/MerkleProofWrapper.sol | 57 ---- contracts/mocks/MulticallTest.sol | 4 +- contracts/mocks/MulticallTokenMock.sol | 10 - contracts/mocks/Ownable2StepMock.sol | 7 - contracts/mocks/OwnableMock.sol | 7 - contracts/mocks/SafeCastMock.sol | 267 ------------------ contracts/mocks/SafeERC20Helper.sol | 182 ------------ contracts/mocks/SafeMathMemoryCheck.sol | 72 +++++ contracts/mocks/SafeMathMock.sol | 126 --------- contracts/mocks/SignatureCheckerMock.sol | 13 - contracts/mocks/SignedMathMock.sol | 23 -- contracts/mocks/SignedSafeMathMock.sol | 23 -- contracts/mocks/StringsMock.sol | 31 -- contracts/mocks/VotesMock.sol | 12 +- .../mocks/governance/GovernorCompMock.sol | 20 ++ .../GovernorCompatibilityBravoMock.sol | 43 +-- contracts/mocks/governance/GovernorMock.sol | 28 ++ .../GovernorPreventLateQuorumMock.sol | 24 +- .../GovernorTimelockCompoundMock.sol | 37 +-- .../GovernorTimelockControlMock.sol | 37 +-- .../mocks/governance/GovernorVoteMock.sol | 20 ++ .../GovernorWithParamsMock.sol | 17 +- contracts/mocks/{ => proxy}/BadBeacon.sol | 0 .../{ => proxy}/ClashingImplementation.sol | 0 .../mocks/{UUPS => proxy}/UUPSLegacy.sol | 0 .../{UUPS => proxy}/UUPSUpgradeableMock.sol | 16 +- .../mocks/{ => token}/ERC1155ReceiverMock.sol | 4 +- contracts/mocks/token/ERC20DecimalsMock.sol | 17 ++ .../mocks/{ => token}/ERC20FlashMintMock.sol | 21 +- contracts/mocks/token/ERC20MulticallMock.sol | 8 + contracts/mocks/token/ERC20NoReturnMock.sol | 21 ++ .../mocks/token/ERC20PermitNoRevertMock.sol | 38 +++ .../mocks/token/ERC20ReturnFalseMock copy.sol | 27 ++ contracts/mocks/token/ERC20ReturnTrueMock.sol | 27 ++ contracts/mocks/token/ERC4626DecimalsMock.sol | 33 +++ .../ERC721ConsecutiveEnumerableMock.sol | 4 +- .../{ => token}/ERC721ConsecutiveMock.sol | 35 +-- .../mocks/{ => token}/ERC721ReceiverMock.sol | 2 +- .../mocks/token/ERC721URIStorageMock.sol | 17 ++ contracts/mocks/token/ERC777Mock.sol | 13 + .../{ => token}/ERC777SenderRecipientMock.sol | 12 +- hardhat.config.js | 22 +- package-lock.json | 176 +++++++++++- package.json | 1 + scripts/generate/run.js | 8 - scripts/generate/templates/CheckpointsMock.js | 80 ------ .../generate/templates/EnumerableMapMock.js | 66 ----- .../generate/templates/EnumerableSetMock.js | 56 ---- scripts/generate/templates/SafeCast.js | 0 scripts/generate/templates/SafeCastMock.js | 50 ---- test/access/AccessControl.behavior.js | 9 +- test/access/AccessControl.test.js | 6 +- test/access/AccessControlCrossChain.test.js | 10 +- test/access/AccessControlEnumerable.test.js | 6 +- test/access/Ownable.test.js | 2 +- test/access/Ownable2Step.test.js | 2 +- test/finance/PaymentSplitter.test.js | 5 +- test/finance/VestingWallet.behavior.js | 12 +- test/finance/VestingWallet.test.js | 6 +- test/governance/Governor.test.js | 29 +- test/governance/TimelockController.test.js | 12 +- .../GovernorCompatibilityBravo.test.js | 10 +- .../extensions/GovernorComp.test.js | 8 +- .../extensions/GovernorERC721.test.js | 10 +- .../GovernorPreventLateQuorum.test.js | 13 +- .../GovernorTimelockCompound.test.js | 16 +- .../GovernorTimelockControl.test.js | 13 +- .../GovernorVotesQuorumFraction.test.js | 17 +- .../extensions/GovernorWithParams.test.js | 8 +- test/governance/utils/Votes.behavior.js | 35 ++- test/governance/utils/Votes.test.js | 14 +- test/helpers/chainid.js | 10 + test/helpers/eip712.js | 32 ++- test/helpers/governance.js | 2 +- test/helpers/map-values.js | 7 + test/metatx/ERC2771Context.test.js | 3 +- test/metatx/MinimalForwarder.test.js | 4 +- test/proxy/Clones.test.js | 36 +-- test/proxy/utils/UUPSUpgradeable.test.js | 4 +- test/token/ERC1155/ERC1155.behavior.js | 16 +- test/token/ERC1155/ERC1155.test.js | 42 +-- .../extensions/ERC1155Burnable.test.js | 8 +- .../extensions/ERC1155Pausable.test.js | 16 +- .../ERC1155/extensions/ERC1155Supply.test.js | 16 +- .../extensions/ERC1155URIStorage.test.js | 16 +- .../token/ERC1155/utils/ERC1155Holder.test.js | 6 +- test/token/ERC20/ERC20.test.js | 27 +- .../ERC20/extensions/ERC20Burnable.test.js | 5 +- .../ERC20/extensions/ERC20Capped.behavior.js | 14 +- .../ERC20/extensions/ERC20Capped.test.js | 14 +- .../ERC20/extensions/ERC20FlashMint.test.js | 13 +- .../ERC20/extensions/ERC20Pausable.test.js | 41 +-- .../ERC20/extensions/ERC20Snapshot.test.js | 29 +- .../token/ERC20/extensions/ERC20Votes.test.js | 39 ++- .../ERC20/extensions/ERC20VotesComp.test.js | 37 ++- .../ERC20/extensions/ERC20Wrapper.test.js | 16 +- test/token/ERC20/extensions/ERC4626.t.sol | 6 +- test/token/ERC20/extensions/ERC4626.test.js | 36 +-- .../extensions/draft-ERC20Permit.test.js | 13 +- test/token/ERC20/utils/SafeERC20.test.js | 77 +++-- test/token/ERC20/utils/TokenTimelock.test.js | 6 +- test/token/ERC721/ERC721.behavior.js | 60 ++-- test/token/ERC721/ERC721.test.js | 4 +- test/token/ERC721/ERC721Enumerable.test.js | 4 +- .../ERC721/extensions/ERC721Burnable.test.js | 11 +- .../extensions/ERC721Consecutive.test.js | 34 +-- .../ERC721/extensions/ERC721Pausable.test.js | 17 +- .../ERC721/extensions/ERC721Royalty.test.js | 17 +- .../extensions/ERC721URIStorage.test.js | 24 +- .../ERC721/extensions/ERC721Votes.test.js | 33 +-- test/token/ERC721/utils/ERC721Holder.test.js | 10 +- test/token/ERC777/ERC777.behavior.js | 10 +- test/token/ERC777/ERC777.test.js | 35 +-- test/token/common/ERC2981.behavior.js | 28 +- test/utils/Address.test.js | 259 ++++++++--------- test/utils/Base64.test.js | 12 +- test/utils/Checkpoints.test.js | 131 +++++---- test/utils/Counters.test.js | 56 ++-- test/utils/Create2.test.js | 74 +++-- test/utils/Multicall.test.js | 10 +- test/utils/Strings.test.js | 46 +-- test/utils/cryptography/ECDSA.test.js | 118 ++++++-- test/utils/cryptography/EIP712.test.js | 36 ++- test/utils/cryptography/MerkleProof.test.js | 45 +-- .../cryptography/SignatureChecker.test.js | 18 +- test/utils/introspection/ERC165.test.js | 4 +- .../utils/introspection/ERC165Checker.test.js | 98 +++---- .../utils/introspection/ERC165Storage.test.js | 8 +- .../introspection/ERC1820Implementer.test.js | 6 +- test/utils/math/Math.test.js | 245 ++++++++-------- test/utils/math/SafeCast.test.js | 52 ++-- test/utils/math/SafeMath.test.js | 122 ++++---- test/utils/math/SignedMath.test.js | 16 +- test/utils/math/SignedSafeMath.test.js | 38 +-- test/utils/structs/BitMap.test.js | 146 +++++----- test/utils/structs/DoubleEndedQueue.test.js | 50 ++-- test/utils/structs/EnumerableMap.behavior.js | 110 ++++---- test/utils/structs/EnumerableMap.test.js | 105 +++++-- test/utils/structs/EnumerableSet.behavior.js | 78 ++--- test/utils/structs/EnumerableSet.test.js | 85 ++++-- 190 files changed, 2297 insertions(+), 4311 deletions(-) delete mode 100644 contracts/mocks/AccessControlEnumerableMock.sol delete mode 100644 contracts/mocks/AccessControlMock.sol delete mode 100644 contracts/mocks/AddressImpl.sol delete mode 100644 contracts/mocks/Base64Mock.sol delete mode 100644 contracts/mocks/BitmapMock.sol delete mode 100644 contracts/mocks/CheckpointsMock.sol delete mode 100644 contracts/mocks/ClonesMock.sol delete mode 100644 contracts/mocks/CountersImpl.sol delete mode 100644 contracts/mocks/Create2Impl.sol delete mode 100644 contracts/mocks/DoubleEndedQueueMock.sol delete mode 100644 contracts/mocks/ECDSAMock.sol rename contracts/mocks/{EIP712External.sol => EIP712Verifier.sol} (63%) delete mode 100644 contracts/mocks/ERC1155BurnableMock.sol delete mode 100644 contracts/mocks/ERC1155Mock.sol delete mode 100644 contracts/mocks/ERC1155PausableMock.sol delete mode 100644 contracts/mocks/ERC1155SupplyMock.sol delete mode 100644 contracts/mocks/ERC1155URIStorageMock.sol delete mode 100644 contracts/mocks/ERC165/ERC165InterfacesSupported.sol delete mode 100644 contracts/mocks/ERC165CheckerMock.sol delete mode 100644 contracts/mocks/ERC165Mock.sol delete mode 100644 contracts/mocks/ERC165StorageMock.sol delete mode 100644 contracts/mocks/ERC1820ImplementerMock.sol delete mode 100644 contracts/mocks/ERC20BurnableMock.sol delete mode 100644 contracts/mocks/ERC20CappedMock.sol delete mode 100644 contracts/mocks/ERC20DecimalsMock.sol delete mode 100644 contracts/mocks/ERC20PausableMock.sol delete mode 100644 contracts/mocks/ERC20PermitMock.sol delete mode 100644 contracts/mocks/ERC20SnapshotMock.sol delete mode 100644 contracts/mocks/ERC20VotesCompMock.sol delete mode 100644 contracts/mocks/ERC20VotesMock.sol delete mode 100644 contracts/mocks/ERC20WrapperMock.sol delete mode 100644 contracts/mocks/ERC721BurnableMock.sol delete mode 100644 contracts/mocks/ERC721EnumerableMock.sol delete mode 100644 contracts/mocks/ERC721Mock.sol delete mode 100644 contracts/mocks/ERC721PausableMock.sol delete mode 100644 contracts/mocks/ERC721RoyaltyMock.sol delete mode 100644 contracts/mocks/ERC721URIStorageMock.sol delete mode 100644 contracts/mocks/ERC721VotesMock.sol delete mode 100644 contracts/mocks/ERC777Mock.sol delete mode 100644 contracts/mocks/EnumerableMapMock.sol delete mode 100644 contracts/mocks/EnumerableSetMock.sol delete mode 100644 contracts/mocks/GovernorCompMock.sol delete mode 100644 contracts/mocks/GovernorMock.sol delete mode 100644 contracts/mocks/GovernorVoteMock.sol delete mode 100644 contracts/mocks/MathMock.sol delete mode 100644 contracts/mocks/MerkleProofWrapper.sol delete mode 100644 contracts/mocks/MulticallTokenMock.sol delete mode 100644 contracts/mocks/Ownable2StepMock.sol delete mode 100644 contracts/mocks/OwnableMock.sol delete mode 100644 contracts/mocks/SafeCastMock.sol delete mode 100644 contracts/mocks/SafeERC20Helper.sol create mode 100644 contracts/mocks/SafeMathMemoryCheck.sol delete mode 100644 contracts/mocks/SafeMathMock.sol delete mode 100644 contracts/mocks/SignatureCheckerMock.sol delete mode 100644 contracts/mocks/SignedMathMock.sol delete mode 100644 contracts/mocks/SignedSafeMathMock.sol delete mode 100644 contracts/mocks/StringsMock.sol create mode 100644 contracts/mocks/governance/GovernorCompMock.sol rename contracts/mocks/{ => governance}/GovernorCompatibilityBravoMock.sol (71%) create mode 100644 contracts/mocks/governance/GovernorMock.sol rename contracts/mocks/{ => governance}/GovernorPreventLateQuorumMock.sol (61%) rename contracts/mocks/{ => governance}/GovernorTimelockCompoundMock.sol (62%) rename contracts/mocks/{ => governance}/GovernorTimelockControlMock.sol (62%) create mode 100644 contracts/mocks/governance/GovernorVoteMock.sol rename contracts/mocks/{ => governance}/GovernorWithParamsMock.sol (72%) rename contracts/mocks/{ => proxy}/BadBeacon.sol (100%) rename contracts/mocks/{ => proxy}/ClashingImplementation.sol (100%) rename contracts/mocks/{UUPS => proxy}/UUPSLegacy.sol (100%) rename contracts/mocks/{UUPS => proxy}/UUPSUpgradeableMock.sol (63%) rename contracts/mocks/{ => token}/ERC1155ReceiverMock.sol (93%) create mode 100644 contracts/mocks/token/ERC20DecimalsMock.sol rename contracts/mocks/{ => token}/ERC20FlashMintMock.sol (52%) create mode 100644 contracts/mocks/token/ERC20MulticallMock.sol create mode 100644 contracts/mocks/token/ERC20NoReturnMock.sol create mode 100644 contracts/mocks/token/ERC20PermitNoRevertMock.sol create mode 100644 contracts/mocks/token/ERC20ReturnFalseMock copy.sol create mode 100644 contracts/mocks/token/ERC20ReturnTrueMock.sol create mode 100644 contracts/mocks/token/ERC4626DecimalsMock.sol rename contracts/mocks/{ => token}/ERC721ConsecutiveEnumerableMock.sol (92%) rename contracts/mocks/{ => token}/ERC721ConsecutiveMock.sol (64%) rename contracts/mocks/{ => token}/ERC721ReceiverMock.sol (95%) create mode 100644 contracts/mocks/token/ERC721URIStorageMock.sol create mode 100644 contracts/mocks/token/ERC777Mock.sol rename contracts/mocks/{ => token}/ERC777SenderRecipientMock.sol (93%) delete mode 100755 scripts/generate/templates/CheckpointsMock.js delete mode 100755 scripts/generate/templates/EnumerableMapMock.js delete mode 100755 scripts/generate/templates/EnumerableSetMock.js mode change 100755 => 100644 scripts/generate/templates/SafeCast.js delete mode 100755 scripts/generate/templates/SafeCastMock.js create mode 100644 test/helpers/chainid.js create mode 100644 test/helpers/map-values.js diff --git a/.gitignore b/.gitignore index 2f5220de1..9350b262e 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,9 @@ allFiredEvents .coverage_cache .coverage_contracts +# hardat-exposed +contracts-exposed + # Hardhat /cache /artifacts diff --git a/contracts/mocks/AccessControlCrossChainMock.sol b/contracts/mocks/AccessControlCrossChainMock.sol index ffa385c65..cd4c3a5d9 100644 --- a/contracts/mocks/AccessControlCrossChainMock.sol +++ b/contracts/mocks/AccessControlCrossChainMock.sol @@ -5,18 +5,4 @@ pragma solidity ^0.8.4; import "../access/AccessControlCrossChain.sol"; import "../crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol"; -contract AccessControlCrossChainMock is AccessControlCrossChain, CrossChainEnabledArbitrumL2 { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} - - function crossChainRoleAlias(bytes32 role) public pure returns (bytes32) { - return _crossChainRoleAlias(role); - } -} +contract AccessControlCrossChainMock is AccessControlCrossChain, CrossChainEnabledArbitrumL2 {} diff --git a/contracts/mocks/AccessControlEnumerableMock.sol b/contracts/mocks/AccessControlEnumerableMock.sol deleted file mode 100644 index 7b15e3602..000000000 --- a/contracts/mocks/AccessControlEnumerableMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControlEnumerable.sol"; - -contract AccessControlEnumerableMock is AccessControlEnumerable { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} -} diff --git a/contracts/mocks/AccessControlMock.sol b/contracts/mocks/AccessControlMock.sol deleted file mode 100644 index 86f51477e..000000000 --- a/contracts/mocks/AccessControlMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControl.sol"; - -contract AccessControlMock is AccessControl { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} -} diff --git a/contracts/mocks/AddressImpl.sol b/contracts/mocks/AddressImpl.sol deleted file mode 100644 index b06bec372..000000000 --- a/contracts/mocks/AddressImpl.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Address.sol"; - -contract AddressImpl { - string public sharedAnswer; - - event CallReturnValue(string data); - - function isContract(address account) external view returns (bool) { - return Address.isContract(account); - } - - function sendValue(address payable receiver, uint256 amount) external { - Address.sendValue(receiver, amount); - } - - function functionCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionCallWithValue(address target, bytes calldata data, uint256 value) external payable { - bytes memory returnData = Address.functionCallWithValue(target, data, value); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionStaticCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionStaticCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionDelegateCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionDelegateCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - // sendValue's tests require the contract to hold Ether - receive() external payable {} -} diff --git a/contracts/mocks/Base64Mock.sol b/contracts/mocks/Base64Mock.sol deleted file mode 100644 index b255487bc..000000000 --- a/contracts/mocks/Base64Mock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Base64.sol"; - -contract Base64Mock { - function encode(bytes memory value) external pure returns (string memory) { - return Base64.encode(value); - } -} diff --git a/contracts/mocks/BitmapMock.sol b/contracts/mocks/BitmapMock.sol deleted file mode 100644 index ccf8486f5..000000000 --- a/contracts/mocks/BitmapMock.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/BitMaps.sol"; - -contract BitMapMock { - using BitMaps for BitMaps.BitMap; - - BitMaps.BitMap private _bitmap; - - function get(uint256 index) public view returns (bool) { - return _bitmap.get(index); - } - - function setTo(uint256 index, bool value) public { - _bitmap.setTo(index, value); - } - - function set(uint256 index) public { - _bitmap.set(index); - } - - function unset(uint256 index) public { - _bitmap.unset(index); - } -} diff --git a/contracts/mocks/CallReceiverMock.sol b/contracts/mocks/CallReceiverMock.sol index 926db68bf..344a1054b 100644 --- a/contracts/mocks/CallReceiverMock.sol +++ b/contracts/mocks/CallReceiverMock.sol @@ -3,8 +3,6 @@ pragma solidity ^0.8.0; contract CallReceiverMock { - string public sharedAnswer; - event MockFunctionCalled(); event MockFunctionCalledWithArgs(uint256 a, uint256 b); @@ -50,8 +48,10 @@ contract CallReceiverMock { } } - function mockFunctionWritesStorage() public returns (string memory) { - sharedAnswer = "42"; + function mockFunctionWritesStorage(bytes32 slot, bytes32 value) public returns (string memory) { + assembly { + sstore(slot, value) + } return "0x1234"; } } diff --git a/contracts/mocks/CheckpointsMock.sol b/contracts/mocks/CheckpointsMock.sol deleted file mode 100644 index 874a1d1f2..000000000 --- a/contracts/mocks/CheckpointsMock.sol +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/CheckpointsMock.js. - -pragma solidity ^0.8.0; - -import "../utils/Checkpoints.sol"; - -contract CheckpointsMock { - using Checkpoints for Checkpoints.History; - - Checkpoints.History private _totalCheckpoints; - - function latest() public view returns (uint256) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() public view returns (bool, uint256, uint256) { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint256 value) public returns (uint256, uint256) { - return _totalCheckpoints.push(value); - } - - function getAtBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtBlock(blockNumber); - } - - function getAtProbablyRecentBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtProbablyRecentBlock(blockNumber); - } -} - -contract Checkpoints224Mock { - using Checkpoints for Checkpoints.Trace224; - - Checkpoints.Trace224 private _totalCheckpoints; - - function latest() public view returns (uint224) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() public view returns (bool, uint32, uint224) { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint32 key, uint224 value) public returns (uint224, uint224) { - return _totalCheckpoints.push(key, value); - } - - function lowerLookup(uint32 key) public view returns (uint224) { - return _totalCheckpoints.lowerLookup(key); - } - - function upperLookup(uint32 key) public view returns (uint224) { - return _totalCheckpoints.upperLookup(key); - } -} - -contract Checkpoints160Mock { - using Checkpoints for Checkpoints.Trace160; - - Checkpoints.Trace160 private _totalCheckpoints; - - function latest() public view returns (uint160) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() public view returns (bool, uint96, uint160) { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint96 key, uint160 value) public returns (uint160, uint160) { - return _totalCheckpoints.push(key, value); - } - - function lowerLookup(uint96 key) public view returns (uint160) { - return _totalCheckpoints.lowerLookup(key); - } - - function upperLookup(uint96 key) public view returns (uint160) { - return _totalCheckpoints.upperLookup(key); - } -} diff --git a/contracts/mocks/ClonesMock.sol b/contracts/mocks/ClonesMock.sol deleted file mode 100644 index c65d30cc3..000000000 --- a/contracts/mocks/ClonesMock.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/Clones.sol"; -import "../utils/Address.sol"; - -contract ClonesMock { - using Address for address; - using Clones for address; - - event NewInstance(address instance); - - function clone(address implementation, bytes calldata initdata) public payable { - _initAndEmit(implementation.clone(), initdata); - } - - function cloneDeterministic(address implementation, bytes32 salt, bytes calldata initdata) public payable { - _initAndEmit(implementation.cloneDeterministic(salt), initdata); - } - - function predictDeterministicAddress(address implementation, bytes32 salt) public view returns (address predicted) { - return implementation.predictDeterministicAddress(salt); - } - - function _initAndEmit(address instance, bytes memory initdata) private { - if (initdata.length > 0) { - instance.functionCallWithValue(initdata, msg.value); - } - emit NewInstance(instance); - } -} diff --git a/contracts/mocks/CountersImpl.sol b/contracts/mocks/CountersImpl.sol deleted file mode 100644 index 651b50baf..000000000 --- a/contracts/mocks/CountersImpl.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Counters.sol"; - -contract CountersImpl { - using Counters for Counters.Counter; - - Counters.Counter private _counter; - - function current() public view returns (uint256) { - return _counter.current(); - } - - function increment() public { - _counter.increment(); - } - - function decrement() public { - _counter.decrement(); - } - - function reset() public { - _counter.reset(); - } -} diff --git a/contracts/mocks/Create2Impl.sol b/contracts/mocks/Create2Impl.sol deleted file mode 100644 index 6b2f4b712..000000000 --- a/contracts/mocks/Create2Impl.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Create2.sol"; -import "../utils/introspection/ERC1820Implementer.sol"; - -contract Create2Impl { - function deploy(uint256 value, bytes32 salt, bytes memory code) public { - Create2.deploy(value, salt, code); - } - - function deployERC1820Implementer(uint256 value, bytes32 salt) public { - Create2.deploy(value, salt, type(ERC1820Implementer).creationCode); - } - - function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address) { - return Create2.computeAddress(salt, codeHash); - } - - function computeAddressWithDeployer( - bytes32 salt, - bytes32 codeHash, - address deployer - ) public pure returns (address) { - return Create2.computeAddress(salt, codeHash, deployer); - } - - receive() external payable {} -} diff --git a/contracts/mocks/DoubleEndedQueueMock.sol b/contracts/mocks/DoubleEndedQueueMock.sol deleted file mode 100644 index a9436b005..000000000 --- a/contracts/mocks/DoubleEndedQueueMock.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/DoubleEndedQueue.sol"; - -// Bytes32Deque -contract Bytes32DequeMock { - using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; - - event OperationResult(bytes32 value); - - DoubleEndedQueue.Bytes32Deque private _vector; - - function pushBack(bytes32 value) public { - _vector.pushBack(value); - } - - function pushFront(bytes32 value) public { - _vector.pushFront(value); - } - - function popFront() public returns (bytes32) { - bytes32 value = _vector.popFront(); - emit OperationResult(value); - return value; - } - - function popBack() public returns (bytes32) { - bytes32 value = _vector.popBack(); - emit OperationResult(value); - return value; - } - - function front() public view returns (bytes32) { - return _vector.front(); - } - - function back() public view returns (bytes32) { - return _vector.back(); - } - - function at(uint256 i) public view returns (bytes32) { - return _vector.at(i); - } - - function clear() public { - _vector.clear(); - } - - function length() public view returns (uint256) { - return _vector.length(); - } - - function empty() public view returns (bool) { - return _vector.empty(); - } -} diff --git a/contracts/mocks/ECDSAMock.sol b/contracts/mocks/ECDSAMock.sol deleted file mode 100644 index cfc37d26e..000000000 --- a/contracts/mocks/ECDSAMock.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSA.sol"; - -contract ECDSAMock { - using ECDSA for bytes32; - using ECDSA for bytes; - - function recover(bytes32 hash, bytes memory signature) public pure returns (address) { - return hash.recover(signature); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_v_r_s(bytes32 hash, uint8 v, bytes32 r, bytes32 s) public pure returns (address) { - return hash.recover(v, r, s); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_r_vs(bytes32 hash, bytes32 r, bytes32 vs) public pure returns (address) { - return hash.recover(r, vs); - } - - function toEthSignedMessageHash(bytes32 hash) public pure returns (bytes32) { - return hash.toEthSignedMessageHash(); - } - - function toEthSignedMessageHash(bytes memory s) public pure returns (bytes32) { - return s.toEthSignedMessageHash(); - } -} diff --git a/contracts/mocks/EIP712External.sol b/contracts/mocks/EIP712Verifier.sol similarity index 63% rename from contracts/mocks/EIP712External.sol rename to contracts/mocks/EIP712Verifier.sol index bc5b1269f..dcef9efbb 100644 --- a/contracts/mocks/EIP712External.sol +++ b/contracts/mocks/EIP712Verifier.sol @@ -5,13 +5,7 @@ pragma solidity ^0.8.0; import "../utils/cryptography/ECDSA.sol"; import "../utils/cryptography/EIP712.sol"; -contract EIP712External is EIP712 { - constructor(string memory name, string memory version) EIP712(name, version) {} - - function domainSeparator() external view returns (bytes32) { - return _domainSeparatorV4(); - } - +abstract contract EIP712Verifier is EIP712 { function verify(bytes memory signature, address signer, address mailTo, string memory mailContents) external view { bytes32 digest = _hashTypedDataV4( keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents)))) @@ -19,8 +13,4 @@ contract EIP712External is EIP712 { address recoveredSigner = ECDSA.recover(digest, signature); require(recoveredSigner == signer); } - - function getChainId() external view returns (uint256) { - return block.chainid; - } } diff --git a/contracts/mocks/ERC1155BurnableMock.sol b/contracts/mocks/ERC1155BurnableMock.sol deleted file mode 100644 index 3334523cf..000000000 --- a/contracts/mocks/ERC1155BurnableMock.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/extensions/ERC1155Burnable.sol"; - -contract ERC1155BurnableMock is ERC1155Burnable { - constructor(string memory uri) ERC1155(uri) {} - - function mint(address to, uint256 id, uint256 value, bytes memory data) public { - _mint(to, id, value, data); - } -} diff --git a/contracts/mocks/ERC1155Mock.sol b/contracts/mocks/ERC1155Mock.sol deleted file mode 100644 index 6bfc86cea..000000000 --- a/contracts/mocks/ERC1155Mock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/ERC1155.sol"; - -/** - * @title ERC1155Mock - * This mock just publicizes internal functions for testing purposes - */ -contract ERC1155Mock is ERC1155 { - constructor(string memory uri) ERC1155(uri) {} - - function setURI(string memory newuri) public { - _setURI(newuri); - } - - function mint(address to, uint256 id, uint256 value, bytes memory data) public { - _mint(to, id, value, data); - } - - function mintBatch(address to, uint256[] memory ids, uint256[] memory values, bytes memory data) public { - _mintBatch(to, ids, values, data); - } - - function burn(address owner, uint256 id, uint256 value) public { - _burn(owner, id, value); - } - - function burnBatch(address owner, uint256[] memory ids, uint256[] memory values) public { - _burnBatch(owner, ids, values); - } -} diff --git a/contracts/mocks/ERC1155PausableMock.sol b/contracts/mocks/ERC1155PausableMock.sol deleted file mode 100644 index cd068234f..000000000 --- a/contracts/mocks/ERC1155PausableMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155Pausable.sol"; - -contract ERC1155PausableMock is ERC1155Mock, ERC1155Pausable { - constructor(string memory uri) ERC1155Mock(uri) {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal override(ERC1155, ERC1155Pausable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } -} diff --git a/contracts/mocks/ERC1155SupplyMock.sol b/contracts/mocks/ERC1155SupplyMock.sol deleted file mode 100644 index 9c0cd7b63..000000000 --- a/contracts/mocks/ERC1155SupplyMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155Supply.sol"; - -contract ERC1155SupplyMock is ERC1155Mock, ERC1155Supply { - constructor(string memory uri) ERC1155Mock(uri) {} - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal override(ERC1155, ERC1155Supply) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } -} diff --git a/contracts/mocks/ERC1155URIStorageMock.sol b/contracts/mocks/ERC1155URIStorageMock.sol deleted file mode 100644 index ba12b285d..000000000 --- a/contracts/mocks/ERC1155URIStorageMock.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155URIStorage.sol"; - -contract ERC1155URIStorageMock is ERC1155Mock, ERC1155URIStorage { - constructor(string memory _uri) ERC1155Mock(_uri) {} - - function uri(uint256 tokenId) public view override(ERC1155, ERC1155URIStorage) returns (string memory) { - return ERC1155URIStorage.uri(tokenId); - } - - function setURI(uint256 tokenId, string memory _tokenURI) public { - _setURI(tokenId, _tokenURI); - } - - function setBaseURI(string memory baseURI) public { - _setBaseURI(baseURI); - } -} diff --git a/contracts/mocks/ERC165/ERC165InterfacesSupported.sol b/contracts/mocks/ERC165/ERC165InterfacesSupported.sol deleted file mode 100644 index 7a5e5bc67..000000000 --- a/contracts/mocks/ERC165/ERC165InterfacesSupported.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165.sol"; - -/** - * https://eips.ethereum.org/EIPS/eip-214#specification - * From the specification: - * > Any attempts to make state-changing operations inside an execution instance with STATIC set to true will instead - * throw an exception. - * > These operations include [...], LOG0, LOG1, LOG2, [...] - * - * therefore, because this contract is staticcall'd we need to not emit events (which is how solidity-coverage works) - * solidity-coverage ignores the /mocks folder, so we duplicate its implementation here to avoid instrumenting it - */ -contract SupportsInterfaceWithLookupMock is IERC165 { - /* - * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 - */ - bytes4 public constant INTERFACE_ID_ERC165 = 0x01ffc9a7; - - /** - * @dev A mapping of interface id to whether or not it's supported. - */ - mapping(bytes4 => bool) private _supportedInterfaces; - - /** - * @dev A contract implementing SupportsInterfaceWithLookup - * implement ERC165 itself. - */ - constructor() { - _registerInterface(INTERFACE_ID_ERC165); - } - - /** - * @dev Implement supportsInterface(bytes4) using a lookup table. - */ - function supportsInterface(bytes4 interfaceId) public view override returns (bool) { - return _supportedInterfaces[interfaceId]; - } - - /** - * @dev Private method for registering an interface. - */ - function _registerInterface(bytes4 interfaceId) internal { - require(interfaceId != 0xffffffff, "ERC165InterfacesSupported: invalid interface id"); - _supportedInterfaces[interfaceId] = true; - } -} - -contract ERC165InterfacesSupported is SupportsInterfaceWithLookupMock { - constructor(bytes4[] memory interfaceIds) { - for (uint256 i = 0; i < interfaceIds.length; i++) { - _registerInterface(interfaceIds[i]); - } - } -} diff --git a/contracts/mocks/ERC165CheckerMock.sol b/contracts/mocks/ERC165CheckerMock.sol deleted file mode 100644 index 9ff7e7df6..000000000 --- a/contracts/mocks/ERC165CheckerMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Checker.sol"; - -contract ERC165CheckerMock { - using ERC165Checker for address; - - function supportsERC165(address account) public view returns (bool) { - return account.supportsERC165(); - } - - function supportsInterface(address account, bytes4 interfaceId) public view returns (bool) { - return account.supportsInterface(interfaceId); - } - - function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool) { - return account.supportsAllInterfaces(interfaceIds); - } - - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool[] memory) { - return account.getSupportedInterfaces(interfaceIds); - } - - function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) public view returns (bool) { - return account.supportsERC165InterfaceUnchecked(interfaceId); - } -} diff --git a/contracts/mocks/ERC165Mock.sol b/contracts/mocks/ERC165Mock.sol deleted file mode 100644 index c123d0ab2..000000000 --- a/contracts/mocks/ERC165Mock.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165.sol"; - -contract ERC165Mock is ERC165 {} diff --git a/contracts/mocks/ERC165StorageMock.sol b/contracts/mocks/ERC165StorageMock.sol deleted file mode 100644 index 4b0bae908..000000000 --- a/contracts/mocks/ERC165StorageMock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Storage.sol"; - -contract ERC165StorageMock is ERC165Storage { - function registerInterface(bytes4 interfaceId) public { - _registerInterface(interfaceId); - } -} diff --git a/contracts/mocks/ERC1820ImplementerMock.sol b/contracts/mocks/ERC1820ImplementerMock.sol deleted file mode 100644 index a6012d7ff..000000000 --- a/contracts/mocks/ERC1820ImplementerMock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC1820Implementer.sol"; - -contract ERC1820ImplementerMock is ERC1820Implementer { - function registerInterfaceForAddress(bytes32 interfaceHash, address account) public { - _registerInterfaceForAddress(interfaceHash, account); - } -} diff --git a/contracts/mocks/ERC20BurnableMock.sol b/contracts/mocks/ERC20BurnableMock.sol deleted file mode 100644 index 0ed6c0c98..000000000 --- a/contracts/mocks/ERC20BurnableMock.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Burnable.sol"; - -contract ERC20BurnableMock is ERC20Burnable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } -} diff --git a/contracts/mocks/ERC20CappedMock.sol b/contracts/mocks/ERC20CappedMock.sol deleted file mode 100644 index e69aadfdf..000000000 --- a/contracts/mocks/ERC20CappedMock.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Capped.sol"; - -contract ERC20CappedMock is ERC20Capped { - constructor(string memory name, string memory symbol, uint256 cap) ERC20(name, symbol) ERC20Capped(cap) {} - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } -} diff --git a/contracts/mocks/ERC20DecimalsMock.sol b/contracts/mocks/ERC20DecimalsMock.sol deleted file mode 100644 index 7677e9dd1..000000000 --- a/contracts/mocks/ERC20DecimalsMock.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/ERC20.sol"; - -contract ERC20DecimalsMock is ERC20 { - uint8 private immutable _decimals; - - constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) { - _decimals = decimals_; - } - - function decimals() public view override returns (uint8) { - return _decimals; - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } -} diff --git a/contracts/mocks/ERC20Mock.sol b/contracts/mocks/ERC20Mock.sol index 16ffad19f..cc75923df 100644 --- a/contracts/mocks/ERC20Mock.sol +++ b/contracts/mocks/ERC20Mock.sol @@ -1,33 +1,16 @@ // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0; -import "../token/ERC20/ERC20.sol"; +import {ERC20} from "../token/ERC20/ERC20.sol"; -// mock class using ERC20 contract ERC20Mock is ERC20 { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } + constructor() ERC20("ERC20Mock", "E20M") {} - function mint(address account, uint256 amount) public { + function mint(address account, uint256 amount) external { _mint(account, amount); } - function burn(address account, uint256 amount) public { + function burn(address account, uint256 amount) external { _burn(account, amount); } - - function transferInternal(address from, address to, uint256 value) public { - _transfer(from, to, value); - } - - function approveInternal(address owner, address spender, uint256 value) public { - _approve(owner, spender, value); - } } diff --git a/contracts/mocks/ERC20PausableMock.sol b/contracts/mocks/ERC20PausableMock.sol deleted file mode 100644 index 19160ba6c..000000000 --- a/contracts/mocks/ERC20PausableMock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Pausable.sol"; - -// mock class using ERC20Pausable -contract ERC20PausableMock is ERC20Pausable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function mint(address to, uint256 amount) public { - _mint(to, amount); - } - - function burn(address from, uint256 amount) public { - _burn(from, amount); - } -} diff --git a/contracts/mocks/ERC20PermitMock.sol b/contracts/mocks/ERC20PermitMock.sol deleted file mode 100644 index 8daa95587..000000000 --- a/contracts/mocks/ERC20PermitMock.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Permit.sol"; - -contract ERC20PermitMock is ERC20Permit { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable ERC20(name, symbol) ERC20Permit(name) { - _mint(initialAccount, initialBalance); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/mocks/ERC20SnapshotMock.sol b/contracts/mocks/ERC20SnapshotMock.sol deleted file mode 100644 index cb3048322..000000000 --- a/contracts/mocks/ERC20SnapshotMock.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Snapshot.sol"; - -contract ERC20SnapshotMock is ERC20Snapshot { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function snapshot() public { - _snapshot(); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } -} diff --git a/contracts/mocks/ERC20VotesCompMock.sol b/contracts/mocks/ERC20VotesCompMock.sol deleted file mode 100644 index 171071fd5..000000000 --- a/contracts/mocks/ERC20VotesCompMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20VotesComp.sol"; - -contract ERC20VotesCompMock is ERC20VotesComp { - constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/mocks/ERC20VotesMock.sol b/contracts/mocks/ERC20VotesMock.sol deleted file mode 100644 index 0975e8b9f..000000000 --- a/contracts/mocks/ERC20VotesMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Votes.sol"; - -contract ERC20VotesMock is ERC20Votes { - constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/mocks/ERC20WrapperMock.sol b/contracts/mocks/ERC20WrapperMock.sol deleted file mode 100644 index cf34a7a52..000000000 --- a/contracts/mocks/ERC20WrapperMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Wrapper.sol"; - -contract ERC20WrapperMock is ERC20Wrapper { - constructor( - IERC20 _underlyingToken, - string memory name, - string memory symbol - ) ERC20(name, symbol) ERC20Wrapper(_underlyingToken) {} - - function recover(address account) public returns (uint256) { - return _recover(account); - } -} diff --git a/contracts/mocks/ERC4626Mock.sol b/contracts/mocks/ERC4626Mock.sol index 9c13346f0..ef2d1a4cb 100644 --- a/contracts/mocks/ERC4626Mock.sol +++ b/contracts/mocks/ERC4626Mock.sol @@ -1,50 +1,16 @@ // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0; import "../token/ERC20/extensions/ERC4626.sol"; contract ERC4626Mock is ERC4626 { - constructor(IERC20Metadata asset, string memory name, string memory symbol) ERC20(name, symbol) ERC4626(asset) {} + constructor(address underlying) ERC20("ERC4626Mock", "E4626M") ERC4626(IERC20(underlying)) {} - function mockMint(address account, uint256 amount) public { + function mint(address account, uint256 amount) external { _mint(account, amount); } - function mockBurn(address account, uint256 amount) public { + function burn(address account, uint256 amount) external { _burn(account, amount); } } - -contract ERC4626DecimalMock is ERC4626Mock { - using Math for uint256; - - uint8 private immutable _decimals; - - constructor( - IERC20Metadata asset, - string memory name, - string memory symbol, - uint8 decimalsOverride - ) ERC4626Mock(asset, name, symbol) { - _decimals = decimalsOverride; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function _initialConvertToShares( - uint256 assets, - Math.Rounding rounding - ) internal view virtual override returns (uint256 shares) { - return assets.mulDiv(10 ** decimals(), 10 ** super.decimals(), rounding); - } - - function _initialConvertToAssets( - uint256 shares, - Math.Rounding rounding - ) internal view virtual override returns (uint256 assets) { - return shares.mulDiv(10 ** super.decimals(), 10 ** decimals(), rounding); - } -} diff --git a/contracts/mocks/ERC721BurnableMock.sol b/contracts/mocks/ERC721BurnableMock.sol deleted file mode 100644 index ecf427681..000000000 --- a/contracts/mocks/ERC721BurnableMock.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Burnable.sol"; - -contract ERC721BurnableMock is ERC721Burnable { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory _data) public { - _safeMint(to, tokenId, _data); - } -} diff --git a/contracts/mocks/ERC721EnumerableMock.sol b/contracts/mocks/ERC721EnumerableMock.sol deleted file mode 100644 index b7ea94ee3..000000000 --- a/contracts/mocks/ERC721EnumerableMock.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Enumerable.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721EnumerableMock is ERC721Enumerable { - string private _baseTokenURI; - - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function _baseURI() internal view override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory _data) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/mocks/ERC721Mock.sol b/contracts/mocks/ERC721Mock.sol deleted file mode 100644 index a3bc839ae..000000000 --- a/contracts/mocks/ERC721Mock.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/ERC721.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721Mock is ERC721 { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory _data) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/mocks/ERC721PausableMock.sol b/contracts/mocks/ERC721PausableMock.sol deleted file mode 100644 index 753842e90..000000000 --- a/contracts/mocks/ERC721PausableMock.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Pausable.sol"; - -/** - * @title ERC721PausableMock - * This mock just provides a public mint, burn and exists functions for testing purposes - */ -contract ERC721PausableMock is ERC721Pausable { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory _data) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/mocks/ERC721RoyaltyMock.sol b/contracts/mocks/ERC721RoyaltyMock.sol deleted file mode 100644 index 6f19d5248..000000000 --- a/contracts/mocks/ERC721RoyaltyMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Royalty.sol"; - -contract ERC721RoyaltyMock is ERC721Royalty { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function setTokenRoyalty(uint256 tokenId, address recipient, uint96 fraction) public { - _setTokenRoyalty(tokenId, recipient, fraction); - } - - function setDefaultRoyalty(address recipient, uint96 fraction) public { - _setDefaultRoyalty(recipient, fraction); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function deleteDefaultRoyalty() public { - _deleteDefaultRoyalty(); - } -} diff --git a/contracts/mocks/ERC721URIStorageMock.sol b/contracts/mocks/ERC721URIStorageMock.sol deleted file mode 100644 index 4bb26b1ad..000000000 --- a/contracts/mocks/ERC721URIStorageMock.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721URIStorage.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721URIStorageMock is ERC721URIStorage { - string private _baseTokenURI; - - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function _baseURI() internal view override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function setTokenURI(uint256 tokenId, string memory _tokenURI) public { - _setTokenURI(tokenId, _tokenURI); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId, bytes memory _data) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/mocks/ERC721VotesMock.sol b/contracts/mocks/ERC721VotesMock.sol deleted file mode 100644 index acb51ebfb..000000000 --- a/contracts/mocks/ERC721VotesMock.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Votes.sol"; - -contract ERC721VotesMock is ERC721Votes { - constructor(string memory name, string memory symbol) ERC721(name, symbol) EIP712(name, "1") {} - - function getTotalSupply() public view returns (uint256) { - return _getTotalSupply(); - } - - function mint(address account, uint256 tokenId) public { - _mint(account, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/mocks/ERC777Mock.sol b/contracts/mocks/ERC777Mock.sol deleted file mode 100644 index 59c00b307..000000000 --- a/contracts/mocks/ERC777Mock.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; -import "../token/ERC777/ERC777.sol"; - -contract ERC777Mock is Context, ERC777 { - event BeforeTokenTransfer(); - - constructor( - address initialHolder, - uint256 initialBalance, - string memory name, - string memory symbol, - address[] memory defaultOperators - ) ERC777(name, symbol, defaultOperators) { - _mint(initialHolder, initialBalance, "", ""); - } - - function mintInternal(address to, uint256 amount, bytes memory userData, bytes memory operatorData) public { - _mint(to, amount, userData, operatorData); - } - - function mintInternalExtended( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) public { - _mint(to, amount, userData, operatorData, requireReceptionAck); - } - - function approveInternal(address holder, address spender, uint256 value) public { - _approve(holder, spender, value); - } - - function _beforeTokenTransfer(address, address, address, uint256) internal override { - emit BeforeTokenTransfer(); - } -} diff --git a/contracts/mocks/EnumerableMapMock.sol b/contracts/mocks/EnumerableMapMock.sol deleted file mode 100644 index b60b1e6d9..000000000 --- a/contracts/mocks/EnumerableMapMock.sol +++ /dev/null @@ -1,221 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/EnumerableMapMock.js. - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableMap.sol"; - -// UintToAddressMap -contract UintToAddressMapMock { - using EnumerableMap for EnumerableMap.UintToAddressMap; - - event OperationResult(bool result); - - EnumerableMap.UintToAddressMap private _map; - - function contains(uint256 key) public view returns (bool) { - return _map.contains(key); - } - - function set(uint256 key, address value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(uint256 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (uint256 key, address value) { - return _map.at(index); - } - - function tryGet(uint256 key) public view returns (bool, address) { - return _map.tryGet(key); - } - - function get(uint256 key) public view returns (address) { - return _map.get(key); - } - - function getWithMessage(uint256 key, string calldata errorMessage) public view returns (address) { - return _map.get(key, errorMessage); - } -} - -// AddressToUintMap -contract AddressToUintMapMock { - using EnumerableMap for EnumerableMap.AddressToUintMap; - - event OperationResult(bool result); - - EnumerableMap.AddressToUintMap private _map; - - function contains(address key) public view returns (bool) { - return _map.contains(key); - } - - function set(address key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(address key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (address key, uint256 value) { - return _map.at(index); - } - - function tryGet(address key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(address key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(address key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } -} - -// Bytes32ToBytes32Map -contract Bytes32ToBytes32MapMock { - using EnumerableMap for EnumerableMap.Bytes32ToBytes32Map; - - event OperationResult(bool result); - - EnumerableMap.Bytes32ToBytes32Map private _map; - - function contains(bytes32 key) public view returns (bool) { - return _map.contains(key); - } - - function set(bytes32 key, bytes32 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(bytes32 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (bytes32 key, bytes32 value) { - return _map.at(index); - } - - function tryGet(bytes32 key) public view returns (bool, bytes32) { - return _map.tryGet(key); - } - - function get(bytes32 key) public view returns (bytes32) { - return _map.get(key); - } - - function getWithMessage(bytes32 key, string calldata errorMessage) public view returns (bytes32) { - return _map.get(key, errorMessage); - } -} - -// UintToUintMap -contract UintToUintMapMock { - using EnumerableMap for EnumerableMap.UintToUintMap; - - event OperationResult(bool result); - - EnumerableMap.UintToUintMap private _map; - - function contains(uint256 key) public view returns (bool) { - return _map.contains(key); - } - - function set(uint256 key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(uint256 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (uint256 key, uint256 value) { - return _map.at(index); - } - - function tryGet(uint256 key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(uint256 key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(uint256 key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } -} - -// Bytes32ToUintMap -contract Bytes32ToUintMapMock { - using EnumerableMap for EnumerableMap.Bytes32ToUintMap; - - event OperationResult(bool result); - - EnumerableMap.Bytes32ToUintMap private _map; - - function contains(bytes32 key) public view returns (bool) { - return _map.contains(key); - } - - function set(bytes32 key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(bytes32 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (bytes32 key, uint256 value) { - return _map.at(index); - } - - function tryGet(bytes32 key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(bytes32 key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(bytes32 key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } -} diff --git a/contracts/mocks/EnumerableSetMock.sol b/contracts/mocks/EnumerableSetMock.sol deleted file mode 100644 index f75f38af1..000000000 --- a/contracts/mocks/EnumerableSetMock.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/EnumerableSetMock.js. - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableSet.sol"; - -// Bytes32Set -contract EnumerableBytes32SetMock { - using EnumerableSet for EnumerableSet.Bytes32Set; - - event OperationResult(bool result); - - EnumerableSet.Bytes32Set private _set; - - function contains(bytes32 value) public view returns (bool) { - return _set.contains(value); - } - - function add(bytes32 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(bytes32 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (bytes32) { - return _set.at(index); - } - - function values() public view returns (bytes32[] memory) { - return _set.values(); - } -} - -// AddressSet -contract EnumerableAddressSetMock { - using EnumerableSet for EnumerableSet.AddressSet; - - event OperationResult(bool result); - - EnumerableSet.AddressSet private _set; - - function contains(address value) public view returns (bool) { - return _set.contains(value); - } - - function add(address value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(address value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (address) { - return _set.at(index); - } - - function values() public view returns (address[] memory) { - return _set.values(); - } -} - -// UintSet -contract EnumerableUintSetMock { - using EnumerableSet for EnumerableSet.UintSet; - - event OperationResult(bool result); - - EnumerableSet.UintSet private _set; - - function contains(uint256 value) public view returns (bool) { - return _set.contains(value); - } - - function add(uint256 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(uint256 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (uint256) { - return _set.at(index); - } - - function values() public view returns (uint256[] memory) { - return _set.values(); - } -} diff --git a/contracts/mocks/GovernorCompMock.sol b/contracts/mocks/GovernorCompMock.sol deleted file mode 100644 index c2d8733e0..000000000 --- a/contracts/mocks/GovernorCompMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesComp.sol"; - -contract GovernorCompMock is GovernorVotesComp, GovernorCountingSimple { - constructor(string memory name_, ERC20VotesComp token_) Governor(name_) GovernorVotesComp(token_) {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } -} diff --git a/contracts/mocks/GovernorMock.sol b/contracts/mocks/GovernorMock.sol deleted file mode 100644 index bd2de338a..000000000 --- a/contracts/mocks/GovernorMock.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorProposalThreshold.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; - -contract GovernorMock is - GovernorProposalThreshold, - GovernorSettings, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(Governor, GovernorProposalThreshold) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } -} diff --git a/contracts/mocks/GovernorVoteMock.sol b/contracts/mocks/GovernorVoteMock.sol deleted file mode 100644 index 60a3d4135..000000000 --- a/contracts/mocks/GovernorVoteMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; - -contract GovernorVoteMocks is GovernorVotes, GovernorCountingSimple { - constructor(string memory name_, IVotes token_) Governor(name_) GovernorVotes(token_) {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } -} diff --git a/contracts/mocks/MathMock.sol b/contracts/mocks/MathMock.sol deleted file mode 100644 index be935f91d..000000000 --- a/contracts/mocks/MathMock.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/Math.sol"; - -contract MathMock { - function max(uint256 a, uint256 b) public pure returns (uint256) { - return Math.max(a, b); - } - - function min(uint256 a, uint256 b) public pure returns (uint256) { - return Math.min(a, b); - } - - function average(uint256 a, uint256 b) public pure returns (uint256) { - return Math.average(a, b); - } - - function ceilDiv(uint256 a, uint256 b) public pure returns (uint256) { - return Math.ceilDiv(a, b); - } - - function mulDiv(uint256 a, uint256 b, uint256 denominator, Math.Rounding direction) public pure returns (uint256) { - return Math.mulDiv(a, b, denominator, direction); - } - - function sqrt(uint256 a, Math.Rounding direction) public pure returns (uint256) { - return Math.sqrt(a, direction); - } - - function log2(uint256 a, Math.Rounding direction) public pure returns (uint256) { - return Math.log2(a, direction); - } - - function log10(uint256 a, Math.Rounding direction) public pure returns (uint256) { - return Math.log10(a, direction); - } - - function log256(uint256 a, Math.Rounding direction) public pure returns (uint256) { - return Math.log256(a, direction); - } -} diff --git a/contracts/mocks/MerkleProofWrapper.sol b/contracts/mocks/MerkleProofWrapper.sol deleted file mode 100644 index 60741e41c..000000000 --- a/contracts/mocks/MerkleProofWrapper.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/MerkleProof.sol"; - -contract MerkleProofWrapper { - function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) public pure returns (bool) { - return MerkleProof.verify(proof, root, leaf); - } - - function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) public pure returns (bool) { - return MerkleProof.verifyCalldata(proof, root, leaf); - } - - function processProof(bytes32[] memory proof, bytes32 leaf) public pure returns (bytes32) { - return MerkleProof.processProof(proof, leaf); - } - - function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) public pure returns (bytes32) { - return MerkleProof.processProofCalldata(proof, leaf); - } - - function multiProofVerify( - bytes32[] memory proofs, - bool[] memory proofFlag, - bytes32 root, - bytes32[] memory leaves - ) public pure returns (bool) { - return MerkleProof.multiProofVerify(proofs, proofFlag, root, leaves); - } - - function multiProofVerifyCalldata( - bytes32[] calldata proofs, - bool[] calldata proofFlag, - bytes32 root, - bytes32[] memory leaves - ) public pure returns (bool) { - return MerkleProof.multiProofVerifyCalldata(proofs, proofFlag, root, leaves); - } - - function processMultiProof( - bytes32[] memory proofs, - bool[] memory proofFlag, - bytes32[] memory leaves - ) public pure returns (bytes32) { - return MerkleProof.processMultiProof(proofs, proofFlag, leaves); - } - - function processMultiProofCalldata( - bytes32[] calldata proofs, - bool[] calldata proofFlag, - bytes32[] memory leaves - ) public pure returns (bytes32) { - return MerkleProof.processMultiProofCalldata(proofs, proofFlag, leaves); - } -} diff --git a/contracts/mocks/MulticallTest.sol b/contracts/mocks/MulticallTest.sol index 4e527eff1..fcbec6ad8 100644 --- a/contracts/mocks/MulticallTest.sol +++ b/contracts/mocks/MulticallTest.sol @@ -2,11 +2,11 @@ pragma solidity ^0.8.0; -import "./MulticallTokenMock.sol"; +import "./token/ERC20MulticallMock.sol"; contract MulticallTest { function checkReturnValues( - MulticallTokenMock multicallToken, + ERC20MulticallMock multicallToken, address[] calldata recipients, uint256[] calldata amounts ) external { diff --git a/contracts/mocks/MulticallTokenMock.sol b/contracts/mocks/MulticallTokenMock.sol deleted file mode 100644 index de379681b..000000000 --- a/contracts/mocks/MulticallTokenMock.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Multicall.sol"; -import "./ERC20Mock.sol"; - -contract MulticallTokenMock is ERC20Mock, Multicall { - constructor(uint256 initialBalance) ERC20Mock("MulticallToken", "BCT", msg.sender, initialBalance) {} -} diff --git a/contracts/mocks/Ownable2StepMock.sol b/contracts/mocks/Ownable2StepMock.sol deleted file mode 100644 index 606d0c964..000000000 --- a/contracts/mocks/Ownable2StepMock.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/Ownable2Step.sol"; - -contract Ownable2StepMock is Ownable2Step {} diff --git a/contracts/mocks/OwnableMock.sol b/contracts/mocks/OwnableMock.sol deleted file mode 100644 index d60f1c40d..000000000 --- a/contracts/mocks/OwnableMock.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/Ownable.sol"; - -contract OwnableMock is Ownable {} diff --git a/contracts/mocks/SafeCastMock.sol b/contracts/mocks/SafeCastMock.sol deleted file mode 100644 index 12a0de632..000000000 --- a/contracts/mocks/SafeCastMock.sol +++ /dev/null @@ -1,267 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/SafeCastMock.js. - -pragma solidity ^0.8.0; - -import "../utils/math/SafeCast.sol"; - -contract SafeCastMock { - using SafeCast for uint256; - using SafeCast for int256; - - function toUint256(int256 a) public pure returns (uint256) { - return a.toUint256(); - } - - function toUint248(uint256 a) public pure returns (uint248) { - return a.toUint248(); - } - - function toUint240(uint256 a) public pure returns (uint240) { - return a.toUint240(); - } - - function toUint232(uint256 a) public pure returns (uint232) { - return a.toUint232(); - } - - function toUint224(uint256 a) public pure returns (uint224) { - return a.toUint224(); - } - - function toUint216(uint256 a) public pure returns (uint216) { - return a.toUint216(); - } - - function toUint208(uint256 a) public pure returns (uint208) { - return a.toUint208(); - } - - function toUint200(uint256 a) public pure returns (uint200) { - return a.toUint200(); - } - - function toUint192(uint256 a) public pure returns (uint192) { - return a.toUint192(); - } - - function toUint184(uint256 a) public pure returns (uint184) { - return a.toUint184(); - } - - function toUint176(uint256 a) public pure returns (uint176) { - return a.toUint176(); - } - - function toUint168(uint256 a) public pure returns (uint168) { - return a.toUint168(); - } - - function toUint160(uint256 a) public pure returns (uint160) { - return a.toUint160(); - } - - function toUint152(uint256 a) public pure returns (uint152) { - return a.toUint152(); - } - - function toUint144(uint256 a) public pure returns (uint144) { - return a.toUint144(); - } - - function toUint136(uint256 a) public pure returns (uint136) { - return a.toUint136(); - } - - function toUint128(uint256 a) public pure returns (uint128) { - return a.toUint128(); - } - - function toUint120(uint256 a) public pure returns (uint120) { - return a.toUint120(); - } - - function toUint112(uint256 a) public pure returns (uint112) { - return a.toUint112(); - } - - function toUint104(uint256 a) public pure returns (uint104) { - return a.toUint104(); - } - - function toUint96(uint256 a) public pure returns (uint96) { - return a.toUint96(); - } - - function toUint88(uint256 a) public pure returns (uint88) { - return a.toUint88(); - } - - function toUint80(uint256 a) public pure returns (uint80) { - return a.toUint80(); - } - - function toUint72(uint256 a) public pure returns (uint72) { - return a.toUint72(); - } - - function toUint64(uint256 a) public pure returns (uint64) { - return a.toUint64(); - } - - function toUint56(uint256 a) public pure returns (uint56) { - return a.toUint56(); - } - - function toUint48(uint256 a) public pure returns (uint48) { - return a.toUint48(); - } - - function toUint40(uint256 a) public pure returns (uint40) { - return a.toUint40(); - } - - function toUint32(uint256 a) public pure returns (uint32) { - return a.toUint32(); - } - - function toUint24(uint256 a) public pure returns (uint24) { - return a.toUint24(); - } - - function toUint16(uint256 a) public pure returns (uint16) { - return a.toUint16(); - } - - function toUint8(uint256 a) public pure returns (uint8) { - return a.toUint8(); - } - - function toInt256(uint256 a) public pure returns (int256) { - return a.toInt256(); - } - - function toInt248(int256 a) public pure returns (int248) { - return a.toInt248(); - } - - function toInt240(int256 a) public pure returns (int240) { - return a.toInt240(); - } - - function toInt232(int256 a) public pure returns (int232) { - return a.toInt232(); - } - - function toInt224(int256 a) public pure returns (int224) { - return a.toInt224(); - } - - function toInt216(int256 a) public pure returns (int216) { - return a.toInt216(); - } - - function toInt208(int256 a) public pure returns (int208) { - return a.toInt208(); - } - - function toInt200(int256 a) public pure returns (int200) { - return a.toInt200(); - } - - function toInt192(int256 a) public pure returns (int192) { - return a.toInt192(); - } - - function toInt184(int256 a) public pure returns (int184) { - return a.toInt184(); - } - - function toInt176(int256 a) public pure returns (int176) { - return a.toInt176(); - } - - function toInt168(int256 a) public pure returns (int168) { - return a.toInt168(); - } - - function toInt160(int256 a) public pure returns (int160) { - return a.toInt160(); - } - - function toInt152(int256 a) public pure returns (int152) { - return a.toInt152(); - } - - function toInt144(int256 a) public pure returns (int144) { - return a.toInt144(); - } - - function toInt136(int256 a) public pure returns (int136) { - return a.toInt136(); - } - - function toInt128(int256 a) public pure returns (int128) { - return a.toInt128(); - } - - function toInt120(int256 a) public pure returns (int120) { - return a.toInt120(); - } - - function toInt112(int256 a) public pure returns (int112) { - return a.toInt112(); - } - - function toInt104(int256 a) public pure returns (int104) { - return a.toInt104(); - } - - function toInt96(int256 a) public pure returns (int96) { - return a.toInt96(); - } - - function toInt88(int256 a) public pure returns (int88) { - return a.toInt88(); - } - - function toInt80(int256 a) public pure returns (int80) { - return a.toInt80(); - } - - function toInt72(int256 a) public pure returns (int72) { - return a.toInt72(); - } - - function toInt64(int256 a) public pure returns (int64) { - return a.toInt64(); - } - - function toInt56(int256 a) public pure returns (int56) { - return a.toInt56(); - } - - function toInt48(int256 a) public pure returns (int48) { - return a.toInt48(); - } - - function toInt40(int256 a) public pure returns (int40) { - return a.toInt40(); - } - - function toInt32(int256 a) public pure returns (int32) { - return a.toInt32(); - } - - function toInt24(int256 a) public pure returns (int24) { - return a.toInt24(); - } - - function toInt16(int256 a) public pure returns (int16) { - return a.toInt16(); - } - - function toInt8(int256 a) public pure returns (int8) { - return a.toInt8(); - } -} diff --git a/contracts/mocks/SafeERC20Helper.sol b/contracts/mocks/SafeERC20Helper.sol deleted file mode 100644 index 237e32041..000000000 --- a/contracts/mocks/SafeERC20Helper.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; -import "../token/ERC20/IERC20.sol"; -import "../token/ERC20/extensions/ERC20Permit.sol"; -import "../token/ERC20/utils/SafeERC20.sol"; - -contract ERC20ReturnFalseMock is Context { - uint256 private _allowance; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function transferFrom(address, address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function allowance(address, address) public view returns (uint256) { - require(_dummy == 0); // Dummy read from a state variable so that the function is view - return 0; - } -} - -contract ERC20ReturnTrueMock is Context { - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function transferFrom(address, address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } -} - -contract ERC20NoReturnMock is Context { - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public { - _dummy = 0; - } - - function transferFrom(address, address, uint256) public { - _dummy = 0; - } - - function approve(address, uint256) public { - _dummy = 0; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } -} - -contract ERC20PermitNoRevertMock is - ERC20("ERC20PermitNoRevertMock", "ERC20PermitNoRevertMock"), - ERC20Permit("ERC20PermitNoRevertMock") -{ - function getChainId() external view returns (uint256) { - return block.chainid; - } - - function permitThatMayRevert( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public { - super.permit(owner, spender, value, deadline, v, r, s); - } - - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public override { - try this.permitThatMayRevert(owner, spender, value, deadline, v, r, s) { - // do nothing - } catch { - // do nothing - } - } -} - -contract SafeERC20Wrapper is Context { - using SafeERC20 for IERC20; - - IERC20 private _token; - - constructor(IERC20 token) { - _token = token; - } - - function transfer() public { - _token.safeTransfer(address(0), 0); - } - - function transferFrom() public { - _token.safeTransferFrom(address(0), address(0), 0); - } - - function approve(uint256 amount) public { - _token.safeApprove(address(0), amount); - } - - function increaseAllowance(uint256 amount) public { - _token.safeIncreaseAllowance(address(0), amount); - } - - function decreaseAllowance(uint256 amount) public { - _token.safeDecreaseAllowance(address(0), amount); - } - - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public { - SafeERC20.safePermit(IERC20Permit(address(_token)), owner, spender, value, deadline, v, r, s); - } - - function setAllowance(uint256 allowance_) public { - ERC20ReturnTrueMock(address(_token)).setAllowance(allowance_); - } - - function allowance() public view returns (uint256) { - return _token.allowance(address(0), address(0)); - } -} diff --git a/contracts/mocks/SafeMathMemoryCheck.sol b/contracts/mocks/SafeMathMemoryCheck.sol new file mode 100644 index 000000000..96946881a --- /dev/null +++ b/contracts/mocks/SafeMathMemoryCheck.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../utils/math/SafeMath.sol"; + +library SafeMathMemoryCheck { + function addMemoryCheck() internal pure returns (uint256 mem) { + uint256 length = 32; + assembly { + mem := mload(0x40) + } + for (uint256 i = 0; i < length; ++i) { + SafeMath.add(1, 1); + } + assembly { + mem := sub(mload(0x40), mem) + } + } + + function subMemoryCheck() internal pure returns (uint256 mem) { + uint256 length = 32; + assembly { + mem := mload(0x40) + } + for (uint256 i = 0; i < length; ++i) { + SafeMath.sub(1, 1); + } + assembly { + mem := sub(mload(0x40), mem) + } + } + + function mulMemoryCheck() internal pure returns (uint256 mem) { + uint256 length = 32; + assembly { + mem := mload(0x40) + } + for (uint256 i = 0; i < length; ++i) { + SafeMath.mul(1, 1); + } + assembly { + mem := sub(mload(0x40), mem) + } + } + + function divMemoryCheck() internal pure returns (uint256 mem) { + uint256 length = 32; + assembly { + mem := mload(0x40) + } + for (uint256 i = 0; i < length; ++i) { + SafeMath.div(1, 1); + } + assembly { + mem := sub(mload(0x40), mem) + } + } + + function modMemoryCheck() internal pure returns (uint256 mem) { + uint256 length = 32; + assembly { + mem := mload(0x40) + } + for (uint256 i = 0; i < length; ++i) { + SafeMath.mod(1, 1); + } + assembly { + mem := sub(mload(0x40), mem) + } + } +} diff --git a/contracts/mocks/SafeMathMock.sol b/contracts/mocks/SafeMathMock.sol deleted file mode 100644 index ef504e3ab..000000000 --- a/contracts/mocks/SafeMathMock.sol +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SafeMath.sol"; - -contract SafeMathMock { - function tryAdd(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryAdd(a, b); - } - - function trySub(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.trySub(a, b); - } - - function tryMul(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryMul(a, b); - } - - function tryDiv(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryDiv(a, b); - } - - function tryMod(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryMod(a, b); - } - - // using the do* naming convention to avoid warnings due to clashing opcode names - - function doAdd(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.add(a, b); - } - - function doSub(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.sub(a, b); - } - - function doMul(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.mul(a, b); - } - - function doDiv(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.div(a, b); - } - - function doMod(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.mod(a, b); - } - - function subWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { - return SafeMath.sub(a, b, errorMessage); - } - - function divWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { - return SafeMath.div(a, b, errorMessage); - } - - function modWithMessage(uint256 a, uint256 b, string memory errorMessage) public pure returns (uint256) { - return SafeMath.mod(a, b, errorMessage); - } - - function addMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.add(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function subMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.sub(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function mulMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.mul(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function divMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.div(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function modMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.mod(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } -} diff --git a/contracts/mocks/SignatureCheckerMock.sol b/contracts/mocks/SignatureCheckerMock.sol deleted file mode 100644 index 5671540ec..000000000 --- a/contracts/mocks/SignatureCheckerMock.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/SignatureChecker.sol"; - -contract SignatureCheckerMock { - using SignatureChecker for address; - - function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) public view returns (bool) { - return signer.isValidSignatureNow(hash, signature); - } -} diff --git a/contracts/mocks/SignedMathMock.sol b/contracts/mocks/SignedMathMock.sol deleted file mode 100644 index 5a0b27096..000000000 --- a/contracts/mocks/SignedMathMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedMath.sol"; - -contract SignedMathMock { - function max(int256 a, int256 b) public pure returns (int256) { - return SignedMath.max(a, b); - } - - function min(int256 a, int256 b) public pure returns (int256) { - return SignedMath.min(a, b); - } - - function average(int256 a, int256 b) public pure returns (int256) { - return SignedMath.average(a, b); - } - - function abs(int256 n) public pure returns (uint256) { - return SignedMath.abs(n); - } -} diff --git a/contracts/mocks/SignedSafeMathMock.sol b/contracts/mocks/SignedSafeMathMock.sol deleted file mode 100644 index 8d1021798..000000000 --- a/contracts/mocks/SignedSafeMathMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedSafeMath.sol"; - -contract SignedSafeMathMock { - function mul(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.mul(a, b); - } - - function div(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.div(a, b); - } - - function sub(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.sub(a, b); - } - - function add(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.add(a, b); - } -} diff --git a/contracts/mocks/StringsMock.sol b/contracts/mocks/StringsMock.sol deleted file mode 100644 index 9f98e2778..000000000 --- a/contracts/mocks/StringsMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Strings.sol"; - -contract StringsMock { - function toString(uint256 value) public pure returns (string memory) { - return Strings.toString(value); - } - - function toString(int256 value) public pure returns (string memory) { - return Strings.toString(value); - } - - function toHexString(uint256 value) public pure returns (string memory) { - return Strings.toHexString(value); - } - - function toHexString(uint256 value, uint256 length) public pure returns (string memory) { - return Strings.toHexString(value, length); - } - - function toHexString(address addr) public pure returns (string memory) { - return Strings.toHexString(addr); - } - - function equal(string memory a, string memory b) public pure returns (bool) { - return Strings.equal(a, b); - } -} diff --git a/contracts/mocks/VotesMock.sol b/contracts/mocks/VotesMock.sol index f888490da..ece08b075 100644 --- a/contracts/mocks/VotesMock.sol +++ b/contracts/mocks/VotesMock.sol @@ -4,12 +4,10 @@ pragma solidity ^0.8.0; import "../governance/utils/Votes.sol"; -contract VotesMock is Votes { +abstract contract VotesMock is Votes { mapping(address => uint256) private _balances; mapping(uint256 => address) private _owners; - constructor(string memory name) EIP712(name, "1") {} - function getTotalSupply() public view returns (uint256) { return _getTotalSupply(); } @@ -22,19 +20,15 @@ contract VotesMock is Votes { return _balances[account]; } - function mint(address account, uint256 voteId) external { + function _mint(address account, uint256 voteId) internal { _balances[account] += 1; _owners[voteId] = account; _transferVotingUnits(address(0), account, 1); } - function burn(uint256 voteId) external { + function _burn(uint256 voteId) internal { address owner = _owners[voteId]; _balances[owner] -= 1; _transferVotingUnits(owner, address(0), 1); } - - function getChainId() external view returns (uint256) { - return block.chainid; - } } diff --git a/contracts/mocks/governance/GovernorCompMock.sol b/contracts/mocks/governance/GovernorCompMock.sol new file mode 100644 index 000000000..cc368c42f --- /dev/null +++ b/contracts/mocks/governance/GovernorCompMock.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotesComp.sol"; + +abstract contract GovernorCompMock is GovernorVotesComp, GovernorCountingSimple { + function quorum(uint256) public pure override returns (uint256) { + return 0; + } + + function votingDelay() public pure override returns (uint256) { + return 4; + } + + function votingPeriod() public pure override returns (uint256) { + return 16; + } +} diff --git a/contracts/mocks/GovernorCompatibilityBravoMock.sol b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol similarity index 71% rename from contracts/mocks/GovernorCompatibilityBravoMock.sol rename to contracts/mocks/governance/GovernorCompatibilityBravoMock.sol index d3b4f707d..4356bce7f 100644 --- a/contracts/mocks/GovernorCompatibilityBravoMock.sol +++ b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol @@ -2,30 +2,20 @@ pragma solidity ^0.8.0; -import "../governance/compatibility/GovernorCompatibilityBravo.sol"; -import "../governance/extensions/GovernorTimelockCompound.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorVotesComp.sol"; +import "../../governance/compatibility/GovernorCompatibilityBravo.sol"; +import "../../governance/extensions/GovernorTimelockCompound.sol"; +import "../../governance/extensions/GovernorSettings.sol"; +import "../../governance/extensions/GovernorVotesComp.sol"; -contract GovernorCompatibilityBravoMock is +abstract contract GovernorCompatibilityBravoMock is GovernorCompatibilityBravo, GovernorSettings, GovernorTimelockCompound, GovernorVotesComp { - constructor( - string memory name_, - ERC20VotesComp token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 proposalThreshold_, - ICompoundTimelock timelock_ - ) - Governor(name_) - GovernorTimelockCompound(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, proposalThreshold_) - GovernorVotesComp(token_) - {} + function quorum(uint256) public pure override returns (uint256) { + return 0; + } function supportsInterface( bytes4 interfaceId @@ -33,10 +23,6 @@ contract GovernorCompatibilityBravoMock is return super.supportsInterface(interfaceId); } - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - function state( uint256 proposalId ) public view override(IGovernor, Governor, GovernorTimelockCompound) returns (ProposalState) { @@ -90,19 +76,6 @@ contract GovernorCompatibilityBravoMock is super._execute(proposalId, targets, values, calldatas, descriptionHash); } - /** - * @notice WARNING: this is for mock purposes only. Ability to the _cancel function should be restricted for live - * deployments. - */ - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - function _cancel( address[] memory targets, uint256[] memory values, diff --git a/contracts/mocks/governance/GovernorMock.sol b/contracts/mocks/governance/GovernorMock.sol new file mode 100644 index 000000000..8a1db4704 --- /dev/null +++ b/contracts/mocks/governance/GovernorMock.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../governance/extensions/GovernorProposalThreshold.sol"; +import "../../governance/extensions/GovernorSettings.sol"; +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; + +abstract contract GovernorMock is + GovernorProposalThreshold, + GovernorSettings, + GovernorVotesQuorumFraction, + GovernorCountingSimple +{ + function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { + return super.proposalThreshold(); + } + + function propose( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + string memory description + ) public override(Governor, GovernorProposalThreshold) returns (uint256) { + return super.propose(targets, values, calldatas, description); + } +} diff --git a/contracts/mocks/GovernorPreventLateQuorumMock.sol b/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol similarity index 61% rename from contracts/mocks/GovernorPreventLateQuorumMock.sol rename to contracts/mocks/governance/GovernorPreventLateQuorumMock.sol index b6b5e7619..79d894896 100644 --- a/contracts/mocks/GovernorPreventLateQuorumMock.sol +++ b/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.0; -import "../governance/extensions/GovernorPreventLateQuorum.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; +import "../../governance/extensions/GovernorPreventLateQuorum.sol"; +import "../../governance/extensions/GovernorSettings.sol"; +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotes.sol"; -contract GovernorPreventLateQuorumMock is +abstract contract GovernorPreventLateQuorumMock is GovernorSettings, GovernorVotes, GovernorCountingSimple, @@ -15,19 +15,7 @@ contract GovernorPreventLateQuorumMock is { uint256 private _quorum; - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorum_, - uint64 voteExtension_ - ) - Governor(name_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorPreventLateQuorum(voteExtension_) - { + constructor(uint256 quorum_) { _quorum = quorum_; } diff --git a/contracts/mocks/GovernorTimelockCompoundMock.sol b/contracts/mocks/governance/GovernorTimelockCompoundMock.sol similarity index 62% rename from contracts/mocks/GovernorTimelockCompoundMock.sol rename to contracts/mocks/governance/GovernorTimelockCompoundMock.sol index 75a2f3c14..b37462819 100644 --- a/contracts/mocks/GovernorTimelockCompoundMock.sol +++ b/contracts/mocks/governance/GovernorTimelockCompoundMock.sol @@ -2,32 +2,17 @@ pragma solidity ^0.8.0; -import "../governance/extensions/GovernorTimelockCompound.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; +import "../../governance/extensions/GovernorTimelockCompound.sol"; +import "../../governance/extensions/GovernorSettings.sol"; +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; -contract GovernorTimelockCompoundMock is +abstract contract GovernorTimelockCompoundMock is GovernorSettings, GovernorTimelockCompound, GovernorVotesQuorumFraction, GovernorCountingSimple { - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - ICompoundTimelock timelock_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorTimelockCompound(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - function supportsInterface( bytes4 interfaceId ) public view override(Governor, GovernorTimelockCompound) returns (bool) { @@ -40,18 +25,6 @@ contract GovernorTimelockCompoundMock is return super.quorum(blockNumber); } - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * Overriding nightmare - */ function state( uint256 proposalId ) public view override(Governor, GovernorTimelockCompound) returns (ProposalState) { diff --git a/contracts/mocks/GovernorTimelockControlMock.sol b/contracts/mocks/governance/GovernorTimelockControlMock.sol similarity index 62% rename from contracts/mocks/GovernorTimelockControlMock.sol rename to contracts/mocks/governance/GovernorTimelockControlMock.sol index 671a1e0ea..06309145a 100644 --- a/contracts/mocks/GovernorTimelockControlMock.sol +++ b/contracts/mocks/governance/GovernorTimelockControlMock.sol @@ -2,32 +2,17 @@ pragma solidity ^0.8.0; -import "../governance/extensions/GovernorTimelockControl.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; +import "../../governance/extensions/GovernorTimelockControl.sol"; +import "../../governance/extensions/GovernorSettings.sol"; +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; -contract GovernorTimelockControlMock is +abstract contract GovernorTimelockControlMock is GovernorSettings, GovernorTimelockControl, GovernorVotesQuorumFraction, GovernorCountingSimple { - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - TimelockController timelock_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorTimelockControl(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - function supportsInterface( bytes4 interfaceId ) public view override(Governor, GovernorTimelockControl) returns (bool) { @@ -40,18 +25,6 @@ contract GovernorTimelockControlMock is return super.quorum(blockNumber); } - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, descriptionHash); - } - - /** - * Overriding nightmare - */ function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) { return super.state(proposalId); } diff --git a/contracts/mocks/governance/GovernorVoteMock.sol b/contracts/mocks/governance/GovernorVoteMock.sol new file mode 100644 index 000000000..9b533bddf --- /dev/null +++ b/contracts/mocks/governance/GovernorVoteMock.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotes.sol"; + +abstract contract GovernorVoteMocks is GovernorVotes, GovernorCountingSimple { + function quorum(uint256) public pure override returns (uint256) { + return 0; + } + + function votingDelay() public pure override returns (uint256) { + return 4; + } + + function votingPeriod() public pure override returns (uint256) { + return 16; + } +} diff --git a/contracts/mocks/GovernorWithParamsMock.sol b/contracts/mocks/governance/GovernorWithParamsMock.sol similarity index 72% rename from contracts/mocks/GovernorWithParamsMock.sol rename to contracts/mocks/governance/GovernorWithParamsMock.sol index b5da8906a..361c2873e 100644 --- a/contracts/mocks/GovernorWithParamsMock.sol +++ b/contracts/mocks/governance/GovernorWithParamsMock.sol @@ -2,14 +2,12 @@ pragma solidity ^0.8.0; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; +import "../../governance/extensions/GovernorCountingSimple.sol"; +import "../../governance/extensions/GovernorVotes.sol"; -contract GovernorWithParamsMock is GovernorVotes, GovernorCountingSimple { +abstract contract GovernorWithParamsMock is GovernorVotes, GovernorCountingSimple { event CountParams(uint256 uintParam, string strParam); - constructor(string memory name_, IVotes token_) Governor(name_) GovernorVotes(token_) {} - function quorum(uint256) public pure override returns (uint256) { return 0; } @@ -49,13 +47,4 @@ contract GovernorWithParamsMock is GovernorVotes, GovernorCountingSimple { } return super._countVote(proposalId, account, support, weight, params); } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } } diff --git a/contracts/mocks/BadBeacon.sol b/contracts/mocks/proxy/BadBeacon.sol similarity index 100% rename from contracts/mocks/BadBeacon.sol rename to contracts/mocks/proxy/BadBeacon.sol diff --git a/contracts/mocks/ClashingImplementation.sol b/contracts/mocks/proxy/ClashingImplementation.sol similarity index 100% rename from contracts/mocks/ClashingImplementation.sol rename to contracts/mocks/proxy/ClashingImplementation.sol diff --git a/contracts/mocks/UUPS/UUPSLegacy.sol b/contracts/mocks/proxy/UUPSLegacy.sol similarity index 100% rename from contracts/mocks/UUPS/UUPSLegacy.sol rename to contracts/mocks/proxy/UUPSLegacy.sol diff --git a/contracts/mocks/UUPS/UUPSUpgradeableMock.sol b/contracts/mocks/proxy/UUPSUpgradeableMock.sol similarity index 63% rename from contracts/mocks/UUPS/UUPSUpgradeableMock.sol rename to contracts/mocks/proxy/UUPSUpgradeableMock.sol index 35a74c353..deb20a000 100644 --- a/contracts/mocks/UUPS/UUPSUpgradeableMock.sol +++ b/contracts/mocks/proxy/UUPSUpgradeableMock.sol @@ -2,10 +2,22 @@ pragma solidity ^0.8.0; -import "../CountersImpl.sol"; import "../../proxy/utils/UUPSUpgradeable.sol"; +import "../../utils/Counters.sol"; -contract UUPSUpgradeableMock is CountersImpl, UUPSUpgradeable { +contract NonUpgradeableMock { + Counters.Counter internal _counter; + + function current() external view returns (uint256) { + return Counters.current(_counter); + } + + function increment() external { + return Counters.increment(_counter); + } +} + +contract UUPSUpgradeableMock is NonUpgradeableMock, UUPSUpgradeable { // Not having any checks in this function is dangerous! Do not do this outside tests! function _authorizeUpgrade(address) internal override {} } diff --git a/contracts/mocks/ERC1155ReceiverMock.sol b/contracts/mocks/token/ERC1155ReceiverMock.sol similarity index 93% rename from contracts/mocks/ERC1155ReceiverMock.sol rename to contracts/mocks/token/ERC1155ReceiverMock.sol index b2d505c0a..317d72425 100644 --- a/contracts/mocks/ERC1155ReceiverMock.sol +++ b/contracts/mocks/token/ERC1155ReceiverMock.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; -import "../token/ERC1155/IERC1155Receiver.sol"; -import "../utils/introspection/ERC165.sol"; +import "../../token/ERC1155/IERC1155Receiver.sol"; +import "../../utils/introspection/ERC165.sol"; contract ERC1155ReceiverMock is ERC165, IERC1155Receiver { bytes4 private _recRetval; diff --git a/contracts/mocks/token/ERC20DecimalsMock.sol b/contracts/mocks/token/ERC20DecimalsMock.sol new file mode 100644 index 000000000..32f287470 --- /dev/null +++ b/contracts/mocks/token/ERC20DecimalsMock.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/ERC20.sol"; + +abstract contract ERC20DecimalsMock is ERC20 { + uint8 private immutable _decimals; + + constructor(uint8 decimals_) { + _decimals = decimals_; + } + + function decimals() public view override returns (uint8) { + return _decimals; + } +} diff --git a/contracts/mocks/ERC20FlashMintMock.sol b/contracts/mocks/token/ERC20FlashMintMock.sol similarity index 52% rename from contracts/mocks/ERC20FlashMintMock.sol rename to contracts/mocks/token/ERC20FlashMintMock.sol index ff6f252e8..b4de7b771 100644 --- a/contracts/mocks/ERC20FlashMintMock.sol +++ b/contracts/mocks/token/ERC20FlashMintMock.sol @@ -2,25 +2,12 @@ pragma solidity ^0.8.0; -import "../token/ERC20/extensions/ERC20FlashMint.sol"; +import "../../token/ERC20/extensions/ERC20FlashMint.sol"; -contract ERC20FlashMintMock is ERC20FlashMint { +abstract contract ERC20FlashMintMock is ERC20FlashMint { uint256 _flashFeeAmount; address _flashFeeReceiverAddress; - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - function setFlashFee(uint256 amount) public { _flashFeeAmount = amount; } @@ -33,10 +20,6 @@ contract ERC20FlashMintMock is ERC20FlashMint { _flashFeeReceiverAddress = receiver; } - function flashFeeReceiver() public view returns (address) { - return _flashFeeReceiver(); - } - function _flashFeeReceiver() internal view override returns (address) { return _flashFeeReceiverAddress; } diff --git a/contracts/mocks/token/ERC20MulticallMock.sol b/contracts/mocks/token/ERC20MulticallMock.sol new file mode 100644 index 000000000..145e97a62 --- /dev/null +++ b/contracts/mocks/token/ERC20MulticallMock.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/ERC20.sol"; +import "../../utils/Multicall.sol"; + +abstract contract ERC20MulticallMock is ERC20, Multicall {} diff --git a/contracts/mocks/token/ERC20NoReturnMock.sol b/contracts/mocks/token/ERC20NoReturnMock.sol new file mode 100644 index 000000000..023dab2cb --- /dev/null +++ b/contracts/mocks/token/ERC20NoReturnMock.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +contract ERC20NoReturnMock { + mapping(address => uint256) private _allowances; + + function transfer(address, uint256) public {} + + function transferFrom(address, address, uint256) public {} + + function approve(address, uint256) public {} + + function setAllowance(address account, uint256 allowance_) public { + _allowances[account] = allowance_; + } + + function allowance(address owner, address) public view returns (uint256) { + return _allowances[owner]; + } +} diff --git a/contracts/mocks/token/ERC20PermitNoRevertMock.sol b/contracts/mocks/token/ERC20PermitNoRevertMock.sol new file mode 100644 index 000000000..2b6e2503b --- /dev/null +++ b/contracts/mocks/token/ERC20PermitNoRevertMock.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/ERC20.sol"; +import "../../token/ERC20/extensions/draft-ERC20Permit.sol"; + +contract ERC20PermitNoRevertMock is ERC20, ERC20Permit { + constructor() ERC20("ERC20PermitNoRevertMock", "ERC20PermitNoRevertMock") ERC20Permit("ERC20PermitNoRevertMock") {} + + function permitThatMayRevert( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual { + super.permit(owner, spender, value, deadline, v, r, s); + } + + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual override { + try this.permitThatMayRevert(owner, spender, value, deadline, v, r, s) { + // do nothing + } catch { + // do nothing + } + } +} diff --git a/contracts/mocks/token/ERC20ReturnFalseMock copy.sol b/contracts/mocks/token/ERC20ReturnFalseMock copy.sol new file mode 100644 index 000000000..3f8f64037 --- /dev/null +++ b/contracts/mocks/token/ERC20ReturnFalseMock copy.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +contract ERC20ReturnFalseMock { + mapping(address => uint256) private _allowances; + + function transfer(address, uint256) public pure returns (bool) { + return false; + } + + function transferFrom(address, address, uint256) public pure returns (bool) { + return false; + } + + function approve(address, uint256) public pure returns (bool) { + return false; + } + + function setAllowance(address account, uint256 allowance_) public { + _allowances[account] = allowance_; + } + + function allowance(address owner, address) public view returns (uint256) { + return _allowances[owner]; + } +} diff --git a/contracts/mocks/token/ERC20ReturnTrueMock.sol b/contracts/mocks/token/ERC20ReturnTrueMock.sol new file mode 100644 index 000000000..8953aad64 --- /dev/null +++ b/contracts/mocks/token/ERC20ReturnTrueMock.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +contract ERC20ReturnTrueMock { + mapping(address => uint256) private _allowances; + + function transfer(address, uint256) public pure returns (bool) { + return true; + } + + function transferFrom(address, address, uint256) public pure returns (bool) { + return true; + } + + function approve(address, uint256) public pure returns (bool) { + return true; + } + + function setAllowance(address account, uint256 allowance_) public { + _allowances[account] = allowance_; + } + + function allowance(address owner, address) public view returns (uint256) { + return _allowances[owner]; + } +} diff --git a/contracts/mocks/token/ERC4626DecimalsMock.sol b/contracts/mocks/token/ERC4626DecimalsMock.sol new file mode 100644 index 000000000..9cce5139c --- /dev/null +++ b/contracts/mocks/token/ERC4626DecimalsMock.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/extensions/ERC4626.sol"; + +abstract contract ERC4626DecimalsMock is ERC4626 { + using Math for uint256; + + uint8 private immutable _decimals; + + constructor(uint8 decimals_) { + _decimals = decimals_; + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; + } + + function _initialConvertToShares( + uint256 assets, + Math.Rounding rounding + ) internal view virtual override returns (uint256 shares) { + return assets.mulDiv(10 ** decimals(), 10 ** super.decimals(), rounding); + } + + function _initialConvertToAssets( + uint256 shares, + Math.Rounding rounding + ) internal view virtual override returns (uint256 assets) { + return shares.mulDiv(10 ** super.decimals(), 10 ** decimals(), rounding); + } +} diff --git a/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol b/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol similarity index 92% rename from contracts/mocks/ERC721ConsecutiveEnumerableMock.sol rename to contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol index f4f5c5832..55c40ac17 100644 --- a/contracts/mocks/ERC721ConsecutiveEnumerableMock.sol +++ b/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.0; -import "../token/ERC721/extensions/ERC721Consecutive.sol"; -import "../token/ERC721/extensions/ERC721Enumerable.sol"; +import "../../token/ERC721/extensions/ERC721Consecutive.sol"; +import "../../token/ERC721/extensions/ERC721Enumerable.sol"; contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable { constructor( diff --git a/contracts/mocks/ERC721ConsecutiveMock.sol b/contracts/mocks/token/ERC721ConsecutiveMock.sol similarity index 64% rename from contracts/mocks/ERC721ConsecutiveMock.sol rename to contracts/mocks/token/ERC721ConsecutiveMock.sol index add5ab160..427f44a19 100644 --- a/contracts/mocks/ERC721ConsecutiveMock.sol +++ b/contracts/mocks/token/ERC721ConsecutiveMock.sol @@ -2,16 +2,15 @@ pragma solidity ^0.8.0; -import "../token/ERC721/extensions/ERC721Burnable.sol"; -import "../token/ERC721/extensions/ERC721Consecutive.sol"; -import "../token/ERC721/extensions/ERC721Enumerable.sol"; -import "../token/ERC721/extensions/ERC721Pausable.sol"; -import "../token/ERC721/extensions/ERC721Votes.sol"; +import "../../token/ERC721/extensions/ERC721Consecutive.sol"; +import "../../token/ERC721/extensions/ERC721Enumerable.sol"; +import "../../token/ERC721/extensions/ERC721Pausable.sol"; +import "../../token/ERC721/extensions/draft-ERC721Votes.sol"; /** * @title ERC721ConsecutiveMock */ -contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausable, ERC721Votes { +contract ERC721ConsecutiveMock is ERC721Consecutive, ERC721Pausable, ERC721Votes { constructor( string memory name, string memory symbol, @@ -28,30 +27,6 @@ contract ERC721ConsecutiveMock is ERC721Burnable, ERC721Consecutive, ERC721Pausa } } - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function mintConsecutive(address to, uint96 amount) public { - _mintConsecutive(to, amount); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) { return super._ownerOf(tokenId); } diff --git a/contracts/mocks/ERC721ReceiverMock.sol b/contracts/mocks/token/ERC721ReceiverMock.sol similarity index 95% rename from contracts/mocks/ERC721ReceiverMock.sol rename to contracts/mocks/token/ERC721ReceiverMock.sol index a4923bfd5..dd25788d4 100644 --- a/contracts/mocks/ERC721ReceiverMock.sol +++ b/contracts/mocks/token/ERC721ReceiverMock.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../token/ERC721/IERC721Receiver.sol"; +import "../../token/ERC721/IERC721Receiver.sol"; contract ERC721ReceiverMock is IERC721Receiver { enum Error { diff --git a/contracts/mocks/token/ERC721URIStorageMock.sol b/contracts/mocks/token/ERC721URIStorageMock.sol new file mode 100644 index 000000000..455c933c8 --- /dev/null +++ b/contracts/mocks/token/ERC721URIStorageMock.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC721/extensions/ERC721URIStorage.sol"; + +abstract contract ERC721URIStorageMock is ERC721URIStorage { + string private _baseTokenURI; + + function _baseURI() internal view virtual override returns (string memory) { + return _baseTokenURI; + } + + function setBaseURI(string calldata newBaseTokenURI) public { + _baseTokenURI = newBaseTokenURI; + } +} diff --git a/contracts/mocks/token/ERC777Mock.sol b/contracts/mocks/token/ERC777Mock.sol new file mode 100644 index 000000000..685277e8b --- /dev/null +++ b/contracts/mocks/token/ERC777Mock.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC777/ERC777.sol"; + +abstract contract ERC777Mock is ERC777 { + event BeforeTokenTransfer(); + + function _beforeTokenTransfer(address, address, address, uint256) internal override { + emit BeforeTokenTransfer(); + } +} diff --git a/contracts/mocks/ERC777SenderRecipientMock.sol b/contracts/mocks/token/ERC777SenderRecipientMock.sol similarity index 93% rename from contracts/mocks/ERC777SenderRecipientMock.sol rename to contracts/mocks/token/ERC777SenderRecipientMock.sol index 8e8c749ce..3bec6d94b 100644 --- a/contracts/mocks/ERC777SenderRecipientMock.sol +++ b/contracts/mocks/token/ERC777SenderRecipientMock.sol @@ -2,12 +2,12 @@ pragma solidity ^0.8.0; -import "../token/ERC777/IERC777.sol"; -import "../token/ERC777/IERC777Sender.sol"; -import "../token/ERC777/IERC777Recipient.sol"; -import "../utils/Context.sol"; -import "../utils/introspection/IERC1820Registry.sol"; -import "../utils/introspection/ERC1820Implementer.sol"; +import "../../token/ERC777/IERC777.sol"; +import "../../token/ERC777/IERC777Sender.sol"; +import "../../token/ERC777/IERC777Recipient.sol"; +import "../../utils/Context.sol"; +import "../../utils/introspection/IERC1820Registry.sol"; +import "../../utils/introspection/ERC1820Implementer.sol"; contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient, ERC1820Implementer { event TokensToSendCalled( diff --git a/hardhat.config.js b/hardhat.config.js index 4dbff0e4e..1722faf91 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -51,13 +51,10 @@ const argv = require('yargs/yargs')() require('@nomiclabs/hardhat-truffle5'); require('hardhat-ignore-warnings'); +require('hardhat-exposed'); require('solidity-docgen'); -if (argv.gas) { - require('hardhat-gas-reporter'); -} - for (const f of fs.readdirSync(path.join(__dirname, 'hardhat'))) { require(path.join(__dirname, 'hardhat', f)); } @@ -91,13 +88,24 @@ module.exports = { allowUnlimitedContractSize: !withOptimizations, }, }, - gasReporter: { + exposed: { + exclude: [ + 'vendor/**/*', + // overflow clash + 'utils/Timers.sol', + ], + }, + docgen: require('./docs/config'), +}; + +if (argv.gas) { + require('hardhat-gas-reporter'); + module.exports.gasReporter = { showMethodSig: true, currency: 'USD', outputFile: argv.gasReport, coinmarketcap: argv.coinmarketcap, - }, - docgen: require('./docs/config'), + }; }; if (argv.coverage) { diff --git a/package-lock.json b/package-lock.json index 5524f8a12..172fa0944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", + "hardhat-exposed": "^0.3.0", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", @@ -6905,6 +6906,19 @@ } } }, + "node_modules/hardhat-exposed": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.0.tgz", + "integrity": "sha512-1p2Aou7QW3VVI0iJhh3q9hgPyF66zggeW7v/PrcipniQqaXK+KxJnnJvzGsLvXYzB8lVp23GIK7MXoTjjyXkHQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.4", + "solidity-ast": "^0.4.25" + }, + "peerDependencies": { + "hardhat": "^2.3.0" + } + }, "node_modules/hardhat-gas-reporter": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", @@ -9990,6 +10004,89 @@ "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, + "node_modules/prettier-plugin-solidity/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/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, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/string-width/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/prettier-plugin-solidity/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier-plugin-solidity/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/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -20019,6 +20116,16 @@ } } }, + "hardhat-exposed": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.0.tgz", + "integrity": "sha512-1p2Aou7QW3VVI0iJhh3q9hgPyF66zggeW7v/PrcipniQqaXK+KxJnnJvzGsLvXYzB8lVp23GIK7MXoTjjyXkHQ==", + "dev": true, + "requires": { + "micromatch": "^4.0.4", + "solidity-ast": "^0.4.25" + } + }, "hardhat-gas-reporter": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", @@ -22186,7 +22293,74 @@ "requires": { "@solidity-parser/parser": "^0.14.5", "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" + "solidity-comments-extractor": "^0.0.7", + "string-width": "^4.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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 + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "process": { diff --git a/package.json b/package.json index c20e7f883..3ea1d7301 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", + "hardhat-exposed": "^0.3.0", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", diff --git a/scripts/generate/run.js b/scripts/generate/run.js index 60dd795d5..51ddba339 100755 --- a/scripts/generate/run.js +++ b/scripts/generate/run.js @@ -16,18 +16,10 @@ function getVersion (path) { } for (const [ file, template ] of Object.entries({ - // SafeCast 'utils/math/SafeCast.sol': './templates/SafeCast.js', - 'mocks/SafeCastMock.sol': './templates/SafeCastMock.js', - // EnumerableSet 'utils/structs/EnumerableSet.sol': './templates/EnumerableSet.js', - 'mocks/EnumerableSetMock.sol': './templates/EnumerableSetMock.js', - // EnumerableMap 'utils/structs/EnumerableMap.sol': './templates/EnumerableMap.js', - 'mocks/EnumerableMapMock.sol': './templates/EnumerableMapMock.js', - // Checkpoints 'utils/Checkpoints.sol': './templates/Checkpoints.js', - 'mocks/CheckpointsMock.sol': './templates/CheckpointsMock.js', })) { const script = path.relative(path.join(__dirname, '../..'), __filename); const input = path.join(path.dirname(script), template); diff --git a/scripts/generate/templates/CheckpointsMock.js b/scripts/generate/templates/CheckpointsMock.js deleted file mode 100755 index 145f08408..000000000 --- a/scripts/generate/templates/CheckpointsMock.js +++ /dev/null @@ -1,80 +0,0 @@ -const format = require('../format-lines'); - -const VALUE_SIZES = [ 224, 160 ]; - -const header = `\ -pragma solidity ^0.8.0; - -import "../utils/Checkpoints.sol"; -`; - -const legacy = () => `\ -contract CheckpointsMock { - using Checkpoints for Checkpoints.History; - - Checkpoints.History private _totalCheckpoints; - - function latest() public view returns (uint256) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() public view returns (bool, uint256, uint256) { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint256 value) public returns (uint256, uint256) { - return _totalCheckpoints.push(value); - } - - function getAtBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtBlock(blockNumber); - } - - function getAtProbablyRecentBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtProbablyRecentBlock(blockNumber); - } -} -`; - -const checkpoint = length => `\ -contract Checkpoints${length}Mock { - using Checkpoints for Checkpoints.Trace${length}; - - Checkpoints.Trace${length} private _totalCheckpoints; - - function latest() public view returns (uint${length}) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() public view returns (bool, uint${256 - length}, uint${length}) { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint${256 - length} key, uint${length} value) public returns (uint${length}, uint${length}) { - return _totalCheckpoints.push(key, value); - } - - function lowerLookup(uint${256 - length} key) public view returns (uint${length}) { - return _totalCheckpoints.lowerLookup(key); - } - - function upperLookup(uint${256 - length} key) public view returns (uint${length}) { - return _totalCheckpoints.upperLookup(key); - } -} -`; - -// GENERATE -module.exports = format( - header, - legacy(), - ...VALUE_SIZES.map(checkpoint), -); diff --git a/scripts/generate/templates/EnumerableMapMock.js b/scripts/generate/templates/EnumerableMapMock.js deleted file mode 100755 index ff26a6aed..000000000 --- a/scripts/generate/templates/EnumerableMapMock.js +++ /dev/null @@ -1,66 +0,0 @@ -const format = require('../format-lines'); - -const TYPES = [ - { name: 'UintToAddressMap', keyType: 'uint256', valueType: 'address' }, - { name: 'AddressToUintMap', keyType: 'address', valueType: 'uint256' }, - { name: 'Bytes32ToBytes32Map', keyType: 'bytes32', valueType: 'bytes32' }, - { name: 'UintToUintMap', keyType: 'uint256', valueType: 'uint256' }, - { name: 'Bytes32ToUintMap', keyType: 'bytes32', valueType: 'uint256' }, -]; - -const header = `\ -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableMap.sol"; -`; - -const customSetMock = ({ name, keyType, valueType }) => `\ -// ${name} -contract ${name}Mock { - using EnumerableMap for EnumerableMap.${name}; - - event OperationResult(bool result); - - EnumerableMap.${name} private _map; - - function contains(${keyType} key) public view returns (bool) { - return _map.contains(key); - } - - function set(${keyType} key, ${valueType} value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(${keyType} key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (${keyType} key, ${valueType} value) { - return _map.at(index); - } - - function tryGet(${keyType} key) public view returns (bool, ${valueType}) { - return _map.tryGet(key); - } - - function get(${keyType} key) public view returns (${valueType}) { - return _map.get(key); - } - - function getWithMessage(${keyType} key, string calldata errorMessage) public view returns (${valueType}) { - return _map.get(key, errorMessage); - } -} -`; - -// GENERATE -module.exports = format( - header, - ...TYPES.map(details => customSetMock(details)), -); diff --git a/scripts/generate/templates/EnumerableSetMock.js b/scripts/generate/templates/EnumerableSetMock.js deleted file mode 100755 index fbc9b850c..000000000 --- a/scripts/generate/templates/EnumerableSetMock.js +++ /dev/null @@ -1,56 +0,0 @@ -const format = require('../format-lines'); - -const TYPES = [ - { name: 'Bytes32Set', type: 'bytes32' }, - { name: 'AddressSet', type: 'address' }, - { name: 'UintSet', type: 'uint256' }, -]; - -const header = `\ -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableSet.sol"; -`; - -const customSetMock = ({ name, type }) => `\ -// ${name} -contract Enumerable${name}Mock { - using EnumerableSet for EnumerableSet.${name}; - - event OperationResult(bool result); - - EnumerableSet.${name} private _set; - - function contains(${type} value) public view returns (bool) { - return _set.contains(value); - } - - function add(${type} value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(${type} value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (${type}) { - return _set.at(index); - } - - function values() public view returns (${type}[] memory) { - return _set.values(); - } -} -`; - -// GENERATE -module.exports = format( - header, - ...TYPES.map(details => customSetMock(details)), -); diff --git a/scripts/generate/templates/SafeCast.js b/scripts/generate/templates/SafeCast.js old mode 100755 new mode 100644 diff --git a/scripts/generate/templates/SafeCastMock.js b/scripts/generate/templates/SafeCastMock.js deleted file mode 100755 index 196d9b4f1..000000000 --- a/scripts/generate/templates/SafeCastMock.js +++ /dev/null @@ -1,50 +0,0 @@ -const format = require('../format-lines'); -const { range } = require('../../helpers'); - -const LENGTHS = range(8, 256, 8).reverse(); // 248 → 8 (in steps of 8) - -const header = `\ -pragma solidity ^0.8.0; - -import "../utils/math/SafeCast.sol"; -`; - -const toInt = length => `\ -function toInt${length}(uint${length} a) public pure returns (int${length}) { - return a.toInt${length}(); -} -`; - -const toUint = length => `\ -function toUint${length}(int${length} a) public pure returns (uint${length}) { - return a.toUint${length}(); -} -`; - -const toIntDownCast = length => `\ -function toInt${length}(int256 a) public pure returns (int${length}) { - return a.toInt${length}(); -} -`; - -const toUintDownCast = length => `\ -function toUint${length}(uint256 a) public pure returns (uint${length}) { - return a.toUint${length}(); -} -`; - -// GENERATE -module.exports = format( - header, - 'contract SafeCastMock {', - [ - 'using SafeCast for uint256;', - 'using SafeCast for int256;', - '', - toUint(256), - ...LENGTHS.map(toUintDownCast), - toInt(256), - ...LENGTHS.map(toIntDownCast), - ].flatMap(fn => fn.split('\n')).slice(0, -1), - '}', -); diff --git a/test/access/AccessControl.behavior.js b/test/access/AccessControl.behavior.js index 2edd3fd4a..310ac3693 100644 --- a/test/access/AccessControl.behavior.js +++ b/test/access/AccessControl.behavior.js @@ -115,7 +115,7 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o describe('setting role admin', function () { beforeEach(async function () { - const receipt = await this.accessControl.setRoleAdmin(ROLE, OTHER_ROLE); + const receipt = await this.accessControl.$_setRoleAdmin(ROLE, OTHER_ROLE); expectEvent(receipt, 'RoleAdminChanged', { role: ROLE, previousAdminRole: DEFAULT_ADMIN_ROLE, @@ -161,19 +161,19 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o }); it('do not revert if sender has role', async function () { - await this.accessControl.senderProtected(ROLE, { from: authorized }); + await this.accessControl.methods['$_checkRole(bytes32)'](ROLE, { from: authorized }); }); it('revert if sender doesn\'t have role #1', async function () { await expectRevert( - this.accessControl.senderProtected(ROLE, { from: other }), + this.accessControl.methods['$_checkRole(bytes32)'](ROLE, { from: other }), `${errorPrefix}: account ${other.toLowerCase()} is missing role ${ROLE}`, ); }); it('revert if sender doesn\'t have role #2', async function () { await expectRevert( - this.accessControl.senderProtected(OTHER_ROLE, { from: authorized }), + this.accessControl.methods['$_checkRole(bytes32)'](OTHER_ROLE, { from: authorized }), `${errorPrefix}: account ${authorized.toLowerCase()} is missing role ${OTHER_ROLE}`, ); }); @@ -211,6 +211,7 @@ function shouldBehaveLikeAccessControlEnumerable (errorPrefix, admin, authorized } module.exports = { + DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl, shouldBehaveLikeAccessControlEnumerable, }; diff --git a/test/access/AccessControl.test.js b/test/access/AccessControl.test.js index cd9912adb..a462d5e54 100644 --- a/test/access/AccessControl.test.js +++ b/test/access/AccessControl.test.js @@ -1,12 +1,14 @@ const { + DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl, } = require('./AccessControl.behavior.js'); -const AccessControlMock = artifacts.require('AccessControlMock'); +const AccessControl = artifacts.require('$AccessControl'); contract('AccessControl', function (accounts) { beforeEach(async function () { - this.accessControl = await AccessControlMock.new({ from: accounts[0] }); + this.accessControl = await AccessControl.new({ from: accounts[0] }); + await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, accounts[0]); }); shouldBehaveLikeAccessControl('AccessControl', ...accounts); diff --git a/test/access/AccessControlCrossChain.test.js b/test/access/AccessControlCrossChain.test.js index cb4f3626d..5146848ed 100644 --- a/test/access/AccessControlCrossChain.test.js +++ b/test/access/AccessControlCrossChain.test.js @@ -2,6 +2,7 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { BridgeHelper } = require('../helpers/crosschain'); const { + DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl, } = require('./AccessControl.behavior.js'); @@ -10,7 +11,7 @@ const crossChainRoleAlias = (role) => web3.utils.leftPad( 64, ); -const AccessControlCrossChainMock = artifacts.require('AccessControlCrossChainMock'); +const AccessControlCrossChainMock = artifacts.require('$AccessControlCrossChainMock'); const ROLE = web3.utils.soliditySha3('ROLE'); @@ -21,6 +22,7 @@ contract('AccessControl', function (accounts) { beforeEach(async function () { this.accessControl = await AccessControlCrossChainMock.new({ from: accounts[0] }); + await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, accounts[0]); }); shouldBehaveLikeAccessControl('AccessControl', ...accounts); @@ -32,7 +34,7 @@ contract('AccessControl', function (accounts) { }); it('check alliassing', async function () { - expect(await this.accessControl.crossChainRoleAlias(ROLE)).to.be.bignumber.equal(crossChainRoleAlias(ROLE)); + expect(await this.accessControl.$_crossChainRoleAlias(ROLE)).to.be.bignumber.equal(crossChainRoleAlias(ROLE)); }); it('Crosschain calls not authorized to non-aliased addresses', async function () { @@ -40,7 +42,7 @@ contract('AccessControl', function (accounts) { this.bridge.call( accounts[0], this.accessControl, - 'senderProtected', + '$_checkRole(bytes32)', [ ROLE ], ), `AccessControl: account ${accounts[0].toLowerCase()} is missing role ${crossChainRoleAlias(ROLE)}`, @@ -51,7 +53,7 @@ contract('AccessControl', function (accounts) { await this.bridge.call( accounts[1], this.accessControl, - 'senderProtected', + '$_checkRole(bytes32)', [ ROLE ], ); }); diff --git a/test/access/AccessControlEnumerable.test.js b/test/access/AccessControlEnumerable.test.js index fa5b54691..2aa59f4c0 100644 --- a/test/access/AccessControlEnumerable.test.js +++ b/test/access/AccessControlEnumerable.test.js @@ -1,13 +1,15 @@ const { + DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl, shouldBehaveLikeAccessControlEnumerable, } = require('./AccessControl.behavior.js'); -const AccessControlMock = artifacts.require('AccessControlEnumerableMock'); +const AccessControlEnumerable = artifacts.require('$AccessControlEnumerable'); contract('AccessControl', function (accounts) { beforeEach(async function () { - this.accessControl = await AccessControlMock.new({ from: accounts[0] }); + this.accessControl = await AccessControlEnumerable.new({ from: accounts[0] }); + await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, accounts[0]); }); shouldBehaveLikeAccessControl('AccessControl', ...accounts); diff --git a/test/access/Ownable.test.js b/test/access/Ownable.test.js index 894e77c31..b8ca81d28 100644 --- a/test/access/Ownable.test.js +++ b/test/access/Ownable.test.js @@ -3,7 +3,7 @@ const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); -const Ownable = artifacts.require('OwnableMock'); +const Ownable = artifacts.require('$Ownable'); contract('Ownable', function (accounts) { const [ owner, other ] = accounts; diff --git a/test/access/Ownable2Step.test.js b/test/access/Ownable2Step.test.js index 0aeb22465..64d432762 100644 --- a/test/access/Ownable2Step.test.js +++ b/test/access/Ownable2Step.test.js @@ -2,7 +2,7 @@ const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-hel const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); -const Ownable2Step = artifacts.require('Ownable2StepMock'); +const Ownable2Step = artifacts.require('$Ownable2Step'); contract('Ownable2Step', function (accounts) { const [owner, accountA, accountB] = accounts; diff --git a/test/finance/PaymentSplitter.test.js b/test/finance/PaymentSplitter.test.js index 2fa7a26fa..ef74d4f69 100644 --- a/test/finance/PaymentSplitter.test.js +++ b/test/finance/PaymentSplitter.test.js @@ -4,7 +4,7 @@ const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); const PaymentSplitter = artifacts.require('PaymentSplitter'); -const Token = artifacts.require('ERC20Mock'); +const ERC20 = artifacts.require('$ERC20'); contract('PaymentSplitter', function (accounts) { const [ owner, payee1, payee2, payee3, nonpayee1, payer1 ] = accounts; @@ -51,7 +51,8 @@ contract('PaymentSplitter', function (accounts) { this.shares = [20, 10, 70]; this.contract = await PaymentSplitter.new(this.payees, this.shares); - this.token = await Token.new('MyToken', 'MT', owner, ether('1000')); + this.token = await ERC20.new('MyToken', 'MT'); + await this.token.$_mint(owner, ether('1000')); }); it('has total shares', async function () { diff --git a/test/finance/VestingWallet.behavior.js b/test/finance/VestingWallet.behavior.js index d1d2fbf4a..5ab6233ca 100644 --- a/test/finance/VestingWallet.behavior.js +++ b/test/finance/VestingWallet.behavior.js @@ -10,7 +10,7 @@ function releasedEvent (token, amount) { function shouldBehaveLikeVesting (beneficiary) { it('check vesting schedule', async function () { - const [ fnVestedAmount, fnReleasable, ...args ] = this.token + const [ vestedAmount, releasable, ...args ] = this.token ? [ 'vestedAmount(address,uint64)', 'releasable(address)', this.token.address ] : [ 'vestedAmount(uint64)', 'releasable()' ]; @@ -18,16 +18,16 @@ function shouldBehaveLikeVesting (beneficiary) { await time.increaseTo(timestamp); const vesting = this.vestingFn(timestamp); - expect(await this.mock.methods[fnVestedAmount](...args, timestamp)) + expect(await this.mock.methods[vestedAmount](...args, timestamp)) .to.be.bignumber.equal(vesting); - expect(await this.mock.methods[fnReleasable](...args)) + expect(await this.mock.methods[releasable](...args)) .to.be.bignumber.equal(vesting); } }); it('execute vesting schedule', async function () { - const [ fnRelease, ...args ] = this.token + const [ release, ...args ] = this.token ? [ 'release(address)', this.token.address ] : [ 'release()' ]; @@ -35,7 +35,7 @@ function shouldBehaveLikeVesting (beneficiary) { const before = await this.getBalance(beneficiary); { - const receipt = await this.mock.methods[fnRelease](...args); + const receipt = await this.mock.methods[release](...args); await expectEvent.inTransaction( receipt.tx, @@ -52,7 +52,7 @@ function shouldBehaveLikeVesting (beneficiary) { await time.setNextBlockTimestamp(timestamp); const vested = this.vestingFn(timestamp); - const receipt = await this.mock.methods[fnRelease](...args); + const receipt = await this.mock.methods[release](...args); await expectEvent.inTransaction( receipt.tx, this.mock, diff --git a/test/finance/VestingWallet.test.js b/test/finance/VestingWallet.test.js index 6aa737805..81a1e228a 100644 --- a/test/finance/VestingWallet.test.js +++ b/test/finance/VestingWallet.test.js @@ -2,8 +2,8 @@ const { constants, expectEvent, expectRevert, time } = require('@openzeppelin/te const { web3 } = require('@openzeppelin/test-helpers/src/setup'); const { expect } = require('chai'); -const ERC20Mock = artifacts.require('ERC20Mock'); const VestingWallet = artifacts.require('VestingWallet'); +const ERC20 = artifacts.require('$ERC20'); const { shouldBehaveLikeVesting } = require('./VestingWallet.behavior'); @@ -51,7 +51,7 @@ contract('VestingWallet', function (accounts) { describe('ERC20 vesting', function () { beforeEach(async function () { - this.token = await ERC20Mock.new('Name', 'Symbol', this.mock.address, amount); + this.token = await ERC20.new('Name', 'Symbol'); this.getBalance = (account) => this.token.balanceOf(account); this.checkRelease = (receipt, to, value) => expectEvent.inTransaction( receipt.tx, @@ -59,6 +59,8 @@ contract('VestingWallet', function (accounts) { 'Transfer', { from: this.mock.address, to, value }, ); + + await this.token.$_mint(this.mock.address, amount); }); shouldBehaveLikeVesting(beneficiary); diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index b1d0b0515..e5dd04cf0 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -11,11 +11,11 @@ const { shouldSupportInterfaces, } = require('../utils/introspection/SupportsInterface.behavior'); -const Token = artifacts.require('ERC20VotesMock'); -const Governor = artifacts.require('GovernorMock'); +const Token = artifacts.require('$ERC20Votes'); +const Governor = artifacts.require('$GovernorMock'); const CallReceiver = artifacts.require('CallReceiverMock'); -const ERC721Mock = artifacts.require('ERC721Mock'); -const ERC1155Mock = artifacts.require('ERC1155Mock'); +const ERC721 = artifacts.require('$ERC721'); +const ERC1155 = artifacts.require('$ERC1155'); contract('Governor', function (accounts) { const [ owner, proposer, voter1, voter2, voter3, voter4 ] = accounts; @@ -32,15 +32,22 @@ contract('Governor', function (accounts) { beforeEach(async function () { this.chainId = await web3.eth.getChainId(); - this.token = await Token.new(tokenName, tokenSymbol); - this.mock = await Governor.new(name, this.token.address, votingDelay, votingPeriod, 10); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new( + name, // name + votingDelay, // initialVotingDelay + votingPeriod, // initialVotingPeriod + 0, // initialProposalThreshold + this.token.address, // tokenAddress + 10, // quorumNumeratorValue + ); this.receiver = await CallReceiver.new(); this.helper = new GovernorHelper(this.mock); await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); @@ -585,8 +592,8 @@ contract('Governor', function (accounts) { const tokenId = new BN(1); beforeEach(async function () { - this.token = await ERC721Mock.new(name, symbol); - await this.token.mint(owner, tokenId); + this.token = await ERC721.new(name, symbol); + await this.token.$_mint(owner, tokenId); }); it('can receive an ERC721 safeTransfer', async function () { @@ -603,8 +610,8 @@ contract('Governor', function (accounts) { }; beforeEach(async function () { - this.token = await ERC1155Mock.new(uri); - await this.token.mintBatch(owner, Object.keys(tokenIds), Object.values(tokenIds), '0x'); + this.token = await ERC1155.new(uri); + await this.token.$_mintBatch(owner, Object.keys(tokenIds), Object.values(tokenIds), '0x'); }); it('can receive ERC1155 safeTransfer', async function () { diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index e0a32440e..3b31f8189 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -10,8 +10,8 @@ const { const TimelockController = artifacts.require('TimelockController'); const CallReceiverMock = artifacts.require('CallReceiverMock'); const Implementation2 = artifacts.require('Implementation2'); -const ERC721Mock = artifacts.require('ERC721Mock'); -const ERC1155Mock = artifacts.require('ERC1155Mock'); +const ERC721 = artifacts.require('$ERC721'); +const ERC1155 = artifacts.require('$ERC1155'); const MINDELAY = time.duration.days(1); @@ -1087,8 +1087,8 @@ contract('TimelockController', function (accounts) { const tokenId = new BN(1); beforeEach(async function () { - this.token = await ERC721Mock.new(name, symbol); - await this.token.mint(other, tokenId); + this.token = await ERC721.new(name, symbol); + await this.token.$_mint(other, tokenId); }); it('can receive an ERC721 safeTransfer', async function () { @@ -1105,8 +1105,8 @@ contract('TimelockController', function (accounts) { }; beforeEach(async function () { - this.token = await ERC1155Mock.new(uri); - await this.token.mintBatch(other, Object.keys(tokenIds), Object.values(tokenIds), '0x'); + this.token = await ERC1155.new(uri); + await this.token.$_mintBatch(other, Object.keys(tokenIds), Object.values(tokenIds), '0x'); }); it('can receive ERC1155 safeTransfer', async function () { diff --git a/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/test/governance/compatibility/GovernorCompatibilityBravo.test.js index f46efd622..1c25be36a 100644 --- a/test/governance/compatibility/GovernorCompatibilityBravo.test.js +++ b/test/governance/compatibility/GovernorCompatibilityBravo.test.js @@ -4,9 +4,9 @@ const RLP = require('rlp'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC20VotesCompMock'); +const Token = artifacts.require('$ERC20VotesComp'); const Timelock = artifacts.require('CompTimelock'); -const Governor = artifacts.require('GovernorCompatibilityBravoMock'); +const Governor = artifacts.require('$GovernorCompatibilityBravoMock'); const CallReceiver = artifacts.require('CallReceiverMock'); function makeContractAddress (creator, nonce) { @@ -29,7 +29,7 @@ contract('GovernorCompatibilityBravo', function (accounts) { beforeEach(async function () { const [ deployer ] = await web3.eth.getAccounts(); - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); // Need to predict governance address to set it as timelock admin with a delayed transfer const nonce = await web3.eth.getTransactionCount(deployer); @@ -38,11 +38,11 @@ contract('GovernorCompatibilityBravo', function (accounts) { this.timelock = await Timelock.new(predictGovernor, 2 * 86400); this.mock = await Governor.new( name, - this.token.address, votingDelay, votingPeriod, proposalThreshold, this.timelock.address, + this.token.address, ); this.receiver = await CallReceiver.new(); @@ -50,7 +50,7 @@ contract('GovernorCompatibilityBravo', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: proposer, value: proposalThreshold }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); diff --git a/test/governance/extensions/GovernorComp.test.js b/test/governance/extensions/GovernorComp.test.js index 06d2d6251..d32480ec1 100644 --- a/test/governance/extensions/GovernorComp.test.js +++ b/test/governance/extensions/GovernorComp.test.js @@ -3,8 +3,8 @@ const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC20VotesCompMock'); -const Governor = artifacts.require('GovernorCompMock'); +const Token = artifacts.require('$ERC20VotesComp'); +const Governor = artifacts.require('$GovernorCompMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorComp', function (accounts) { @@ -21,7 +21,7 @@ contract('GovernorComp', function (accounts) { beforeEach(async function () { this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); this.mock = await Governor.new(name, this.token.address); this.receiver = await CallReceiver.new(); @@ -29,7 +29,7 @@ contract('GovernorComp', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); diff --git a/test/governance/extensions/GovernorERC721.test.js b/test/governance/extensions/GovernorERC721.test.js index 086fca4c8..4c402737b 100644 --- a/test/governance/extensions/GovernorERC721.test.js +++ b/test/governance/extensions/GovernorERC721.test.js @@ -3,11 +3,11 @@ const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC721VotesMock'); -const Governor = artifacts.require('GovernorVoteMocks'); +const Token = artifacts.require('$ERC721Votes'); +const Governor = artifacts.require('$GovernorVoteMocks'); const CallReceiver = artifacts.require('CallReceiverMock'); -contract('GovernorERC721Mock', function (accounts) { +contract('GovernorERC721', function (accounts) { const [ owner, voter1, voter2, voter3, voter4 ] = accounts; const name = 'OZ-Governor'; @@ -25,7 +25,7 @@ contract('GovernorERC721Mock', function (accounts) { beforeEach(async function () { this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName, '1'); this.mock = await Governor.new(name, this.token.address); this.receiver = await CallReceiver.new(); @@ -33,7 +33,7 @@ contract('GovernorERC721Mock', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await Promise.all([ NFT0, NFT1, NFT2, NFT3, NFT4 ].map(tokenId => this.token.mint(owner, tokenId))); + await Promise.all([ NFT0, NFT1, NFT2, NFT3, NFT4 ].map(tokenId => this.token.$_mint(owner, tokenId))); await this.helper.delegate({ token: this.token, to: voter1, tokenId: NFT0 }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT1 }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT2 }, { from: owner }); diff --git a/test/governance/extensions/GovernorPreventLateQuorum.test.js b/test/governance/extensions/GovernorPreventLateQuorum.test.js index 6a5d644e7..b179e26f7 100644 --- a/test/governance/extensions/GovernorPreventLateQuorum.test.js +++ b/test/governance/extensions/GovernorPreventLateQuorum.test.js @@ -3,8 +3,8 @@ const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC20VotesCompMock'); -const Governor = artifacts.require('GovernorPreventLateQuorumMock'); +const Token = artifacts.require('$ERC20VotesComp'); +const Governor = artifacts.require('$GovernorPreventLateQuorumMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorPreventLateQuorum', function (accounts) { @@ -23,14 +23,15 @@ contract('GovernorPreventLateQuorum', function (accounts) { beforeEach(async function () { this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); this.mock = await Governor.new( name, - this.token.address, votingDelay, votingPeriod, - quorum, + 0, + this.token.address, lateQuorumVoteExtension, + quorum, ); this.receiver = await CallReceiver.new(); @@ -38,7 +39,7 @@ contract('GovernorPreventLateQuorum', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); diff --git a/test/governance/extensions/GovernorTimelockCompound.test.js b/test/governance/extensions/GovernorTimelockCompound.test.js index a31df68a2..3e8e10b10 100644 --- a/test/governance/extensions/GovernorTimelockCompound.test.js +++ b/test/governance/extensions/GovernorTimelockCompound.test.js @@ -8,9 +8,9 @@ const { shouldSupportInterfaces, } = require('../../utils/introspection/SupportsInterface.behavior'); -const Token = artifacts.require('ERC20VotesMock'); +const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('CompTimelock'); -const Governor = artifacts.require('GovernorTimelockCompoundMock'); +const Governor = artifacts.require('$GovernorTimelockCompoundMock'); const CallReceiver = artifacts.require('CallReceiverMock'); function makeContractAddress (creator, nonce) { @@ -32,7 +32,7 @@ contract('GovernorTimelockCompound', function (accounts) { beforeEach(async function () { const [ deployer ] = await web3.eth.getAccounts(); - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); // Need to predict governance address to set it as timelock admin with a delayed transfer const nonce = await web3.eth.getTransactionCount(deployer); @@ -41,10 +41,11 @@ contract('GovernorTimelockCompound', function (accounts) { this.timelock = await Timelock.new(predictGovernor, 2 * 86400); this.mock = await Governor.new( name, - this.token.address, votingDelay, votingPeriod, + 0, this.timelock.address, + this.token.address, 0, ); this.receiver = await CallReceiver.new(); @@ -53,7 +54,7 @@ contract('GovernorTimelockCompound', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); @@ -245,7 +246,7 @@ contract('GovernorTimelockCompound', function (accounts) { describe('onlyGovernance', function () { describe('relay', function () { beforeEach(async function () { - await this.token.mint(this.mock.address, 1); + await this.token.$_mint(this.mock.address, 1); }); it('is protected', async function () { @@ -337,8 +338,7 @@ contract('GovernorTimelockCompound', function (accounts) { }); it('can transfer timelock to new governor', async function () { - const newGovernor = await Governor.new(name, this.token.address, 8, 32, this.timelock.address, 0); - + const newGovernor = await Governor.new(name, 8, 32, 0, this.timelock.address, this.token.address, 0); this.helper.setProposal([ { target: this.timelock.address, diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 56d3b225c..167734e9b 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -7,9 +7,9 @@ const { shouldSupportInterfaces, } = require('../../utils/introspection/SupportsInterface.behavior'); -const Token = artifacts.require('ERC20VotesMock'); +const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('TimelockController'); -const Governor = artifacts.require('GovernorTimelockControlMock'); +const Governor = artifacts.require('$GovernorTimelockControlMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorTimelockControl', function (accounts) { @@ -32,14 +32,15 @@ contract('GovernorTimelockControl', function (accounts) { beforeEach(async function () { const [ deployer ] = await web3.eth.getAccounts(); - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); this.timelock = await Timelock.new(3600, [], [], deployer); this.mock = await Governor.new( name, - this.token.address, votingDelay, votingPeriod, + 0, this.timelock.address, + this.token.address, 0, ); this.receiver = await CallReceiver.new(); @@ -61,7 +62,7 @@ contract('GovernorTimelockControl', function (accounts) { await this.timelock.grantRole(EXECUTOR_ROLE, constants.ZERO_ADDRESS); await this.timelock.revokeRole(TIMELOCK_ADMIN_ROLE, deployer); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); @@ -245,7 +246,7 @@ contract('GovernorTimelockControl', function (accounts) { describe('onlyGovernance', function () { describe('relay', function () { beforeEach(async function () { - await this.token.mint(this.mock.address, 1); + await this.token.$_mint(this.mock.address, 1); }); it('is protected', async function () { diff --git a/test/governance/extensions/GovernorVotesQuorumFraction.test.js b/test/governance/extensions/GovernorVotesQuorumFraction.test.js index 9e6b71bc0..763f03068 100644 --- a/test/governance/extensions/GovernorVotesQuorumFraction.test.js +++ b/test/governance/extensions/GovernorVotesQuorumFraction.test.js @@ -3,8 +3,8 @@ const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC20VotesMock'); -const Governor = artifacts.require('GovernorMock'); +const Token = artifacts.require('$ERC20Votes'); +const Governor = artifacts.require('$GovernorMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorVotesQuorumFraction', function (accounts) { @@ -23,15 +23,22 @@ contract('GovernorVotesQuorumFraction', function (accounts) { beforeEach(async function () { this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol); - this.mock = await Governor.new(name, this.token.address, votingDelay, votingPeriod, ratio); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new( + name, + votingDelay, + votingPeriod, + 0, + this.token.address, + ratio, + ); this.receiver = await CallReceiver.new(); this.helper = new GovernorHelper(this.mock); await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); diff --git a/test/governance/extensions/GovernorWithParams.test.js b/test/governance/extensions/GovernorWithParams.test.js index 875b7053a..981fe0715 100644 --- a/test/governance/extensions/GovernorWithParams.test.js +++ b/test/governance/extensions/GovernorWithParams.test.js @@ -7,8 +7,8 @@ const Enums = require('../../helpers/enums'); const { EIP712Domain } = require('../../helpers/eip712'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('ERC20VotesCompMock'); -const Governor = artifacts.require('GovernorWithParamsMock'); +const Token = artifacts.require('$ERC20VotesComp'); +const Governor = artifacts.require('$GovernorWithParamsMock'); const CallReceiver = artifacts.require('CallReceiverMock'); const rawParams = { @@ -35,7 +35,7 @@ contract('GovernorWithParams', function (accounts) { beforeEach(async function () { this.chainId = await web3.eth.getChainId(); - this.token = await Token.new(tokenName, tokenSymbol); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); this.mock = await Governor.new(name, this.token.address); this.receiver = await CallReceiver.new(); @@ -43,7 +43,7 @@ contract('GovernorWithParams', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.mint(owner, tokenSupply); + await this.token.$_mint(owner, tokenSupply); await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); diff --git a/test/governance/utils/Votes.behavior.js b/test/governance/utils/Votes.behavior.js index aee227bdb..fc3af64dd 100644 --- a/test/governance/utils/Votes.behavior.js +++ b/test/governance/utils/Votes.behavior.js @@ -26,7 +26,12 @@ function shouldBehaveLikeVotes () { expect( await this.votes.DOMAIN_SEPARATOR(), ).to.equal( - await domainSeparator(this.name, version, this.chainId, this.votes.address), + await domainSeparator({ + name: this.name, + version, + chainId: this.chainId, + verifyingContract: this.votes.address, + }), ); }); @@ -45,7 +50,7 @@ function shouldBehaveLikeVotes () { }); beforeEach(async function () { - await this.votes.mint(delegatorAddress, this.NFT0); + await this.votes.$_mint(delegatorAddress, this.NFT0); }); it('accept signed delegation', async function () { @@ -151,7 +156,7 @@ function shouldBehaveLikeVotes () { describe('set delegation', function () { describe('call', function () { it('delegation with tokens', async function () { - await this.votes.mint(this.account1, this.NFT0); + await this.votes.$_mint(this.account1, this.NFT0); expect(await this.votes.delegates(this.account1)).to.be.equal(ZERO_ADDRESS); const { receipt } = await this.votes.delegate(this.account1, { from: this.account1 }); @@ -192,7 +197,7 @@ function shouldBehaveLikeVotes () { describe('change delegation', function () { beforeEach(async function () { - await this.votes.mint(this.account1, this.NFT0); + await this.votes.$_mint(this.account1, this.NFT0); await this.votes.delegate(this.account1, { from: this.account1 }); }); @@ -245,7 +250,7 @@ function shouldBehaveLikeVotes () { }); it('returns the latest block if >= last checkpoint block', async function () { - const t1 = await this.votes.mint(this.account1, this.NFT0); + const t1 = await this.votes.$_mint(this.account1, this.NFT0); await time.advanceBlock(); await time.advanceBlock(); @@ -255,7 +260,7 @@ function shouldBehaveLikeVotes () { it('returns zero if < first checkpoint block', async function () { await time.advanceBlock(); - const t2 = await this.votes.mint(this.account1, this.NFT1); + const t2 = await this.votes.$_mint(this.account1, this.NFT1); await time.advanceBlock(); await time.advanceBlock(); @@ -264,19 +269,19 @@ function shouldBehaveLikeVotes () { }); it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.votes.mint(this.account1, this.NFT1); + const t1 = await this.votes.$_mint(this.account1, this.NFT1); await time.advanceBlock(); await time.advanceBlock(); - const t2 = await this.votes.burn(this.NFT1); + const t2 = await this.votes.$_burn(this.NFT1); await time.advanceBlock(); await time.advanceBlock(); - const t3 = await this.votes.mint(this.account1, this.NFT2); + const t3 = await this.votes.$_mint(this.account1, this.NFT2); await time.advanceBlock(); await time.advanceBlock(); - const t4 = await this.votes.burn(this.NFT2); + const t4 = await this.votes.$_burn(this.NFT2); await time.advanceBlock(); await time.advanceBlock(); - const t5 = await this.votes.mint(this.account1, this.NFT3); + const t5 = await this.votes.$_mint(this.account1, this.NFT3); await time.advanceBlock(); await time.advanceBlock(); @@ -298,10 +303,10 @@ function shouldBehaveLikeVotes () { // https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. describe('Compound test suite', function () { beforeEach(async function () { - await this.votes.mint(this.account1, this.NFT0); - await this.votes.mint(this.account1, this.NFT1); - await this.votes.mint(this.account1, this.NFT2); - await this.votes.mint(this.account1, this.NFT3); + await this.votes.$_mint(this.account1, this.NFT0); + await this.votes.$_mint(this.account1, this.NFT1); + await this.votes.$_mint(this.account1, this.NFT2); + await this.votes.$_mint(this.account1, this.NFT3); }); describe('getPastVotes', function () { diff --git a/test/governance/utils/Votes.test.js b/test/governance/utils/Votes.test.js index 32b7d1dca..e9b50b0a3 100644 --- a/test/governance/utils/Votes.test.js +++ b/test/governance/utils/Votes.test.js @@ -2,17 +2,19 @@ const { expectRevert, BN } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); +const { getChainId } = require('../../helpers/chainid'); + const { shouldBehaveLikeVotes, } = require('./Votes.behavior'); -const Votes = artifacts.require('VotesMock'); +const Votes = artifacts.require('$VotesMock'); contract('Votes', function (accounts) { const [ account1, account2, account3 ] = accounts; beforeEach(async function () { this.name = 'My Vote'; - this.votes = await Votes.new(this.name); + this.votes = await Votes.new(this.name, '1'); }); it('starts with zero votes', async function () { @@ -21,9 +23,9 @@ contract('Votes', function (accounts) { describe('performs voting operations', function () { beforeEach(async function () { - this.tx1 = await this.votes.mint(account1, 1); - this.tx2 = await this.votes.mint(account2, 1); - this.tx3 = await this.votes.mint(account3, 1); + this.tx1 = await this.votes.$_mint(account1, 1); + this.tx2 = await this.votes.$_mint(account2, 1); + this.tx3 = await this.votes.$_mint(account3, 1); }); it('reverts if block number >= current block', async function () { @@ -46,7 +48,7 @@ contract('Votes', function (accounts) { describe('performs voting workflow', function () { beforeEach(async function () { - this.chainId = await this.votes.getChainId(); + this.chainId = await getChainId(); this.account1 = account1; this.account2 = account2; this.account1Delegatee = account2; diff --git a/test/helpers/chainid.js b/test/helpers/chainid.js new file mode 100644 index 000000000..f67b91bda --- /dev/null +++ b/test/helpers/chainid.js @@ -0,0 +1,10 @@ +const hre = require('hardhat'); + +async function getChainId () { + const chainIdHex = await hre.network.provider.send('eth_chainId', []); + return new hre.web3.utils.BN(chainIdHex, 'hex'); +} + +module.exports = { + getChainId, +}; diff --git a/test/helpers/eip712.js b/test/helpers/eip712.js index 8a64b8a35..26e2218bb 100644 --- a/test/helpers/eip712.js +++ b/test/helpers/eip712.js @@ -1,4 +1,5 @@ const ethSigUtil = require('eth-sig-util'); +const keccak256 = require('keccak256'); const EIP712Domain = [ { name: 'name', type: 'string' }, @@ -15,16 +16,35 @@ const Permit = [ { name: 'deadline', type: 'uint256' }, ]; -async function domainSeparator (name, version, chainId, verifyingContract) { - return '0x' + ethSigUtil.TypedDataUtils.hashStruct( - 'EIP712Domain', - { name, version, chainId, verifyingContract }, - { EIP712Domain }, - ).toString('hex'); +function bufferToHexString (buffer) { + return '0x' + buffer.toString('hex'); +} + +function hexStringToBuffer (hexstr) { + return Buffer.from(hexstr.replace(/^0x/, ''), 'hex'); +} + +async function domainSeparator ({ name, version, chainId, verifyingContract }) { + return bufferToHexString( + ethSigUtil.TypedDataUtils.hashStruct( + 'EIP712Domain', + { name, version, chainId, verifyingContract }, + { EIP712Domain }, + ), + ); +} + +async function hashTypedData (domain, structHash) { + return domainSeparator(domain).then(separator => bufferToHexString(keccak256(Buffer.concat([ + '0x1901', + separator, + structHash, + ].map(str => hexStringToBuffer(str)))))); } module.exports = { EIP712Domain, Permit, domainSeparator, + hashTypedData, }; diff --git a/test/helpers/governance.js b/test/helpers/governance.js index c56ec4c89..66a479b52 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -77,7 +77,7 @@ class GovernorHelper { [ proposal.id ], opts, )) - : this.governor.methods['cancel(address[],uint256[],bytes[],bytes32)'](...concatOpts( + : this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)'](...concatOpts( proposal.shortProposal, opts, )); diff --git a/test/helpers/map-values.js b/test/helpers/map-values.js new file mode 100644 index 000000000..d2f7b2a3f --- /dev/null +++ b/test/helpers/map-values.js @@ -0,0 +1,7 @@ +function mapValues(obj, fn) { + return Object.fromEntries([...Object.entries(obj)].map(([k, v]) => [k, fn(v)])); +} + +module.exports = { + mapValues, +}; diff --git a/test/metatx/ERC2771Context.test.js b/test/metatx/ERC2771Context.test.js index 8db92ab83..788777726 100644 --- a/test/metatx/ERC2771Context.test.js +++ b/test/metatx/ERC2771Context.test.js @@ -10,6 +10,7 @@ const MinimalForwarder = artifacts.require('MinimalForwarder'); const ContextMockCaller = artifacts.require('ContextMockCaller'); const { shouldBehaveLikeRegularContext } = require('../utils/Context.behavior'); +const { getChainId } = require('../helpers/chainid'); const name = 'MinimalForwarder'; const version = '0.0.1'; @@ -22,7 +23,7 @@ contract('ERC2771Context', function (accounts) { this.domain = { name, version, - chainId: await web3.eth.getChainId(), + chainId: await getChainId(), verifyingContract: this.forwarder.address, }; this.types = { diff --git a/test/metatx/MinimalForwarder.test.js b/test/metatx/MinimalForwarder.test.js index b8984e431..15778505e 100644 --- a/test/metatx/MinimalForwarder.test.js +++ b/test/metatx/MinimalForwarder.test.js @@ -5,6 +5,8 @@ const { EIP712Domain } = require('../helpers/eip712'); const { expectRevert, constants } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); +const { getChainId } = require('../helpers/chainid'); + const MinimalForwarder = artifacts.require('MinimalForwarder'); const CallReceiverMock = artifacts.require('CallReceiverMock'); @@ -17,7 +19,7 @@ contract('MinimalForwarder', function (accounts) { this.domain = { name, version, - chainId: await web3.eth.getChainId(), + chainId: await getChainId(), verifyingContract: this.forwarder.address, }; this.types = { diff --git a/test/proxy/Clones.test.js b/test/proxy/Clones.test.js index 0393a3331..09f719cec 100644 --- a/test/proxy/Clones.test.js +++ b/test/proxy/Clones.test.js @@ -4,14 +4,17 @@ const { expect } = require('chai'); const shouldBehaveLikeClone = require('./Clones.behaviour'); -const ClonesMock = artifacts.require('ClonesMock'); +const Clones = artifacts.require('$Clones'); + +contract('Clones', function (accounts) { + const [ deployer ] = accounts; -contract('Clones', function () { describe('clone', function () { shouldBehaveLikeClone(async (implementation, initData, opts = {}) => { - const factory = await ClonesMock.new(); - const receipt = await factory.clone(implementation, initData, { value: opts.value }); - const address = receipt.logs.find(({ event }) => event === 'NewInstance').args.instance; + const factory = await Clones.new(); + const receipt = await factory.$clone(implementation); + const address = receipt.logs.find(({ event }) => event === 'return$clone').args.instance; + await web3.eth.sendTransaction({ from: deployer, to: address, value: opts.value, data: initData }); return { address }; }); }); @@ -19,24 +22,25 @@ contract('Clones', function () { describe('cloneDeterministic', function () { shouldBehaveLikeClone(async (implementation, initData, opts = {}) => { const salt = web3.utils.randomHex(32); - const factory = await ClonesMock.new(); - const receipt = await factory.cloneDeterministic(implementation, salt, initData, { value: opts.value }); - const address = receipt.logs.find(({ event }) => event === 'NewInstance').args.instance; + const factory = await Clones.new(); + const receipt = await factory.$cloneDeterministic(implementation, salt); + const address = receipt.logs.find(({ event }) => event === 'return$cloneDeterministic').args.instance; + await web3.eth.sendTransaction({ from: deployer, to: address, value: opts.value, data: initData }); return { address }; }); it('address already used', async function () { const implementation = web3.utils.randomHex(20); const salt = web3.utils.randomHex(32); - const factory = await ClonesMock.new(); + const factory = await Clones.new(); // deploy once expectEvent( - await factory.cloneDeterministic(implementation, salt, '0x'), - 'NewInstance', + await factory.$cloneDeterministic(implementation, salt), + 'return$cloneDeterministic', ); // deploy twice await expectRevert( - factory.cloneDeterministic(implementation, salt, '0x'), + factory.$cloneDeterministic(implementation, salt), 'ERC1167: create2 failed', ); }); @@ -44,8 +48,8 @@ contract('Clones', function () { it('address prediction', async function () { const implementation = web3.utils.randomHex(20); const salt = web3.utils.randomHex(32); - const factory = await ClonesMock.new(); - const predicted = await factory.predictDeterministicAddress(implementation, salt); + const factory = await Clones.new(); + const predicted = await factory.$predictDeterministicAddress(implementation, salt); const creationCode = [ '0x3d602d80600a3d3981f3363d3d373d3d3d363d73', @@ -60,8 +64,8 @@ contract('Clones', function () { )).to.be.equal(predicted); expectEvent( - await factory.cloneDeterministic(implementation, salt, '0x'), - 'NewInstance', + await factory.$cloneDeterministic(implementation, salt), + 'return$cloneDeterministic', { instance: predicted }, ); }); diff --git a/test/proxy/utils/UUPSUpgradeable.test.js b/test/proxy/utils/UUPSUpgradeable.test.js index cd465143e..20324e67b 100644 --- a/test/proxy/utils/UUPSUpgradeable.test.js +++ b/test/proxy/utils/UUPSUpgradeable.test.js @@ -6,14 +6,14 @@ const ERC1967Proxy = artifacts.require('ERC1967Proxy'); const UUPSUpgradeableMock = artifacts.require('UUPSUpgradeableMock'); const UUPSUpgradeableUnsafeMock = artifacts.require('UUPSUpgradeableUnsafeMock'); const UUPSUpgradeableLegacyMock = artifacts.require('UUPSUpgradeableLegacyMock'); -const CountersImpl = artifacts.require('CountersImpl'); +const NonUpgradeableMock = artifacts.require('NonUpgradeableMock'); contract('UUPSUpgradeable', function () { before(async function () { this.implInitial = await UUPSUpgradeableMock.new(); this.implUpgradeOk = await UUPSUpgradeableMock.new(); this.implUpgradeUnsafe = await UUPSUpgradeableUnsafeMock.new(); - this.implUpgradeNonUUPS = await CountersImpl.new(); + this.implUpgradeNonUUPS = await NonUpgradeableMock.new(); }); beforeEach(async function () { diff --git a/test/token/ERC1155/ERC1155.behavior.js b/test/token/ERC1155/ERC1155.behavior.js index 62ba66677..37afea0aa 100644 --- a/test/token/ERC1155/ERC1155.behavior.js +++ b/test/token/ERC1155/ERC1155.behavior.js @@ -48,10 +48,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when accounts own some tokens', function () { beforeEach(async function () { - await this.token.mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { + await this.token.$_mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.mint( + await this.token.$_mint( secondTokenHolder, secondTokenId, secondAmount, @@ -125,10 +125,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when accounts own some tokens', function () { beforeEach(async function () { - await this.token.mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { + await this.token.$_mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.mint( + await this.token.$_mint( secondTokenHolder, secondTokenId, secondAmount, @@ -193,10 +193,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, describe('safeTransferFrom', function () { beforeEach(async function () { - await this.token.mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { + await this.token.$_mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.mint( + await this.token.$_mint( multiTokenHolder, secondTokenId, secondAmount, @@ -449,10 +449,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, describe('safeBatchTransferFrom', function () { beforeEach(async function () { - await this.token.mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { + await this.token.$_mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.mint( + await this.token.$_mint( multiTokenHolder, secondTokenId, secondAmount, diff --git a/test/token/ERC1155/ERC1155.test.js b/test/token/ERC1155/ERC1155.test.js index a0a8cf3ff..4e295d59e 100644 --- a/test/token/ERC1155/ERC1155.test.js +++ b/test/token/ERC1155/ERC1155.test.js @@ -4,7 +4,7 @@ const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); const { shouldBehaveLikeERC1155 } = require('./ERC1155.behavior'); -const ERC1155Mock = artifacts.require('ERC1155Mock'); +const ERC1155Mock = artifacts.require('$ERC1155'); contract('ERC1155', function (accounts) { const [operator, tokenHolder, tokenBatchHolder, ...otherAccounts] = accounts; @@ -31,14 +31,14 @@ contract('ERC1155', function (accounts) { describe('_mint', function () { it('reverts with a zero destination address', async function () { await expectRevert( - this.token.mint(ZERO_ADDRESS, tokenId, mintAmount, data), + this.token.$_mint(ZERO_ADDRESS, tokenId, mintAmount, data), 'ERC1155: mint to the zero address', ); }); context('with minted tokens', function () { beforeEach(async function () { - (this.receipt = await this.token.mint(tokenHolder, tokenId, mintAmount, data, { from: operator })); + (this.receipt = await this.token.$_mint(tokenHolder, tokenId, mintAmount, data, { from: operator })); }); it('emits a TransferSingle event', function () { @@ -60,26 +60,26 @@ contract('ERC1155', function (accounts) { describe('_mintBatch', function () { it('reverts with a zero destination address', async function () { await expectRevert( - this.token.mintBatch(ZERO_ADDRESS, tokenBatchIds, mintAmounts, data), + this.token.$_mintBatch(ZERO_ADDRESS, tokenBatchIds, mintAmounts, data), 'ERC1155: mint to the zero address', ); }); it('reverts if length of inputs do not match', async function () { await expectRevert( - this.token.mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts.slice(1), data), + this.token.$_mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts.slice(1), data), 'ERC1155: ids and amounts length mismatch', ); await expectRevert( - this.token.mintBatch(tokenBatchHolder, tokenBatchIds.slice(1), mintAmounts, data), + this.token.$_mintBatch(tokenBatchHolder, tokenBatchIds.slice(1), mintAmounts, data), 'ERC1155: ids and amounts length mismatch', ); }); context('with minted batch of tokens', function () { beforeEach(async function () { - (this.receipt = await this.token.mintBatch( + (this.receipt = await this.token.$_mintBatch( tokenBatchHolder, tokenBatchIds, mintAmounts, @@ -112,20 +112,20 @@ contract('ERC1155', function (accounts) { describe('_burn', function () { it('reverts when burning the zero account\'s tokens', async function () { await expectRevert( - this.token.burn(ZERO_ADDRESS, tokenId, mintAmount), + this.token.$_burn(ZERO_ADDRESS, tokenId, mintAmount), 'ERC1155: burn from the zero address', ); }); it('reverts when burning a non-existent token id', async function () { await expectRevert( - this.token.burn(tokenHolder, tokenId, mintAmount), + this.token.$_burn(tokenHolder, tokenId, mintAmount), 'ERC1155: burn amount exceeds balance', ); }); it('reverts when burning more than available tokens', async function () { - await this.token.mint( + await this.token.$_mint( tokenHolder, tokenId, mintAmount, @@ -134,15 +134,15 @@ contract('ERC1155', function (accounts) { ); await expectRevert( - this.token.burn(tokenHolder, tokenId, mintAmount.addn(1)), + this.token.$_burn(tokenHolder, tokenId, mintAmount.addn(1)), 'ERC1155: burn amount exceeds balance', ); }); context('with minted-then-burnt tokens', function () { beforeEach(async function () { - await this.token.mint(tokenHolder, tokenId, mintAmount, data); - (this.receipt = await this.token.burn( + await this.token.$_mint(tokenHolder, tokenId, mintAmount, data); + (this.receipt = await this.token.$_burn( tokenHolder, tokenId, burnAmount, @@ -172,34 +172,34 @@ contract('ERC1155', function (accounts) { describe('_burnBatch', function () { it('reverts when burning the zero account\'s tokens', async function () { await expectRevert( - this.token.burnBatch(ZERO_ADDRESS, tokenBatchIds, burnAmounts), + this.token.$_burnBatch(ZERO_ADDRESS, tokenBatchIds, burnAmounts), 'ERC1155: burn from the zero address', ); }); it('reverts if length of inputs do not match', async function () { await expectRevert( - this.token.burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts.slice(1)), + this.token.$_burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts.slice(1)), 'ERC1155: ids and amounts length mismatch', ); await expectRevert( - this.token.burnBatch(tokenBatchHolder, tokenBatchIds.slice(1), burnAmounts), + this.token.$_burnBatch(tokenBatchHolder, tokenBatchIds.slice(1), burnAmounts), 'ERC1155: ids and amounts length mismatch', ); }); it('reverts when burning a non-existent token id', async function () { await expectRevert( - this.token.burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts), + this.token.$_burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts), 'ERC1155: burn amount exceeds balance', ); }); context('with minted-then-burnt tokens', function () { beforeEach(async function () { - await this.token.mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts, data); - (this.receipt = await this.token.burnBatch( + await this.token.$_mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts, data); + (this.receipt = await this.token.$_burnBatch( tokenBatchHolder, tokenBatchIds, burnAmounts, @@ -248,13 +248,13 @@ contract('ERC1155', function (accounts) { const newURI = 'https://token-cdn-domain/{locale}/{id}.json'; it('emits no URI event', async function () { - const receipt = await this.token.setURI(newURI); + const receipt = await this.token.$_setURI(newURI); expectEvent.notEmitted(receipt, 'URI'); }); it('sets the new URI for all token types', async function () { - await this.token.setURI(newURI); + await this.token.$_setURI(newURI); expect(await this.token.uri(firstTokenID)).to.be.equal(newURI); expect(await this.token.uri(secondTokenID)).to.be.equal(newURI); diff --git a/test/token/ERC1155/extensions/ERC1155Burnable.test.js b/test/token/ERC1155/extensions/ERC1155Burnable.test.js index ff6aee054..2c854e2e8 100644 --- a/test/token/ERC1155/extensions/ERC1155Burnable.test.js +++ b/test/token/ERC1155/extensions/ERC1155Burnable.test.js @@ -2,7 +2,7 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC1155BurnableMock = artifacts.require('ERC1155BurnableMock'); +const ERC1155Burnable = artifacts.require('$ERC1155Burnable'); contract('ERC1155Burnable', function (accounts) { const [ holder, operator, other ] = accounts; @@ -13,10 +13,10 @@ contract('ERC1155Burnable', function (accounts) { const amounts = [new BN('3000'), new BN('9902')]; beforeEach(async function () { - this.token = await ERC1155BurnableMock.new(uri); + this.token = await ERC1155Burnable.new(uri); - await this.token.mint(holder, tokenIds[0], amounts[0], '0x'); - await this.token.mint(holder, tokenIds[1], amounts[1], '0x'); + await this.token.$_mint(holder, tokenIds[0], amounts[0], '0x'); + await this.token.$_mint(holder, tokenIds[1], amounts[1], '0x'); }); describe('burn', function () { diff --git a/test/token/ERC1155/extensions/ERC1155Pausable.test.js b/test/token/ERC1155/extensions/ERC1155Pausable.test.js index f7c40523c..e7ace3c2c 100644 --- a/test/token/ERC1155/extensions/ERC1155Pausable.test.js +++ b/test/token/ERC1155/extensions/ERC1155Pausable.test.js @@ -2,7 +2,7 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC1155PausableMock = artifacts.require('ERC1155PausableMock'); +const ERC1155Pausable = artifacts.require('$ERC1155Pausable'); contract('ERC1155Pausable', function (accounts) { const [ holder, operator, receiver, other ] = accounts; @@ -10,7 +10,7 @@ contract('ERC1155Pausable', function (accounts) { const uri = 'https://token.com'; beforeEach(async function () { - this.token = await ERC1155PausableMock.new(uri); + this.token = await ERC1155Pausable.new(uri); }); context('when token is paused', function () { @@ -22,9 +22,9 @@ contract('ERC1155Pausable', function (accounts) { beforeEach(async function () { await this.token.setApprovalForAll(operator, true, { from: holder }); - await this.token.mint(holder, firstTokenId, firstTokenAmount, '0x'); + await this.token.$_mint(holder, firstTokenId, firstTokenAmount, '0x'); - await this.token.pause(); + await this.token.$_pause(); }); it('reverts when trying to safeTransferFrom from holder', async function () { @@ -59,28 +59,28 @@ contract('ERC1155Pausable', function (accounts) { it('reverts when trying to mint', async function () { await expectRevert( - this.token.mint(holder, secondTokenId, secondTokenAmount, '0x'), + this.token.$_mint(holder, secondTokenId, secondTokenAmount, '0x'), 'ERC1155Pausable: token transfer while paused', ); }); it('reverts when trying to mintBatch', async function () { await expectRevert( - this.token.mintBatch(holder, [secondTokenId], [secondTokenAmount], '0x'), + this.token.$_mintBatch(holder, [secondTokenId], [secondTokenAmount], '0x'), 'ERC1155Pausable: token transfer while paused', ); }); it('reverts when trying to burn', async function () { await expectRevert( - this.token.burn(holder, firstTokenId, firstTokenAmount), + this.token.$_burn(holder, firstTokenId, firstTokenAmount), 'ERC1155Pausable: token transfer while paused', ); }); it('reverts when trying to burnBatch', async function () { await expectRevert( - this.token.burnBatch(holder, [firstTokenId], [firstTokenAmount]), + this.token.$_burnBatch(holder, [firstTokenId], [firstTokenAmount]), 'ERC1155Pausable: token transfer while paused', ); }); diff --git a/test/token/ERC1155/extensions/ERC1155Supply.test.js b/test/token/ERC1155/extensions/ERC1155Supply.test.js index 1a632604d..0eb4952ab 100644 --- a/test/token/ERC1155/extensions/ERC1155Supply.test.js +++ b/test/token/ERC1155/extensions/ERC1155Supply.test.js @@ -2,7 +2,7 @@ const { BN } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC1155SupplyMock = artifacts.require('ERC1155SupplyMock'); +const ERC1155Supply = artifacts.require('$ERC1155Supply'); contract('ERC1155Supply', function (accounts) { const [ holder ] = accounts; @@ -16,7 +16,7 @@ contract('ERC1155Supply', function (accounts) { const secondTokenAmount = new BN('23'); beforeEach(async function () { - this.token = await ERC1155SupplyMock.new(uri); + this.token = await ERC1155Supply.new(uri); }); context('before mint', function () { @@ -32,7 +32,7 @@ contract('ERC1155Supply', function (accounts) { context('after mint', function () { context('single', function () { beforeEach(async function () { - await this.token.mint(holder, firstTokenId, firstTokenAmount, '0x'); + await this.token.$_mint(holder, firstTokenId, firstTokenAmount, '0x'); }); it('exist', async function () { @@ -46,7 +46,7 @@ contract('ERC1155Supply', function (accounts) { context('batch', function () { beforeEach(async function () { - await this.token.mintBatch( + await this.token.$_mintBatch( holder, [ firstTokenId, secondTokenId ], [ firstTokenAmount, secondTokenAmount ], @@ -69,8 +69,8 @@ contract('ERC1155Supply', function (accounts) { context('after burn', function () { context('single', function () { beforeEach(async function () { - await this.token.mint(holder, firstTokenId, firstTokenAmount, '0x'); - await this.token.burn(holder, firstTokenId, firstTokenAmount); + await this.token.$_mint(holder, firstTokenId, firstTokenAmount, '0x'); + await this.token.$_burn(holder, firstTokenId, firstTokenAmount); }); it('exist', async function () { @@ -84,13 +84,13 @@ contract('ERC1155Supply', function (accounts) { context('batch', function () { beforeEach(async function () { - await this.token.mintBatch( + await this.token.$_mintBatch( holder, [ firstTokenId, secondTokenId ], [ firstTokenAmount, secondTokenAmount ], '0x', ); - await this.token.burnBatch( + await this.token.$_burnBatch( holder, [ firstTokenId, secondTokenId ], [ firstTokenAmount, secondTokenAmount ], diff --git a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js index 8f20a4ced..a12a5c972 100644 --- a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +++ b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js @@ -3,7 +3,7 @@ const { BN, expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const { artifacts } = require('hardhat'); -const ERC1155URIStorageMock = artifacts.require('ERC1155URIStorageMock'); +const ERC1155URIStorage = artifacts.require('$ERC1155URIStorage'); contract(['ERC1155URIStorage'], function (accounts) { const [ holder ] = accounts; @@ -16,10 +16,10 @@ contract(['ERC1155URIStorage'], function (accounts) { describe('with base uri set', function () { beforeEach(async function () { - this.token = await ERC1155URIStorageMock.new(erc1155Uri); - await this.token.setBaseURI(baseUri); + this.token = await ERC1155URIStorage.new(erc1155Uri); + await this.token.$_setBaseURI(baseUri); - await this.token.mint(holder, tokenId, amount, '0x'); + await this.token.$_mint(holder, tokenId, amount, '0x'); }); it('can request the token uri, returning the erc1155 uri if no token uri was set', async function () { @@ -30,7 +30,7 @@ contract(['ERC1155URIStorage'], function (accounts) { it('can request the token uri, returning the concatenated uri if a token uri was set', async function () { const tokenUri = '1234/'; - const receipt = await this.token.setURI(tokenId, tokenUri); + const receipt = await this.token.$_setURI(tokenId, tokenUri); const receivedTokenUri = await this.token.uri(tokenId); @@ -42,9 +42,9 @@ contract(['ERC1155URIStorage'], function (accounts) { describe('with base uri set to the empty string', function () { beforeEach(async function () { - this.token = await ERC1155URIStorageMock.new(''); + this.token = await ERC1155URIStorage.new(''); - await this.token.mint(holder, tokenId, amount, '0x'); + await this.token.$_mint(holder, tokenId, amount, '0x'); }); it('can request the token uri, returning an empty string if no token uri was set', async function () { @@ -55,7 +55,7 @@ contract(['ERC1155URIStorage'], function (accounts) { it('can request the token uri, returning the token uri if a token uri was set', async function () { const tokenUri = 'ipfs://1234/'; - const receipt = await this.token.setURI(tokenId, tokenUri); + const receipt = await this.token.$_setURI(tokenId, tokenUri); const receivedTokenUri = await this.token.uri(tokenId); diff --git a/test/token/ERC1155/utils/ERC1155Holder.test.js b/test/token/ERC1155/utils/ERC1155Holder.test.js index 41225c238..736925bd6 100644 --- a/test/token/ERC1155/utils/ERC1155Holder.test.js +++ b/test/token/ERC1155/utils/ERC1155Holder.test.js @@ -1,7 +1,7 @@ const { BN } = require('@openzeppelin/test-helpers'); const ERC1155Holder = artifacts.require('ERC1155Holder'); -const ERC1155Mock = artifacts.require('ERC1155Mock'); +const ERC1155 = artifacts.require('$ERC1155'); const { expect } = require('chai'); @@ -15,9 +15,9 @@ contract('ERC1155Holder', function (accounts) { const transferData = '0x12345678'; beforeEach(async function () { - this.multiToken = await ERC1155Mock.new(uri, { from: creator }); + this.multiToken = await ERC1155.new(uri); this.holder = await ERC1155Holder.new(); - await this.multiToken.mintBatch(creator, multiTokenIds, multiTokenAmounts, '0x', { from: creator }); + await this.multiToken.$_mintBatch(creator, multiTokenIds, multiTokenAmounts, '0x'); }); shouldSupportInterfaces(['ERC165', 'ERC1155Receiver']); diff --git a/test/token/ERC20/ERC20.test.js b/test/token/ERC20/ERC20.test.js index 992edf93b..10d86e4b4 100644 --- a/test/token/ERC20/ERC20.test.js +++ b/test/token/ERC20/ERC20.test.js @@ -8,8 +8,8 @@ const { shouldBehaveLikeERC20Approve, } = require('./ERC20.behavior'); -const ERC20Mock = artifacts.require('ERC20Mock'); -const ERC20DecimalsMock = artifacts.require('ERC20DecimalsMock'); +const ERC20 = artifacts.require('$ERC20'); +const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); contract('ERC20', function (accounts) { const [ initialHolder, recipient, anotherAccount ] = accounts; @@ -20,7 +20,8 @@ contract('ERC20', function (accounts) { const initialSupply = new BN(100); beforeEach(async function () { - this.token = await ERC20Mock.new(name, symbol, initialHolder, initialSupply); + this.token = await ERC20.new(name, symbol); + await this.token.$_mint(initialHolder, initialSupply); }); it('has a name', async function () { @@ -39,7 +40,7 @@ contract('ERC20', function (accounts) { const decimals = new BN(6); it('can set decimals during construction', async function () { - const token = await ERC20DecimalsMock.new(name, symbol, decimals); + const token = await ERC20Decimals.new(name, symbol, decimals); expect(await token.decimals()).to.be.bignumber.equal(decimals); }); }); @@ -203,13 +204,13 @@ contract('ERC20', function (accounts) { const amount = new BN(50); it('rejects a null account', async function () { await expectRevert( - this.token.mint(ZERO_ADDRESS, amount), 'ERC20: mint to the zero address', + this.token.$_mint(ZERO_ADDRESS, amount), 'ERC20: mint to the zero address', ); }); describe('for a non zero account', function () { beforeEach('minting', async function () { - this.receipt = await this.token.mint(recipient, amount); + this.receipt = await this.token.$_mint(recipient, amount); }); it('increments totalSupply', async function () { @@ -235,13 +236,13 @@ contract('ERC20', function (accounts) { describe('_burn', function () { it('rejects a null account', async function () { - await expectRevert(this.token.burn(ZERO_ADDRESS, new BN(1)), + await expectRevert(this.token.$_burn(ZERO_ADDRESS, new BN(1)), 'ERC20: burn from the zero address'); }); describe('for a non zero account', function () { it('rejects burning more than balance', async function () { - await expectRevert(this.token.burn( + await expectRevert(this.token.$_burn( initialHolder, initialSupply.addn(1)), 'ERC20: burn amount exceeds balance', ); }); @@ -249,7 +250,7 @@ contract('ERC20', function (accounts) { const describeBurn = function (description, amount) { describe(description, function () { beforeEach('burning', async function () { - this.receipt = await this.token.burn(initialHolder, amount); + this.receipt = await this.token.$_burn(initialHolder, amount); }); it('decrements totalSupply', async function () { @@ -281,12 +282,12 @@ contract('ERC20', function (accounts) { describe('_transfer', function () { shouldBehaveLikeERC20Transfer('ERC20', initialHolder, recipient, initialSupply, function (from, to, amount) { - return this.token.transferInternal(from, to, amount); + return this.token.$_transfer(from, to, amount); }); describe('when the sender is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.transferInternal(ZERO_ADDRESS, recipient, initialSupply), + await expectRevert(this.token.$_transfer(ZERO_ADDRESS, recipient, initialSupply), 'ERC20: transfer from the zero address', ); }); @@ -295,12 +296,12 @@ contract('ERC20', function (accounts) { describe('_approve', function () { shouldBehaveLikeERC20Approve('ERC20', initialHolder, recipient, initialSupply, function (owner, spender, amount) { - return this.token.approveInternal(owner, spender, amount); + return this.token.$_approve(owner, spender, amount); }); describe('when the owner is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.approveInternal(ZERO_ADDRESS, recipient, initialSupply), + await expectRevert(this.token.$_approve(ZERO_ADDRESS, recipient, initialSupply), 'ERC20: approve from the zero address', ); }); diff --git a/test/token/ERC20/extensions/ERC20Burnable.test.js b/test/token/ERC20/extensions/ERC20Burnable.test.js index 8aa4fb66c..45264b774 100644 --- a/test/token/ERC20/extensions/ERC20Burnable.test.js +++ b/test/token/ERC20/extensions/ERC20Burnable.test.js @@ -1,7 +1,7 @@ const { BN } = require('@openzeppelin/test-helpers'); const { shouldBehaveLikeERC20Burnable } = require('./ERC20Burnable.behavior'); -const ERC20BurnableMock = artifacts.require('ERC20BurnableMock'); +const ERC20Burnable = artifacts.require('$ERC20Burnable'); contract('ERC20Burnable', function (accounts) { const [ owner, ...otherAccounts ] = accounts; @@ -12,7 +12,8 @@ contract('ERC20Burnable', function (accounts) { const symbol = 'MTKN'; beforeEach(async function () { - this.token = await ERC20BurnableMock.new(name, symbol, owner, initialBalance, { from: owner }); + this.token = await ERC20Burnable.new(name, symbol, { from: owner }); + await this.token.$_mint(owner, initialBalance); }); shouldBehaveLikeERC20Burnable(owner, initialBalance, otherAccounts); diff --git a/test/token/ERC20/extensions/ERC20Capped.behavior.js b/test/token/ERC20/extensions/ERC20Capped.behavior.js index 4692f997f..fe8c3a4ff 100644 --- a/test/token/ERC20/extensions/ERC20Capped.behavior.js +++ b/test/token/ERC20/extensions/ERC20Capped.behavior.js @@ -2,27 +2,27 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -function shouldBehaveLikeERC20Capped (minter, [other], cap) { +function shouldBehaveLikeERC20Capped (accounts, cap) { describe('capped token', function () { - const from = minter; + const user = accounts[0]; it('starts with the correct cap', async function () { expect(await this.token.cap()).to.be.bignumber.equal(cap); }); it('mints when amount is less than cap', async function () { - await this.token.mint(other, cap.subn(1), { from }); + await this.token.$_mint(user, cap.subn(1)); expect(await this.token.totalSupply()).to.be.bignumber.equal(cap.subn(1)); }); it('fails to mint if the amount exceeds the cap', async function () { - await this.token.mint(other, cap.subn(1), { from }); - await expectRevert(this.token.mint(other, 2, { from }), 'ERC20Capped: cap exceeded'); + await this.token.$_mint(user, cap.subn(1)); + await expectRevert(this.token.$_mint(user, 2), 'ERC20Capped: cap exceeded'); }); it('fails to mint after cap is reached', async function () { - await this.token.mint(other, cap, { from }); - await expectRevert(this.token.mint(other, 1, { from }), 'ERC20Capped: cap exceeded'); + await this.token.$_mint(user, cap); + await expectRevert(this.token.$_mint(user, 1), 'ERC20Capped: cap exceeded'); }); }); } diff --git a/test/token/ERC20/extensions/ERC20Capped.test.js b/test/token/ERC20/extensions/ERC20Capped.test.js index 76532cefd..a86d38c1a 100644 --- a/test/token/ERC20/extensions/ERC20Capped.test.js +++ b/test/token/ERC20/extensions/ERC20Capped.test.js @@ -1,27 +1,23 @@ -const { BN, ether, expectRevert } = require('@openzeppelin/test-helpers'); +const { ether, expectRevert } = require('@openzeppelin/test-helpers'); const { shouldBehaveLikeERC20Capped } = require('./ERC20Capped.behavior'); -const ERC20Capped = artifacts.require('ERC20CappedMock'); +const ERC20Capped = artifacts.require('$ERC20Capped'); contract('ERC20Capped', function (accounts) { - const [ minter, ...otherAccounts ] = accounts; - const cap = ether('1000'); const name = 'My Token'; const symbol = 'MTKN'; it('requires a non-zero cap', async function () { - await expectRevert( - ERC20Capped.new(name, symbol, new BN(0), { from: minter }), 'ERC20Capped: cap is 0', - ); + await expectRevert(ERC20Capped.new(name, symbol, 0), 'ERC20Capped: cap is 0'); }); context('once deployed', async function () { beforeEach(async function () { - this.token = await ERC20Capped.new(name, symbol, cap, { from: minter }); + this.token = await ERC20Capped.new(name, symbol, cap); }); - shouldBehaveLikeERC20Capped(minter, otherAccounts, cap); + shouldBehaveLikeERC20Capped(accounts, cap); }); }); diff --git a/test/token/ERC20/extensions/ERC20FlashMint.test.js b/test/token/ERC20/extensions/ERC20FlashMint.test.js index 4354dd90c..86326f95d 100644 --- a/test/token/ERC20/extensions/ERC20FlashMint.test.js +++ b/test/token/ERC20/extensions/ERC20FlashMint.test.js @@ -4,7 +4,7 @@ const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test const { expect } = require('chai'); const { MAX_UINT256, ZERO_ADDRESS } = constants; -const ERC20FlashMintMock = artifacts.require('ERC20FlashMintMock'); +const ERC20FlashMintMock = artifacts.require('$ERC20FlashMintMock'); const ERC3156FlashBorrowerMock = artifacts.require('ERC3156FlashBorrowerMock'); contract('ERC20FlashMint', function (accounts) { @@ -17,7 +17,8 @@ contract('ERC20FlashMint', function (accounts) { const loanAmount = new BN(10000000000000); beforeEach(async function () { - this.token = await ERC20FlashMintMock.new(name, symbol, initialHolder, initialSupply); + this.token = await ERC20FlashMintMock.new(name, symbol); + await this.token.$_mint(initialHolder, initialSupply); }); describe('maxFlashLoan', function () { @@ -42,7 +43,7 @@ contract('ERC20FlashMint', function (accounts) { describe('flashFeeReceiver', function () { it('default receiver', async function () { - expect(await this.token.flashFeeReceiver()).to.be.eq(ZERO_ADDRESS); + expect(await this.token.$_flashFeeReceiver()).to.be.eq(ZERO_ADDRESS); }); }); @@ -99,7 +100,7 @@ contract('ERC20FlashMint', function (accounts) { beforeEach('init receiver balance & set flash fee', async function () { this.receiver = await ERC3156FlashBorrowerMock.new(true, true); - const receipt = await this.token.mint(this.receiver.address, receiverInitialBalance); + const receipt = await this.token.$_mint(this.receiver.address, receiverInitialBalance); await expectEvent(receipt, 'Transfer', { from: ZERO_ADDRESS, to: this.receiver.address, value: receiverInitialBalance }); expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal(receiverInitialBalance); @@ -116,14 +117,14 @@ contract('ERC20FlashMint', function (accounts) { expect(await this.token.totalSupply()).to.be.bignumber.equal(initialSupply.add(receiverInitialBalance).sub(flashFee)); expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal(receiverInitialBalance.sub(flashFee)); - expect(await this.token.balanceOf(await this.token.flashFeeReceiver())).to.be.bignumber.equal('0'); + expect(await this.token.balanceOf(await this.token.$_flashFeeReceiver())).to.be.bignumber.equal('0'); expect(await this.token.allowance(this.receiver.address, this.token.address)).to.be.bignumber.equal('0'); }); it('custom flash fee receiver', async function () { const flashFeeReceiverAddress = anotherAccount; await this.token.setFlashFeeReceiver(flashFeeReceiverAddress); - expect(await this.token.flashFeeReceiver()).to.be.eq(flashFeeReceiverAddress); + expect(await this.token.$_flashFeeReceiver()).to.be.eq(flashFeeReceiverAddress); expect(await this.token.balanceOf(flashFeeReceiverAddress)).to.be.bignumber.equal('0'); diff --git a/test/token/ERC20/extensions/ERC20Pausable.test.js b/test/token/ERC20/extensions/ERC20Pausable.test.js index 8670e2fc9..03c630451 100644 --- a/test/token/ERC20/extensions/ERC20Pausable.test.js +++ b/test/token/ERC20/extensions/ERC20Pausable.test.js @@ -2,7 +2,7 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC20PausableMock = artifacts.require('ERC20PausableMock'); +const ERC20Pausable = artifacts.require('$ERC20Pausable'); contract('ERC20Pausable', function (accounts) { const [ holder, recipient, anotherAccount ] = accounts; @@ -13,7 +13,8 @@ contract('ERC20Pausable', function (accounts) { const symbol = 'MTKN'; beforeEach(async function () { - this.token = await ERC20PausableMock.new(name, symbol, holder, initialSupply); + this.token = await ERC20Pausable.new(name, symbol); + await this.token.$_mint(holder, initialSupply); }); describe('pausable token', function () { @@ -26,8 +27,8 @@ contract('ERC20Pausable', function (accounts) { }); it('allows to transfer when paused and then unpaused', async function () { - await this.token.pause(); - await this.token.unpause(); + await this.token.$_pause(); + await this.token.$_unpause(); await this.token.transfer(recipient, initialSupply, { from: holder }); @@ -36,7 +37,7 @@ contract('ERC20Pausable', function (accounts) { }); it('reverts when trying to transfer when paused', async function () { - await this.token.pause(); + await this.token.$_pause(); await expectRevert(this.token.transfer(recipient, initialSupply, { from: holder }), 'ERC20Pausable: token transfer while paused', @@ -59,8 +60,8 @@ contract('ERC20Pausable', function (accounts) { }); it('allows to transfer when paused and then unpaused', async function () { - await this.token.pause(); - await this.token.unpause(); + await this.token.$_pause(); + await this.token.$_unpause(); await this.token.transferFrom(holder, recipient, allowance, { from: anotherAccount }); @@ -69,7 +70,7 @@ contract('ERC20Pausable', function (accounts) { }); it('reverts when trying to transfer from when paused', async function () { - await this.token.pause(); + await this.token.$_pause(); await expectRevert(this.token.transferFrom( holder, recipient, allowance, { from: anotherAccount }), 'ERC20Pausable: token transfer while paused', @@ -81,24 +82,24 @@ contract('ERC20Pausable', function (accounts) { const amount = new BN('42'); it('allows to mint when unpaused', async function () { - await this.token.mint(recipient, amount); + await this.token.$_mint(recipient, amount); expect(await this.token.balanceOf(recipient)).to.be.bignumber.equal(amount); }); it('allows to mint when paused and then unpaused', async function () { - await this.token.pause(); - await this.token.unpause(); + await this.token.$_pause(); + await this.token.$_unpause(); - await this.token.mint(recipient, amount); + await this.token.$_mint(recipient, amount); expect(await this.token.balanceOf(recipient)).to.be.bignumber.equal(amount); }); it('reverts when trying to mint when paused', async function () { - await this.token.pause(); + await this.token.$_pause(); - await expectRevert(this.token.mint(recipient, amount), + await expectRevert(this.token.$_mint(recipient, amount), 'ERC20Pausable: token transfer while paused', ); }); @@ -108,24 +109,24 @@ contract('ERC20Pausable', function (accounts) { const amount = new BN('42'); it('allows to burn when unpaused', async function () { - await this.token.burn(holder, amount); + await this.token.$_burn(holder, amount); expect(await this.token.balanceOf(holder)).to.be.bignumber.equal(initialSupply.sub(amount)); }); it('allows to burn when paused and then unpaused', async function () { - await this.token.pause(); - await this.token.unpause(); + await this.token.$_pause(); + await this.token.$_unpause(); - await this.token.burn(holder, amount); + await this.token.$_burn(holder, amount); expect(await this.token.balanceOf(holder)).to.be.bignumber.equal(initialSupply.sub(amount)); }); it('reverts when trying to burn when paused', async function () { - await this.token.pause(); + await this.token.$_pause(); - await expectRevert(this.token.burn(holder, amount), + await expectRevert(this.token.$_burn(holder, amount), 'ERC20Pausable: token transfer while paused', ); }); diff --git a/test/token/ERC20/extensions/ERC20Snapshot.test.js b/test/token/ERC20/extensions/ERC20Snapshot.test.js index 64d922706..6f7646d77 100644 --- a/test/token/ERC20/extensions/ERC20Snapshot.test.js +++ b/test/token/ERC20/extensions/ERC20Snapshot.test.js @@ -1,5 +1,5 @@ const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); -const ERC20SnapshotMock = artifacts.require('ERC20SnapshotMock'); +const ERC20Snapshot = artifacts.require('$ERC20Snapshot'); const { expect } = require('chai'); @@ -12,18 +12,19 @@ contract('ERC20Snapshot', function (accounts) { const symbol = 'MTKN'; beforeEach(async function () { - this.token = await ERC20SnapshotMock.new(name, symbol, initialHolder, initialSupply); + this.token = await ERC20Snapshot.new(name, symbol); + await this.token.$_mint(initialHolder, initialSupply); }); describe('snapshot', function () { it('emits a snapshot event', async function () { - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot'); }); it('creates increasing snapshots ids, starting from 1', async function () { for (const id of ['1', '2', '3', '4', '5']) { - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id }); } }); @@ -42,7 +43,7 @@ contract('ERC20Snapshot', function (accounts) { beforeEach(async function () { this.initialSnapshotId = new BN('1'); - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id: this.initialSnapshotId }); }); @@ -54,8 +55,8 @@ contract('ERC20Snapshot', function (accounts) { context('with supply changes after the snapshot', function () { beforeEach(async function () { - await this.token.mint(other, new BN('50')); - await this.token.burn(initialHolder, new BN('20')); + await this.token.$_mint(other, new BN('50')); + await this.token.$_burn(initialHolder, new BN('20')); }); it('returns the total supply before the changes', async function () { @@ -66,7 +67,7 @@ contract('ERC20Snapshot', function (accounts) { beforeEach(async function () { this.secondSnapshotId = new BN('2'); - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id: this.secondSnapshotId }); }); @@ -84,7 +85,7 @@ contract('ERC20Snapshot', function (accounts) { this.secondSnapshotIds = ['2', '3', '4']; for (const id of this.secondSnapshotIds) { - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id }); } }); @@ -116,7 +117,7 @@ contract('ERC20Snapshot', function (accounts) { beforeEach(async function () { this.initialSnapshotId = new BN('1'); - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id: this.initialSnapshotId }); }); @@ -132,8 +133,8 @@ contract('ERC20Snapshot', function (accounts) { context('with balance changes after the snapshot', function () { beforeEach(async function () { await this.token.transfer(recipient, new BN('10'), { from: initialHolder }); - await this.token.mint(other, new BN('50')); - await this.token.burn(initialHolder, new BN('20')); + await this.token.$_mint(other, new BN('50')); + await this.token.$_burn(initialHolder, new BN('20')); }); it('returns the balances before the changes', async function () { @@ -147,7 +148,7 @@ contract('ERC20Snapshot', function (accounts) { beforeEach(async function () { this.secondSnapshotId = new BN('2'); - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id: this.secondSnapshotId }); }); @@ -174,7 +175,7 @@ contract('ERC20Snapshot', function (accounts) { this.secondSnapshotIds = ['2', '3', '4']; for (const id of this.secondSnapshotIds) { - const receipt = await this.token.snapshot(); + const receipt = await this.token.$_snapshot(); expectEvent(receipt, 'Snapshot', { id }); } }); diff --git a/test/token/ERC20/extensions/ERC20Votes.test.js b/test/token/ERC20/extensions/ERC20Votes.test.js index da7b5cd47..18d3011cd 100644 --- a/test/token/ERC20/extensions/ERC20Votes.test.js +++ b/test/token/ERC20/extensions/ERC20Votes.test.js @@ -8,10 +8,11 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const ERC20VotesMock = artifacts.require('ERC20VotesMock'); +const ERC20Votes = artifacts.require('$ERC20Votes'); const { batchInBlock } = require('../../../helpers/txpool'); const { EIP712Domain, domainSeparator } = require('../../../helpers/eip712'); +const { getChainId } = require('../../../helpers/chainid'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -28,12 +29,8 @@ contract('ERC20Votes', function (accounts) { const supply = new BN('10000000000000000000000000'); beforeEach(async function () { - this.token = await ERC20VotesMock.new(name, symbol); - - // We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id - // from within the EVM as from the JSON RPC interface. - // See https://github.com/trufflesuite/ganache-core/issues/515 - this.chainId = await this.token.getChainId(); + this.chainId = await getChainId(); + this.token = await ERC20Votes.new(name, symbol, name); }); it('initial nonce is 0', async function () { @@ -44,14 +41,14 @@ contract('ERC20Votes', function (accounts) { expect( await this.token.DOMAIN_SEPARATOR(), ).to.equal( - await domainSeparator(name, version, this.chainId, this.token.address), + await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); it('minting restriction', async function () { const amount = new BN('2').pow(new BN('224')); await expectRevert( - this.token.mint(holder, amount), + this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes', ); }); @@ -59,7 +56,7 @@ contract('ERC20Votes', function (accounts) { it('recent checkpoints', async function () { await this.token.delegate(holder, { from: holder }); for (let i = 0; i < 6; i++) { - await this.token.mint(holder, 1); + await this.token.$_mint(holder, 1); } const block = await web3.eth.getBlockNumber(); expect(await this.token.numCheckpoints(holder)).to.be.bignumber.equal('6'); @@ -72,7 +69,7 @@ contract('ERC20Votes', function (accounts) { describe('set delegation', function () { describe('call', function () { it('delegation with balance', async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); const { receipt } = await this.token.delegate(holder, { from: holder }); @@ -123,7 +120,7 @@ contract('ERC20Votes', function (accounts) { }}); beforeEach(async function () { - await this.token.mint(delegatorAddress, supply); + await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { @@ -229,7 +226,7 @@ contract('ERC20Votes', function (accounts) { describe('change delegation', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); await this.token.delegate(holder, { from: holder }); }); @@ -267,7 +264,7 @@ contract('ERC20Votes', function (accounts) { describe('transfers', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); }); it('no delegation', async function () { @@ -338,7 +335,7 @@ contract('ERC20Votes', function (accounts) { // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. describe('Compound test suite', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); }); describe('balanceOf', function () { @@ -471,7 +468,7 @@ contract('ERC20Votes', function (accounts) { }); it('returns the latest block if >= last checkpoint block', async function () { - t1 = await this.token.mint(holder, supply); + t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); @@ -482,7 +479,7 @@ contract('ERC20Votes', function (accounts) { it('returns zero if < first checkpoint block', async function () { await time.advanceBlock(); - const t1 = await this.token.mint(holder, supply); + const t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); @@ -491,16 +488,16 @@ contract('ERC20Votes', function (accounts) { }); it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.mint(holder, supply); + const t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); - const t2 = await this.token.burn(holder, 10); + const t2 = await this.token.$_burn(holder, 10); await time.advanceBlock(); await time.advanceBlock(); - const t3 = await this.token.burn(holder, 10); + const t3 = await this.token.$_burn(holder, 10); await time.advanceBlock(); await time.advanceBlock(); - const t4 = await this.token.mint(holder, 20); + const t4 = await this.token.$_mint(holder, 20); await time.advanceBlock(); await time.advanceBlock(); diff --git a/test/token/ERC20/extensions/ERC20VotesComp.test.js b/test/token/ERC20/extensions/ERC20VotesComp.test.js index d03050951..5efaa5561 100644 --- a/test/token/ERC20/extensions/ERC20VotesComp.test.js +++ b/test/token/ERC20/extensions/ERC20VotesComp.test.js @@ -8,10 +8,11 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const ERC20VotesCompMock = artifacts.require('ERC20VotesCompMock'); +const ERC20VotesComp = artifacts.require('$ERC20VotesComp'); const { batchInBlock } = require('../../../helpers/txpool'); const { EIP712Domain, domainSeparator } = require('../../../helpers/eip712'); +const { getChainId } = require('../../../helpers/chainid'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -28,12 +29,8 @@ contract('ERC20VotesComp', function (accounts) { const supply = new BN('10000000000000000000000000'); beforeEach(async function () { - this.token = await ERC20VotesCompMock.new(name, symbol); - - // We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id - // from within the EVM as from the JSON RPC interface. - // See https://github.com/trufflesuite/ganache-core/issues/515 - this.chainId = await this.token.getChainId(); + this.chainId = await getChainId(); + this.token = await ERC20VotesComp.new(name, symbol, name); }); it('initial nonce is 0', async function () { @@ -44,14 +41,14 @@ contract('ERC20VotesComp', function (accounts) { expect( await this.token.DOMAIN_SEPARATOR(), ).to.equal( - await domainSeparator(name, version, this.chainId, this.token.address), + await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); it('minting restriction', async function () { const amount = new BN('2').pow(new BN('96')); await expectRevert( - this.token.mint(holder, amount), + this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes', ); }); @@ -59,7 +56,7 @@ contract('ERC20VotesComp', function (accounts) { describe('set delegation', function () { describe('call', function () { it('delegation with balance', async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); const { receipt } = await this.token.delegate(holder, { from: holder }); @@ -110,7 +107,7 @@ contract('ERC20VotesComp', function (accounts) { }}); beforeEach(async function () { - await this.token.mint(delegatorAddress, supply); + await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { @@ -216,7 +213,7 @@ contract('ERC20VotesComp', function (accounts) { describe('change delegation', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); await this.token.delegate(holder, { from: holder }); }); @@ -254,7 +251,7 @@ contract('ERC20VotesComp', function (accounts) { describe('transfers', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); }); it('no delegation', async function () { @@ -316,7 +313,7 @@ contract('ERC20VotesComp', function (accounts) { // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. describe('Compound test suite', function () { beforeEach(async function () { - await this.token.mint(holder, supply); + await this.token.$_mint(holder, supply); }); describe('balanceOf', function () { @@ -449,7 +446,7 @@ contract('ERC20VotesComp', function (accounts) { }); it('returns the latest block if >= last checkpoint block', async function () { - t1 = await this.token.mint(holder, supply); + t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); @@ -460,7 +457,7 @@ contract('ERC20VotesComp', function (accounts) { it('returns zero if < first checkpoint block', async function () { await time.advanceBlock(); - const t1 = await this.token.mint(holder, supply); + const t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); @@ -469,16 +466,16 @@ contract('ERC20VotesComp', function (accounts) { }); it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.mint(holder, supply); + const t1 = await this.token.$_mint(holder, supply); await time.advanceBlock(); await time.advanceBlock(); - const t2 = await this.token.burn(holder, 10); + const t2 = await this.token.$_burn(holder, 10); await time.advanceBlock(); await time.advanceBlock(); - const t3 = await this.token.burn(holder, 10); + const t3 = await this.token.$_burn(holder, 10); await time.advanceBlock(); await time.advanceBlock(); - const t4 = await this.token.mint(holder, 20); + const t4 = await this.token.$_mint(holder, 20); await time.advanceBlock(); await time.advanceBlock(); diff --git a/test/token/ERC20/extensions/ERC20Wrapper.test.js b/test/token/ERC20/extensions/ERC20Wrapper.test.js index ceb813e08..a82164cdf 100644 --- a/test/token/ERC20/extensions/ERC20Wrapper.test.js +++ b/test/token/ERC20/extensions/ERC20Wrapper.test.js @@ -5,8 +5,8 @@ const { ZERO_ADDRESS, MAX_UINT256 } = constants; const { shouldBehaveLikeERC20 } = require('../ERC20.behavior'); const NotAnERC20 = artifacts.require('CallReceiverMock'); -const ERC20Mock = artifacts.require('ERC20DecimalsMock'); -const ERC20WrapperMock = artifacts.require('ERC20WrapperMock'); +const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); +const ERC20Wrapper = artifacts.require('$ERC20Wrapper'); contract('ERC20', function (accounts) { const [ initialHolder, recipient, anotherAccount ] = accounts; @@ -17,10 +17,10 @@ contract('ERC20', function (accounts) { const initialSupply = new BN(100); beforeEach(async function () { - this.underlying = await ERC20Mock.new(name, symbol, 9); - this.token = await ERC20WrapperMock.new(this.underlying.address, `Wrapped ${name}`, `W${symbol}`); + this.underlying = await ERC20Decimals.new(name, symbol, 9); + await this.underlying.$_mint(initialHolder, initialSupply); - await this.underlying.mint(initialHolder, initialSupply); + this.token = await ERC20Wrapper.new(`Wrapped ${name}`, `W${symbol}`, this.underlying.address); }); afterEach(async function () { @@ -41,7 +41,7 @@ contract('ERC20', function (accounts) { it('decimals default back to 18 if token has no metadata', async function () { const noDecimals = await NotAnERC20.new(); - const otherToken = await ERC20WrapperMock.new(noDecimals.address, `Wrapped ${name}`, `W${symbol}`); + const otherToken = await ERC20Wrapper.new(`Wrapped ${name}`, `W${symbol}`, noDecimals.address); expect(await otherToken.decimals()).to.be.bignumber.equal('18'); }); @@ -159,7 +159,7 @@ contract('ERC20', function (accounts) { await this.underlying.approve(this.token.address, initialSupply, { from: initialHolder }); await this.token.depositFor(initialHolder, initialSupply, { from: initialHolder }); - const { tx } = await this.token.recover(anotherAccount); + const { tx } = await this.token.$_recover(anotherAccount); await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: ZERO_ADDRESS, to: anotherAccount, @@ -170,7 +170,7 @@ contract('ERC20', function (accounts) { it('something to recover', async function () { await this.underlying.transfer(this.token.address, initialSupply, { from: initialHolder }); - const { tx } = await this.token.recover(anotherAccount); + const { tx } = await this.token.$_recover(anotherAccount); await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: ZERO_ADDRESS, to: anotherAccount, diff --git a/test/token/ERC20/extensions/ERC4626.t.sol b/test/token/ERC20/extensions/ERC4626.t.sol index 0aac0d411..3d7dd4a3e 100644 --- a/test/token/ERC20/extensions/ERC4626.t.sol +++ b/test/token/ERC20/extensions/ERC4626.t.sol @@ -5,12 +5,12 @@ import "erc4626-tests/ERC4626.test.sol"; import {SafeCast} from "../../../../contracts/utils/math/SafeCast.sol"; import {ERC20Mock} from "../../../../contracts/mocks/ERC20Mock.sol"; -import {ERC4626Mock, IERC20Metadata} from "../../../../contracts/mocks/ERC4626Mock.sol"; +import {ERC4626Mock} from "../../../../contracts/mocks/ERC4626Mock.sol"; contract ERC4626StdTest is ERC4626Test { function setUp() public override { - _underlying_ = address(new ERC20Mock("MockERC20", "MockERC20", address(this), 0)); - _vault_ = address(new ERC4626Mock(IERC20Metadata(_underlying_), "MockERC4626", "MockERC4626")); + _underlying_ = address(new ERC20Mock()); + _vault_ = address(new ERC4626Mock(_underlying_)); _delta_ = 0; _vaultMayBeEmpty = false; _unlimitedAmount = true; diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index 4e6986c44..d095fb9d9 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -1,9 +1,9 @@ const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC20DecimalsMock = artifacts.require('ERC20DecimalsMock'); -const ERC4626Mock = artifacts.require('ERC4626Mock'); -const ERC4626DecimalMock = artifacts.require('ERC4626DecimalMock'); +const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); +const ERC4626 = artifacts.require('$ERC4626'); +const ERC4626Decimals = artifacts.require('$ERC4626DecimalsMock'); const parseToken = (token) => (new BN(token)).mul(new BN('1000000000000')); const parseShare = (share) => (new BN(share)).mul(new BN('1000000000000000000')); @@ -15,10 +15,10 @@ contract('ERC4626', function (accounts) { const symbol = 'MTKN'; beforeEach(async function () { - this.token = await ERC20DecimalsMock.new(name, symbol, 12); - this.vault = await ERC4626DecimalMock.new(this.token.address, name + ' Vault', symbol + 'V', 18); + this.token = await ERC20Decimals.new(name, symbol, 12); + this.vault = await ERC4626Decimals.new(name + ' Vault', symbol + 'V', this.token.address, 18); - await this.token.mint(holder, web3.utils.toWei('100')); + await this.token.$_mint(holder, web3.utils.toWei('100')); await this.token.approve(this.vault.address, constants.MAX_UINT256, { from: holder }); await this.vault.approve(spender, constants.MAX_UINT256, { from: holder }); }); @@ -32,8 +32,8 @@ contract('ERC4626', function (accounts) { it('inherit decimals if from asset', async function () { for (const decimals of [ 0, 9, 12, 18, 36 ].map(web3.utils.toBN)) { - const token = await ERC20DecimalsMock.new('', '', decimals); - const vault = await ERC4626Mock.new(token.address, '', ''); + const token = await ERC20Decimals.new('', '', decimals); + const vault = await ERC4626.new('', '', token.address); expect(await vault.decimals()).to.be.bignumber.equal(decimals); } }); @@ -122,7 +122,7 @@ contract('ERC4626', function (accounts) { describe('partially empty vault: assets & no shares', function () { beforeEach(async function () { - await this.token.mint(this.vault.address, parseToken(1)); // 1 token + await this.token.$_mint(this.vault.address, parseToken(1)); // 1 token }); it('status', async function () { @@ -208,7 +208,7 @@ contract('ERC4626', function (accounts) { describe('partially empty vault: shares & no assets', function () { beforeEach(async function () { - await this.vault.mockMint(holder, parseShare(1)); // 1 share + await this.vault.$_mint(holder, parseShare(1)); // 1 share }); it('status', async function () { @@ -302,8 +302,8 @@ contract('ERC4626', function (accounts) { describe('full vault: assets & shares', function () { beforeEach(async function () { - await this.token.mint(this.vault.address, parseToken(1)); // 1 tokens - await this.vault.mockMint(holder, parseShare(100)); // 100 share + await this.token.$_mint(this.vault.address, parseToken(1)); // 1 tokens + await this.vault.$_mint(holder, parseShare(100)); // 100 share }); it('status', async function () { @@ -409,11 +409,11 @@ contract('ERC4626', function (accounts) { /// https://github.com/transmissions11/solmate/blob/main/src/test/ERC4626.t.sol it('multiple mint, deposit, redeem & withdrawal', async function () { // test designed with both asset using similar decimals - this.token = await ERC20DecimalsMock.new(name, symbol, 18); - this.vault = await ERC4626Mock.new(this.token.address, name + ' Vault', symbol + 'V'); + this.token = await ERC20Decimals.new(name, symbol, 18); + this.vault = await ERC4626.new(name + ' Vault', symbol + 'V', this.token.address); - await this.token.mint(user1, 4000); - await this.token.mint(user2, 7001); + await this.token.$_mint(user1, 4000); + await this.token.$_mint(user2, 7001); await this.token.approve(this.vault.address, 4000, { from: user1 }); await this.token.approve(this.vault.address, 7001, { from: user2 }); @@ -464,7 +464,7 @@ contract('ERC4626', function (accounts) { } // 3. Vault mutates by +3000 tokens (simulated yield returned from strategy) - await this.token.mint(this.vault.address, 3000); + await this.token.$_mint(this.vault.address, 3000); expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('2000'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('4000'); @@ -521,7 +521,7 @@ contract('ERC4626', function (accounts) { // 6. Vault mutates by +3000 tokens // NOTE: Vault holds 17001 tokens, but sum of assetsOf() is 17000. - await this.token.mint(this.vault.address, 3000); + await this.token.$_mint(this.vault.address, 3000); expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('3333'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('6000'); diff --git a/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/test/token/ERC20/extensions/draft-ERC20Permit.test.js index 26d0c849c..0c6b0982d 100644 --- a/test/token/ERC20/extensions/draft-ERC20Permit.test.js +++ b/test/token/ERC20/extensions/draft-ERC20Permit.test.js @@ -8,9 +8,10 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const ERC20PermitMock = artifacts.require('ERC20PermitMock'); +const ERC20Permit = artifacts.require('$ERC20Permit'); const { EIP712Domain, Permit, domainSeparator } = require('../../../helpers/eip712'); +const { getChainId } = require('../../../helpers/chainid'); contract('ERC20Permit', function (accounts) { const [ initialHolder, spender ] = accounts; @@ -22,12 +23,10 @@ contract('ERC20Permit', function (accounts) { const initialSupply = new BN(100); beforeEach(async function () { - this.token = await ERC20PermitMock.new(name, symbol, initialHolder, initialSupply); + this.chainId = await getChainId(); - // We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id - // from within the EVM as from the JSON RPC interface. - // See https://github.com/trufflesuite/ganache-core/issues/515 - this.chainId = await this.token.getChainId(); + this.token = await ERC20Permit.new(name, symbol, name); + await this.token.$_mint(initialHolder, initialSupply); }); it('initial nonce is 0', async function () { @@ -38,7 +37,7 @@ contract('ERC20Permit', function (accounts) { expect( await this.token.DOMAIN_SEPARATOR(), ).to.equal( - await domainSeparator(name, version, this.chainId, this.token.address), + await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); diff --git a/test/token/ERC20/utils/SafeERC20.test.js b/test/token/ERC20/utils/SafeERC20.test.js index 4c54c5830..dab116131 100644 --- a/test/token/ERC20/utils/SafeERC20.test.js +++ b/test/token/ERC20/utils/SafeERC20.test.js @@ -1,12 +1,13 @@ const { constants, expectRevert } = require('@openzeppelin/test-helpers'); +const SafeERC20 = artifacts.require('$SafeERC20'); const ERC20ReturnFalseMock = artifacts.require('ERC20ReturnFalseMock'); const ERC20ReturnTrueMock = artifacts.require('ERC20ReturnTrueMock'); const ERC20NoReturnMock = artifacts.require('ERC20NoReturnMock'); const ERC20PermitNoRevertMock = artifacts.require('ERC20PermitNoRevertMock'); -const SafeERC20Wrapper = artifacts.require('SafeERC20Wrapper'); const { EIP712Domain, Permit } = require('../../../helpers/eip712'); +const { getChainId } = require('../../../helpers/chainid'); const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); @@ -15,9 +16,13 @@ const Wallet = require('ethereumjs-wallet').default; contract('SafeERC20', function (accounts) { const [ hasNoCode ] = accounts; + before(async function () { + this.mock = await SafeERC20.new(); + }); + describe('with address that has no contract code', function () { beforeEach(async function () { - this.wrapper = await SafeERC20Wrapper.new(hasNoCode); + this.token = { address: hasNoCode }; }); shouldRevertOnAllCalls('Address: call to non-contract'); @@ -25,7 +30,7 @@ contract('SafeERC20', function (accounts) { describe('with token that returns false on all calls', function () { beforeEach(async function () { - this.wrapper = await SafeERC20Wrapper.new((await ERC20ReturnFalseMock.new()).address); + this.token = await ERC20ReturnFalseMock.new(); }); shouldRevertOnAllCalls('SafeERC20: ERC20 operation did not succeed'); @@ -33,7 +38,7 @@ contract('SafeERC20', function (accounts) { describe('with token that returns true on all calls', function () { beforeEach(async function () { - this.wrapper = await SafeERC20Wrapper.new((await ERC20ReturnTrueMock.new()).address); + this.token = await ERC20ReturnTrueMock.new(); }); shouldOnlyRevertOnErrors(); @@ -41,7 +46,7 @@ contract('SafeERC20', function (accounts) { describe('with token that returns no boolean values', function () { beforeEach(async function () { - this.wrapper = await SafeERC20Wrapper.new((await ERC20NoReturnMock.new()).address); + this.token = await ERC20NoReturnMock.new(); }); shouldOnlyRevertOnErrors(); @@ -53,10 +58,9 @@ contract('SafeERC20', function (accounts) { const spender = hasNoCode; beforeEach(async function () { - this.token = await ERC20PermitNoRevertMock.new(); - this.wrapper = await SafeERC20Wrapper.new(this.token.address); + const chainId = await getChainId(); - const chainId = await this.token.getChainId(); + this.token = await ERC20PermitNoRevertMock.new(); this.data = { primaryType: 'Permit', @@ -71,7 +75,8 @@ contract('SafeERC20', function (accounts) { expect(await this.token.nonces(owner)).to.be.bignumber.equal('0'); expect(await this.token.allowance(owner, spender)).to.be.bignumber.equal('0'); - await this.wrapper.permit( + await this.mock.$safePermit( + this.token.address, this.data.message.owner, this.data.message.spender, this.data.message.value, @@ -88,7 +93,8 @@ contract('SafeERC20', function (accounts) { it('revert on reused signature', async function () { expect(await this.token.nonces(owner)).to.be.bignumber.equal('0'); // use valid signature and consume nounce - await this.wrapper.permit( + await this.mock.$safePermit( + this.token.address, this.data.message.owner, this.data.message.spender, this.data.message.value, @@ -111,7 +117,8 @@ contract('SafeERC20', function (accounts) { expect(await this.token.nonces(owner)).to.be.bignumber.equal('1'); // invalid call revert when called through the SafeERC20 library await expectRevert( - this.wrapper.permit( + this.mock.$safePermit( + this.token.address, this.data.message.owner, this.data.message.spender, this.data.message.value, @@ -146,7 +153,8 @@ contract('SafeERC20', function (accounts) { // invalid call revert when called through the SafeERC20 library await expectRevert( - this.wrapper.permit( + this.mock.$safePermit( + this.token.address, this.data.message.owner, this.data.message.spender, this.data.message.value, @@ -163,58 +171,67 @@ contract('SafeERC20', function (accounts) { function shouldRevertOnAllCalls (reason) { it('reverts on transfer', async function () { - await expectRevert(this.wrapper.transfer(), reason); + await expectRevert( + this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0), + reason, + ); }); it('reverts on transferFrom', async function () { - await expectRevert(this.wrapper.transferFrom(), reason); + await expectRevert( + this.mock.$safeTransferFrom(this.token.address, this.mock.address, constants.ZERO_ADDRESS, 0), + reason, + ); }); it('reverts on approve', async function () { - await expectRevert(this.wrapper.approve(0), reason); + await expectRevert( + this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0), + reason, + ); }); it('reverts on increaseAllowance', async function () { // [TODO] make sure it's reverting for the right reason - await expectRevert.unspecified(this.wrapper.increaseAllowance(0)); + await expectRevert.unspecified(this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 0)); }); it('reverts on decreaseAllowance', async function () { // [TODO] make sure it's reverting for the right reason - await expectRevert.unspecified(this.wrapper.decreaseAllowance(0)); + await expectRevert.unspecified(this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 0)); }); } function shouldOnlyRevertOnErrors () { it('doesn\'t revert on transfer', async function () { - await this.wrapper.transfer(); + await this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0); }); it('doesn\'t revert on transferFrom', async function () { - await this.wrapper.transferFrom(); + await this.mock.$safeTransferFrom(this.token.address, this.mock.address, constants.ZERO_ADDRESS, 0); }); describe('approvals', function () { context('with zero allowance', function () { beforeEach(async function () { - await this.wrapper.setAllowance(0); + await this.token.setAllowance(this.mock.address, 0); }); it('doesn\'t revert when approving a non-zero allowance', async function () { - await this.wrapper.approve(100); + await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 100); }); it('doesn\'t revert when approving a zero allowance', async function () { - await this.wrapper.approve(0); + await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); }); it('doesn\'t revert when increasing the allowance', async function () { - await this.wrapper.increaseAllowance(10); + await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); }); it('reverts when decreasing the allowance', async function () { await expectRevert( - this.wrapper.decreaseAllowance(10), + this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10), 'SafeERC20: decreased allowance below zero', ); }); @@ -222,31 +239,31 @@ function shouldOnlyRevertOnErrors () { context('with non-zero allowance', function () { beforeEach(async function () { - await this.wrapper.setAllowance(100); + await this.token.setAllowance(this.mock.address, 100); }); it('reverts when approving a non-zero allowance', async function () { await expectRevert( - this.wrapper.approve(20), + this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 20), 'SafeERC20: approve from non-zero to non-zero allowance', ); }); it('doesn\'t revert when approving a zero allowance', async function () { - await this.wrapper.approve(0); + await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); }); it('doesn\'t revert when increasing the allowance', async function () { - await this.wrapper.increaseAllowance(10); + await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); }); it('doesn\'t revert when decreasing the allowance to a positive value', async function () { - await this.wrapper.decreaseAllowance(50); + await this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 50); }); it('reverts when decreasing the allowance to a negative value', async function () { await expectRevert( - this.wrapper.decreaseAllowance(200), + this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 200), 'SafeERC20: decreased allowance below zero', ); }); diff --git a/test/token/ERC20/utils/TokenTimelock.test.js b/test/token/ERC20/utils/TokenTimelock.test.js index e546b341e..4e0dc0a84 100644 --- a/test/token/ERC20/utils/TokenTimelock.test.js +++ b/test/token/ERC20/utils/TokenTimelock.test.js @@ -2,7 +2,7 @@ const { BN, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC20Mock = artifacts.require('ERC20Mock'); +const ERC20 = artifacts.require('$ERC20'); const TokenTimelock = artifacts.require('TokenTimelock'); contract('TokenTimelock', function (accounts) { @@ -15,7 +15,7 @@ contract('TokenTimelock', function (accounts) { context('with token', function () { beforeEach(async function () { - this.token = await ERC20Mock.new(name, symbol, beneficiary, 0); // We're not using the preminted tokens + this.token = await ERC20.new(name, symbol); }); it('rejects a release time in the past', async function () { @@ -30,7 +30,7 @@ contract('TokenTimelock', function (accounts) { beforeEach(async function () { this.releaseTime = (await time.latest()).add(time.duration.years(1)); this.timelock = await TokenTimelock.new(this.token.address, beneficiary, this.releaseTime); - await this.token.mint(this.timelock.address, amount); + await this.token.$_mint(this.timelock.address, amount); }); it('can get state', async function () { diff --git a/test/token/ERC721/ERC721.behavior.js b/test/token/ERC721/ERC721.behavior.js index 7c91671df..436841a25 100644 --- a/test/token/ERC721/ERC721.behavior.js +++ b/test/token/ERC721/ERC721.behavior.js @@ -25,8 +25,8 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('with minted tokens', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); - await this.token.mint(owner, secondTokenId); + await this.token.$_mint(owner, firstTokenId); + await this.token.$_mint(owner, secondTokenId); this.toWhom = other; // default to other for toWhom in context-dependent tests }); @@ -345,7 +345,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('via safeMint', function () { // regular minting is tested in ERC721Mintable.test.js and others it('calls onERC721Received — with data', async function () { this.receiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.None); - const receipt = await this.token.safeMint(this.receiver.address, tokenId, data); + const receipt = await this.token.$_safeMint(this.receiver.address, tokenId, data); await expectEvent.inTransaction(receipt.tx, ERC721ReceiverMock, 'Received', { from: ZERO_ADDRESS, @@ -356,7 +356,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('calls onERC721Received — without data', async function () { this.receiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.None); - const receipt = await this.token.safeMint(this.receiver.address, tokenId); + const receipt = await this.token.$_safeMint(this.receiver.address, tokenId); await expectEvent.inTransaction(receipt.tx, ERC721ReceiverMock, 'Received', { from: ZERO_ADDRESS, @@ -368,7 +368,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts', async function () { const invalidReceiver = await ERC721ReceiverMock.new('0x42', Error.None); await expectRevert( - this.token.safeMint(invalidReceiver.address, tokenId), + this.token.$_safeMint(invalidReceiver.address, tokenId), 'ERC721: transfer to non ERC721Receiver implementer', ); }); @@ -378,7 +378,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts', async function () { const revertingReceiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.RevertWithMessage); await expectRevert( - this.token.safeMint(revertingReceiver.address, tokenId), + this.token.$_safeMint(revertingReceiver.address, tokenId), 'ERC721ReceiverMock: reverting', ); }); @@ -388,7 +388,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts', async function () { const revertingReceiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.RevertWithoutMessage); await expectRevert( - this.token.safeMint(revertingReceiver.address, tokenId), + this.token.$_safeMint(revertingReceiver.address, tokenId), 'ERC721: transfer to non ERC721Receiver implementer', ); }); @@ -398,7 +398,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts', async function () { const revertingReceiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.Panic); await expectRevert.unspecified( - this.token.safeMint(revertingReceiver.address, tokenId), + this.token.$_safeMint(revertingReceiver.address, tokenId), ); }); }); @@ -407,7 +407,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts', async function () { const nonReceiver = this.token; await expectRevert( - this.token.safeMint(nonReceiver.address, tokenId), + this.token.$_safeMint(nonReceiver.address, tokenId), 'ERC721: transfer to non ERC721Receiver implementer', ); }); @@ -647,13 +647,13 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('_mint(address, uint256)', function () { it('reverts with a null destination address', async function () { await expectRevert( - this.token.mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', + this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', ); }); context('with minted token', async function () { beforeEach(async function () { - (this.receipt = await this.token.mint(owner, firstTokenId)); + (this.receipt = await this.token.$_mint(owner, firstTokenId)); }); it('emits a Transfer event', function () { @@ -666,7 +666,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another }); it('reverts when adding a token id that already exists', async function () { - await expectRevert(this.token.mint(owner, firstTokenId), 'ERC721: token already minted'); + await expectRevert(this.token.$_mint(owner, firstTokenId), 'ERC721: token already minted'); }); }); }); @@ -674,19 +674,19 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('_burn', function () { it('reverts when burning a non-existent token id', async function () { await expectRevert( - this.token.burn(nonExistentTokenId), 'ERC721: invalid token ID', + this.token.$_burn(nonExistentTokenId), 'ERC721: invalid token ID', ); }); context('with minted tokens', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); - await this.token.mint(owner, secondTokenId); + await this.token.$_mint(owner, firstTokenId); + await this.token.$_mint(owner, secondTokenId); }); context('with burnt token', function () { beforeEach(async function () { - (this.receipt = await this.token.burn(firstTokenId)); + (this.receipt = await this.token.$_burn(firstTokenId)); }); it('emits a Transfer event', function () { @@ -702,7 +702,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('reverts when burning a token id that has been deleted', async function () { await expectRevert( - this.token.burn(firstTokenId), 'ERC721: invalid token ID', + this.token.$_burn(firstTokenId), 'ERC721: invalid token ID', ); }); }); @@ -717,8 +717,8 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve context('with minted tokens', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); - await this.token.mint(owner, secondTokenId); + await this.token.$_mint(owner, firstTokenId); + await this.token.$_mint(owner, secondTokenId); this.toWhom = other; // default to other for toWhom in context-dependent tests }); @@ -795,9 +795,9 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve const newTokenId = new BN(300); const anotherNewTokenId = new BN(400); - await this.token.burn(tokenId); - await this.token.mint(newOwner, newTokenId); - await this.token.mint(newOwner, anotherNewTokenId); + await this.token.$_burn(tokenId); + await this.token.$_mint(newOwner, newTokenId); + await this.token.$_mint(newOwner, anotherNewTokenId); expect(await this.token.totalSupply()).to.be.bignumber.equal('3'); @@ -816,13 +816,13 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve describe('_mint(address, uint256)', function () { it('reverts with a null destination address', async function () { await expectRevert( - this.token.mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', + this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', ); }); context('with minted token', async function () { beforeEach(async function () { - (this.receipt = await this.token.mint(owner, firstTokenId)); + (this.receipt = await this.token.$_mint(owner, firstTokenId)); }); it('adjusts owner tokens by index', async function () { @@ -838,19 +838,19 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve describe('_burn', function () { it('reverts when burning a non-existent token id', async function () { await expectRevert( - this.token.burn(firstTokenId), 'ERC721: invalid token ID', + this.token.$_burn(firstTokenId), 'ERC721: invalid token ID', ); }); context('with minted tokens', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); - await this.token.mint(owner, secondTokenId); + await this.token.$_mint(owner, firstTokenId); + await this.token.$_mint(owner, secondTokenId); }); context('with burnt token', function () { beforeEach(async function () { - (this.receipt = await this.token.burn(firstTokenId)); + (this.receipt = await this.token.$_burn(firstTokenId)); }); it('removes that token from the token list of the owner', async function () { @@ -862,7 +862,7 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve }); it('burns all tokens', async function () { - await this.token.burn(secondTokenId, { from: owner }); + await this.token.$_burn(secondTokenId, { from: owner }); expect(await this.token.totalSupply()).to.be.bignumber.equal('0'); await expectRevert( this.token.tokenByIndex(0), 'ERC721Enumerable: global index out of bounds', @@ -889,7 +889,7 @@ function shouldBehaveLikeERC721Metadata (errorPrefix, name, symbol, owner) { describe('token URI', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); + await this.token.$_mint(owner, firstTokenId); }); it('return empty string by default', async function () { diff --git a/test/token/ERC721/ERC721.test.js b/test/token/ERC721/ERC721.test.js index 1abbd6629..6e72e02bd 100644 --- a/test/token/ERC721/ERC721.test.js +++ b/test/token/ERC721/ERC721.test.js @@ -3,14 +3,14 @@ const { shouldBehaveLikeERC721Metadata, } = require('./ERC721.behavior'); -const ERC721Mock = artifacts.require('ERC721Mock'); +const ERC721 = artifacts.require('$ERC721'); contract('ERC721', function (accounts) { const name = 'Non Fungible Token'; const symbol = 'NFT'; beforeEach(async function () { - this.token = await ERC721Mock.new(name, symbol); + this.token = await ERC721.new(name, symbol); }); shouldBehaveLikeERC721('ERC721', ...accounts); diff --git a/test/token/ERC721/ERC721Enumerable.test.js b/test/token/ERC721/ERC721Enumerable.test.js index 2c1362168..b32f22dd6 100644 --- a/test/token/ERC721/ERC721Enumerable.test.js +++ b/test/token/ERC721/ERC721Enumerable.test.js @@ -4,14 +4,14 @@ const { shouldBehaveLikeERC721Enumerable, } = require('./ERC721.behavior'); -const ERC721Mock = artifacts.require('ERC721EnumerableMock'); +const ERC721Enumerable = artifacts.require('$ERC721Enumerable'); contract('ERC721Enumerable', function (accounts) { const name = 'Non Fungible Token'; const symbol = 'NFT'; beforeEach(async function () { - this.token = await ERC721Mock.new(name, symbol); + this.token = await ERC721Enumerable.new(name, symbol); }); shouldBehaveLikeERC721('ERC721', ...accounts); diff --git a/test/token/ERC721/extensions/ERC721Burnable.test.js b/test/token/ERC721/extensions/ERC721Burnable.test.js index e8fc33494..75a5603fb 100644 --- a/test/token/ERC721/extensions/ERC721Burnable.test.js +++ b/test/token/ERC721/extensions/ERC721Burnable.test.js @@ -1,9 +1,8 @@ const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); -const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); -const ERC721BurnableMock = artifacts.require('ERC721BurnableMock'); +const ERC721Burnable = artifacts.require('$ERC721Burnable'); contract('ERC721Burnable', function (accounts) { const [owner, approved] = accounts; @@ -16,13 +15,13 @@ contract('ERC721Burnable', function (accounts) { const symbol = 'NFT'; beforeEach(async function () { - this.token = await ERC721BurnableMock.new(name, symbol); + this.token = await ERC721Burnable.new(name, symbol); }); describe('like a burnable ERC721', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); - await this.token.mint(owner, secondTokenId); + await this.token.$_mint(owner, firstTokenId); + await this.token.$_mint(owner, secondTokenId); }); describe('burn', function () { @@ -45,7 +44,7 @@ contract('ERC721Burnable', function (accounts) { it('emits a burn event', async function () { expectEvent(receipt, 'Transfer', { from: owner, - to: ZERO_ADDRESS, + to: constants.ZERO_ADDRESS, tokenId: tokenId, }); }); diff --git a/test/token/ERC721/extensions/ERC721Consecutive.test.js b/test/token/ERC721/extensions/ERC721Consecutive.test.js index 5e480abb8..17df12ea1 100644 --- a/test/token/ERC721/extensions/ERC721Consecutive.test.js +++ b/test/token/ERC721/extensions/ERC721Consecutive.test.js @@ -1,9 +1,9 @@ const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC721ConsecutiveMock = artifacts.require('ERC721ConsecutiveMock'); -const ERC721ConsecutiveEnumerableMock = artifacts.require('ERC721ConsecutiveEnumerableMock'); -const ERC721ConsecutiveNoConstructorMintMock = artifacts.require('ERC721ConsecutiveNoConstructorMintMock'); +const ERC721ConsecutiveMock = artifacts.require('$ERC721ConsecutiveMock'); +const ERC721ConsecutiveEnumerableMock = artifacts.require('$ERC721ConsecutiveEnumerableMock'); +const ERC721ConsecutiveNoConstructorMintMock = artifacts.require('$ERC721ConsecutiveNoConstructorMintMock'); contract('ERC721Consecutive', function (accounts) { const [ user1, user2, user3, receiver ] = accounts; @@ -86,7 +86,7 @@ contract('ERC721Consecutive', function (accounts) { describe('minting after construction', function () { it('consecutive minting is not possible after construction', async function () { await expectRevert( - this.token.mintConsecutive(user1, 10), + this.token.$_mintConsecutive(user1, 10), 'ERC721Consecutive: batch minting restricted to constructor', ); }); @@ -94,10 +94,10 @@ contract('ERC721Consecutive', function (accounts) { it('simple minting is possible after construction', async function () { const tokenId = batches.reduce((acc, { amount }) => acc + amount, 0); - expect(await this.token.exists(tokenId)).to.be.equal(false); + expect(await this.token.$_exists(tokenId)).to.be.equal(false); expectEvent( - await this.token.mint(user1, tokenId), + await this.token.$_mint(user1, tokenId), 'Transfer', { from: constants.ZERO_ADDRESS, to: user1, tokenId: tokenId.toString() }, ); @@ -106,10 +106,10 @@ contract('ERC721Consecutive', function (accounts) { it('cannot mint a token that has been batched minted', async function () { const tokenId = batches.reduce((acc, { amount }) => acc + amount, 0) - 1; - expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.$_exists(tokenId)).to.be.equal(true); await expectRevert( - this.token.mint(user1, tokenId), + this.token.$_mint(user1, tokenId), 'ERC721: token already minted', ); }); @@ -124,7 +124,7 @@ contract('ERC721Consecutive', function (accounts) { it('tokens can be burned and re-minted #1', async function () { expectEvent( - await this.token.burn(1, { from: user1 }), + await this.token.$_burn(1, { from: user1 }), 'Transfer', { from: user1, to: constants.ZERO_ADDRESS, tokenId: '1' }, ); @@ -132,7 +132,7 @@ contract('ERC721Consecutive', function (accounts) { await expectRevert(this.token.ownerOf(1), 'ERC721: invalid token ID'); expectEvent( - await this.token.mint(user2, 1), + await this.token.$_mint(user2, 1), 'Transfer', { from: constants.ZERO_ADDRESS, to: user2, tokenId: '1' }, ); @@ -143,33 +143,33 @@ contract('ERC721Consecutive', function (accounts) { it('tokens can be burned and re-minted #2', async function () { const tokenId = batches.reduce((acc, { amount }) => acc.addn(amount), web3.utils.toBN(0)); - expect(await this.token.exists(tokenId)).to.be.equal(false); + expect(await this.token.$_exists(tokenId)).to.be.equal(false); await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); // mint - await this.token.mint(user1, tokenId); + await this.token.$_mint(user1, tokenId); - expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.$_exists(tokenId)).to.be.equal(true); expect(await this.token.ownerOf(tokenId), user1); // burn expectEvent( - await this.token.burn(tokenId, { from: user1 }), + await this.token.$_burn(tokenId, { from: user1 }), 'Transfer', { from: user1, to: constants.ZERO_ADDRESS, tokenId }, ); - expect(await this.token.exists(tokenId)).to.be.equal(false); + expect(await this.token.$_exists(tokenId)).to.be.equal(false); await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); // re-mint expectEvent( - await this.token.mint(user2, tokenId), + await this.token.$_mint(user2, tokenId), 'Transfer', { from: constants.ZERO_ADDRESS, to: user2, tokenId }, ); - expect(await this.token.exists(tokenId)).to.be.equal(true); + expect(await this.token.$_exists(tokenId)).to.be.equal(true); expect(await this.token.ownerOf(tokenId), user2); }); }); diff --git a/test/token/ERC721/extensions/ERC721Pausable.test.js b/test/token/ERC721/extensions/ERC721Pausable.test.js index 16847dc8d..04dd520a3 100644 --- a/test/token/ERC721/extensions/ERC721Pausable.test.js +++ b/test/token/ERC721/extensions/ERC721Pausable.test.js @@ -1,9 +1,8 @@ const { BN, constants, expectRevert } = require('@openzeppelin/test-helpers'); -const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); -const ERC721PausableMock = artifacts.require('ERC721PausableMock'); +const ERC721Pausable = artifacts.require('$ERC721Pausable'); contract('ERC721Pausable', function (accounts) { const [ owner, receiver, operator ] = accounts; @@ -12,7 +11,7 @@ contract('ERC721Pausable', function (accounts) { const symbol = 'NFT'; beforeEach(async function () { - this.token = await ERC721PausableMock.new(name, symbol); + this.token = await ERC721Pausable.new(name, symbol); }); context('when token is paused', function () { @@ -22,8 +21,8 @@ contract('ERC721Pausable', function (accounts) { const mockData = '0x42'; beforeEach(async function () { - await this.token.mint(owner, firstTokenId, { from: owner }); - await this.token.pause(); + await this.token.$_mint(owner, firstTokenId, { from: owner }); + await this.token.$_pause(); }); it('reverts when trying to transferFrom', async function () { @@ -50,14 +49,14 @@ contract('ERC721Pausable', function (accounts) { it('reverts when trying to mint', async function () { await expectRevert( - this.token.mint(receiver, secondTokenId), + this.token.$_mint(receiver, secondTokenId), 'ERC721Pausable: token transfer while paused', ); }); it('reverts when trying to burn', async function () { await expectRevert( - this.token.burn(firstTokenId), + this.token.$_burn(firstTokenId), 'ERC721Pausable: token transfer while paused', ); }); @@ -65,7 +64,7 @@ contract('ERC721Pausable', function (accounts) { describe('getApproved', function () { it('returns approved address', async function () { const approvedAccount = await this.token.getApproved(firstTokenId); - expect(approvedAccount).to.equal(ZERO_ADDRESS); + expect(approvedAccount).to.equal(constants.ZERO_ADDRESS); }); }); @@ -85,7 +84,7 @@ contract('ERC721Pausable', function (accounts) { describe('exists', function () { it('returns token existence', async function () { - expect(await this.token.exists(firstTokenId)).to.equal(true); + expect(await this.token.$_exists(firstTokenId)).to.equal(true); }); }); diff --git a/test/token/ERC721/extensions/ERC721Royalty.test.js b/test/token/ERC721/extensions/ERC721Royalty.test.js index 29b28dd00..9d38071e3 100644 --- a/test/token/ERC721/extensions/ERC721Royalty.test.js +++ b/test/token/ERC721/extensions/ERC721Royalty.test.js @@ -1,9 +1,9 @@ const { BN, constants } = require('@openzeppelin/test-helpers'); -const ERC721RoyaltyMock = artifacts.require('ERC721RoyaltyMock'); -const { ZERO_ADDRESS } = constants; const { shouldBehaveLikeERC2981 } = require('../../common/ERC2981.behavior'); +const ERC721Royalty = artifacts.require('$ERC721Royalty'); + contract('ERC721Royalty', function (accounts) { const [ account1, account2 ] = accounts; const tokenId1 = new BN('1'); @@ -12,10 +12,10 @@ contract('ERC721Royalty', function (accounts) { const salePrice = new BN('1000'); beforeEach(async function () { - this.token = await ERC721RoyaltyMock.new('My Token', 'TKN'); + this.token = await ERC721Royalty.new('My Token', 'TKN'); - await this.token.mint(account1, tokenId1); - await this.token.mint(account1, tokenId2); + await this.token.$_mint(account1, tokenId1); + await this.token.$_mint(account1, tokenId2); this.account1 = account1; this.account2 = account2; this.tokenId1 = tokenId1; @@ -25,16 +25,17 @@ contract('ERC721Royalty', function (accounts) { describe('token specific functions', function () { beforeEach(async function () { - await this.token.setTokenRoyalty(tokenId1, account1, royalty); + await this.token.$_setTokenRoyalty(tokenId1, account1, royalty); }); it('removes royalty information after burn', async function () { - await this.token.burn(tokenId1); + await this.token.$_burn(tokenId1); const tokenInfo = await this.token.royaltyInfo(tokenId1, salePrice); - expect(tokenInfo[0]).to.be.equal(ZERO_ADDRESS); + expect(tokenInfo[0]).to.be.equal(constants.ZERO_ADDRESS); expect(tokenInfo[1]).to.be.bignumber.equal(new BN('0')); }); }); + shouldBehaveLikeERC2981(); }); diff --git a/test/token/ERC721/extensions/ERC721URIStorage.test.js b/test/token/ERC721/extensions/ERC721URIStorage.test.js index eeacf5ebe..a27b5f658 100644 --- a/test/token/ERC721/extensions/ERC721URIStorage.test.js +++ b/test/token/ERC721/extensions/ERC721URIStorage.test.js @@ -2,7 +2,7 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC721URIStorageMock = artifacts.require('ERC721URIStorageMock'); +const ERC721URIStorageMock = artifacts.require('$ERC721URIStorageMock'); contract('ERC721URIStorage', function (accounts) { const [ owner ] = accounts; @@ -19,7 +19,7 @@ contract('ERC721URIStorage', function (accounts) { describe('token URI', function () { beforeEach(async function () { - await this.token.mint(owner, firstTokenId); + await this.token.$_mint(owner, firstTokenId); }); const baseURI = 'https://api.example.com/v1/'; @@ -36,31 +36,31 @@ contract('ERC721URIStorage', function (accounts) { }); it('can be set for a token id', async function () { - await this.token.setTokenURI(firstTokenId, sampleUri); + await this.token.$_setTokenURI(firstTokenId, sampleUri); expect(await this.token.tokenURI(firstTokenId)).to.be.equal(sampleUri); }); it('reverts when setting for non existent token id', async function () { await expectRevert( - this.token.setTokenURI(nonExistentTokenId, sampleUri), 'ERC721URIStorage: URI set of nonexistent token', + this.token.$_setTokenURI(nonExistentTokenId, sampleUri), 'ERC721URIStorage: URI set of nonexistent token', ); }); it('base URI can be set', async function () { await this.token.setBaseURI(baseURI); - expect(await this.token.baseURI()).to.equal(baseURI); + expect(await this.token.$_baseURI()).to.equal(baseURI); }); it('base URI is added as a prefix to the token URI', async function () { await this.token.setBaseURI(baseURI); - await this.token.setTokenURI(firstTokenId, sampleUri); + await this.token.$_setTokenURI(firstTokenId, sampleUri); expect(await this.token.tokenURI(firstTokenId)).to.be.equal(baseURI + sampleUri); }); it('token URI can be changed by changing the base URI', async function () { await this.token.setBaseURI(baseURI); - await this.token.setTokenURI(firstTokenId, sampleUri); + await this.token.$_setTokenURI(firstTokenId, sampleUri); const newBaseURI = 'https://api.example.com/v2/'; await this.token.setBaseURI(newBaseURI); @@ -74,20 +74,20 @@ contract('ERC721URIStorage', function (accounts) { }); it('tokens without URI can be burnt ', async function () { - await this.token.burn(firstTokenId, { from: owner }); + await this.token.$_burn(firstTokenId, { from: owner }); - expect(await this.token.exists(firstTokenId)).to.equal(false); + expect(await this.token.$_exists(firstTokenId)).to.equal(false); await expectRevert( this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID', ); }); it('tokens with URI can be burnt ', async function () { - await this.token.setTokenURI(firstTokenId, sampleUri); + await this.token.$_setTokenURI(firstTokenId, sampleUri); - await this.token.burn(firstTokenId, { from: owner }); + await this.token.$_burn(firstTokenId, { from: owner }); - expect(await this.token.exists(firstTokenId)).to.equal(false); + expect(await this.token.$_exists(firstTokenId)).to.equal(false); await expectRevert( this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID', ); diff --git a/test/token/ERC721/extensions/ERC721Votes.test.js b/test/token/ERC721/extensions/ERC721Votes.test.js index 6f001f20b..8d9cb701e 100644 --- a/test/token/ERC721/extensions/ERC721Votes.test.js +++ b/test/token/ERC721/extensions/ERC721Votes.test.js @@ -3,25 +3,22 @@ const { BN, expectEvent, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { promisify } = require('util'); -const queue = promisify(setImmediate); - -const ERC721VotesMock = artifacts.require('ERC721VotesMock'); +const { getChainId } = require('../../../helpers/chainid'); const { shouldBehaveLikeVotes } = require('../../../governance/utils/Votes.behavior'); +const ERC721Votes = artifacts.require('$ERC721Votes'); + contract('ERC721Votes', function (accounts) { const [ account1, account2, account1Delegatee, other1, other2 ] = accounts; - this.name = 'My Vote'; + + const name = 'My Vote'; const symbol = 'MTKN'; beforeEach(async function () { - this.votes = await ERC721VotesMock.new(name, symbol); + this.chainId = await getChainId(); - // We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id - // from within the EVM as from the JSON RPC interface. - // See https://github.com/trufflesuite/ganache-core/issues/515 - this.chainId = await this.votes.getChainId(); + this.votes = await ERC721Votes.new(name, symbol, name, "1"); this.NFT0 = new BN('10000000000000000000000000'); this.NFT1 = new BN('10'); @@ -31,10 +28,10 @@ contract('ERC721Votes', function (accounts) { describe('balanceOf', function () { beforeEach(async function () { - await this.votes.mint(account1, this.NFT0); - await this.votes.mint(account1, this.NFT1); - await this.votes.mint(account1, this.NFT2); - await this.votes.mint(account1, this.NFT3); + await this.votes.$_mint(account1, this.NFT0); + await this.votes.$_mint(account1, this.NFT1); + await this.votes.$_mint(account1, this.NFT2); + await this.votes.$_mint(account1, this.NFT3); }); it('grants to initial account', async function () { @@ -44,7 +41,7 @@ contract('ERC721Votes', function (accounts) { describe('transfers', function () { beforeEach(async function () { - await this.votes.mint(account1, this.NFT0); + await this.votes.$_mint(account1, this.NFT0); }); it('no delegation', async function () { @@ -116,9 +113,9 @@ contract('ERC721Votes', function (accounts) { }); it('generally returns the voting balance at the appropriate checkpoint', async function () { - await this.votes.mint(account1, this.NFT1); - await this.votes.mint(account1, this.NFT2); - await this.votes.mint(account1, this.NFT3); + await this.votes.$_mint(account1, this.NFT1); + await this.votes.$_mint(account1, this.NFT2); + await this.votes.$_mint(account1, this.NFT3); const total = await this.votes.balanceOf(account1); diff --git a/test/token/ERC721/utils/ERC721Holder.test.js b/test/token/ERC721/utils/ERC721Holder.test.js index 2431e667c..e821f32dd 100644 --- a/test/token/ERC721/utils/ERC721Holder.test.js +++ b/test/token/ERC721/utils/ERC721Holder.test.js @@ -1,20 +1,18 @@ -const { BN } = require('@openzeppelin/test-helpers'); - const { expect } = require('chai'); const ERC721Holder = artifacts.require('ERC721Holder'); -const ERC721Mock = artifacts.require('ERC721Mock'); +const ERC721 = artifacts.require('$ERC721'); contract('ERC721Holder', function (accounts) { const [ owner ] = accounts; const name = 'Non Fungible Token'; const symbol = 'NFT'; + const tokenId = web3.utils.toBN(1); it('receives an ERC721 token', async function () { - const token = await ERC721Mock.new(name, symbol); - const tokenId = new BN(1); - await token.mint(owner, tokenId); + const token = await ERC721.new(name, symbol); + await token.$_mint(owner, tokenId); const receiver = await ERC721Holder.new(); await token.safeTransferFrom(owner, receiver.address, tokenId, { from: owner }); diff --git a/test/token/ERC777/ERC777.behavior.js b/test/token/ERC777/ERC777.behavior.js index f6af94227..be104f467 100644 --- a/test/token/ERC777/ERC777.behavior.js +++ b/test/token/ERC777/ERC777.behavior.js @@ -281,7 +281,7 @@ function shouldBehaveLikeERC777InternalMint (recipient, operator, amount, data, it('reverts when minting tokens for the zero address', async function () { await expectRevert.unspecified( - this.token.mintInternal(ZERO_ADDRESS, amount, data, operatorData, { from: operator }), + this.token.$_mint(ZERO_ADDRESS, amount, data, operatorData, true, { from: operator }), ); }); } @@ -291,7 +291,7 @@ function shouldInternalMintTokens (operator, to, amount, data, operatorData) { const initialTotalSupply = await this.token.totalSupply(); const initialToBalance = await this.token.balanceOf(to); - const receipt = await this.token.mintInternal(to, amount, data, operatorData, { from: operator }); + const receipt = await this.token.$_mint(to, amount, data, operatorData, true, { from: operator }); expectEvent(receipt, 'Minted', { operator, @@ -333,7 +333,7 @@ function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook (operator, am it('mint (internal) reverts', async function () { await expectRevert.unspecified( - this.token.mintInternal(this.recipient, amount, data, operatorData, { from: operator }), + this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }), ); }); }); @@ -387,9 +387,7 @@ function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook (operator, am }); it('TokensRecipient receives mint (internal) data and is called after state mutation', async function () { - const { tx } = await this.token.mintInternal( - this.recipient, amount, data, operatorData, { from: operator }, - ); + const { tx } = await this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }); const postRecipientBalance = await this.token.balanceOf(this.recipient); diff --git a/test/token/ERC777/ERC777.test.js b/test/token/ERC777/ERC777.test.js index 51da130d4..efb8eae43 100644 --- a/test/token/ERC777/ERC777.test.js +++ b/test/token/ERC777/ERC777.test.js @@ -17,8 +17,8 @@ const { shouldBehaveLikeERC20Approve, } = require('../ERC20/ERC20.behavior'); -const ERC777 = artifacts.require('ERC777Mock'); -const ERC777SenderRecipientMock = artifacts.require('ERC777SenderRecipientMock'); +const ERC777 = artifacts.require('$ERC777Mock'); +const ERC777SenderRecipientMock = artifacts.require('$ERC777SenderRecipientMock'); contract('ERC777', function (accounts) { const [ registryFunder, holder, defaultOperatorA, defaultOperatorB, newOperator, anyone ] = accounts; @@ -37,7 +37,8 @@ contract('ERC777', function (accounts) { context('with default operators', function () { beforeEach(async function () { - this.token = await ERC777.new(holder, initialSupply, name, symbol, defaultOperators); + this.token = await ERC777.new(name, symbol, defaultOperators); + await this.token.$_mint(holder, initialSupply, '0x', '0x'); }); describe('as an ERC20 token', function () { @@ -45,12 +46,12 @@ contract('ERC777', function (accounts) { describe('_approve', function () { shouldBehaveLikeERC20Approve('ERC777', holder, anyone, initialSupply, function (owner, spender, amount) { - return this.token.approveInternal(owner, spender, amount); + return this.token.$_approve(owner, spender, amount); }); describe('when the owner is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.approveInternal(ZERO_ADDRESS, anyone, initialSupply), + await expectRevert(this.token.$_approve(ZERO_ADDRESS, anyone, initialSupply), 'ERC777: approve from the zero address', ); }); @@ -184,7 +185,7 @@ contract('ERC777', function (accounts) { const operator = defaultOperatorA; it('without requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -195,7 +196,7 @@ contract('ERC777', function (accounts) { }); it('with requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -210,7 +211,7 @@ contract('ERC777', function (accounts) { const operator = newOperator; it('without requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -221,7 +222,7 @@ contract('ERC777', function (accounts) { }); it('with requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -243,7 +244,7 @@ contract('ERC777', function (accounts) { const operator = defaultOperatorA; it('without requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -255,7 +256,7 @@ contract('ERC777', function (accounts) { it('with requireReceptionAck', async function () { await expectRevert( - this.token.mintInternalExtended( + this.token.$_mint( this.recipient, amount, data, @@ -272,7 +273,7 @@ contract('ERC777', function (accounts) { const operator = newOperator; it('without requireReceptionAck', async function () { - await this.token.mintInternalExtended( + await this.token.$_mint( this.recipient, amount, data, @@ -284,7 +285,7 @@ contract('ERC777', function (accounts) { it('with requireReceptionAck', async function () { await expectRevert( - this.token.mintInternalExtended( + this.token.$_mint( this.recipient, amount, data, @@ -443,7 +444,7 @@ contract('ERC777', function (accounts) { it('mint (internal) reverts', async function () { await expectRevert( - this.token.mintInternal(this.recipient, amount, data, operatorData, { from: operator }), + this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }), 'ERC777: token recipient contract has no implementer for ERC777TokensRecipient', ); }); @@ -567,7 +568,7 @@ contract('ERC777', function (accounts) { context('with no default operators', function () { beforeEach(async function () { - this.token = await ERC777.new(holder, initialSupply, name, symbol, []); + this.token = await ERC777.new(name, symbol, []); }); it('default operators list is empty', async function () { @@ -581,8 +582,8 @@ contract('ERC777', function (accounts) { this.sender = await ERC777SenderRecipientMock.new(); await this.sender.registerRecipient(this.sender.address); await this.sender.registerSender(this.sender.address); - this.token = await ERC777.new(holder, initialSupply, name, symbol, []); - await this.token.send(this.sender.address, 1, '0x', { from: holder }); + this.token = await ERC777.new(name, symbol, []); + await this.token.$_mint(this.sender.address, 1, '0x', '0x'); }); it('send', async function () { diff --git a/test/token/common/ERC2981.behavior.js b/test/token/common/ERC2981.behavior.js index 2fd274765..aea5e52f0 100644 --- a/test/token/common/ERC2981.behavior.js +++ b/test/token/common/ERC2981.behavior.js @@ -11,7 +11,7 @@ function shouldBehaveLikeERC2981 () { describe('default royalty', function () { beforeEach(async function () { - await this.token.setDefaultRoyalty(this.account1, royaltyFraction); + await this.token.$_setDefaultRoyalty(this.account1, royaltyFraction); }); it('checks royalty is set', async function () { @@ -27,7 +27,7 @@ function shouldBehaveLikeERC2981 () { const newPercentage = new BN('25'); // Updated royalty check - await this.token.setDefaultRoyalty(this.account1, newPercentage); + await this.token.$_setDefaultRoyalty(this.account1, newPercentage); const royalty = new BN((this.salePrice * newPercentage) / 10000); const newInfo = await this.token.royaltyInfo(this.tokenId1, this.salePrice); @@ -37,7 +37,7 @@ function shouldBehaveLikeERC2981 () { it('holds same royalty value for different tokens', async function () { const newPercentage = new BN('20'); - await this.token.setDefaultRoyalty(this.account1, newPercentage); + await this.token.$_setDefaultRoyalty(this.account1, newPercentage); const token1Info = await this.token.royaltyInfo(this.tokenId1, this.salePrice); const token2Info = await this.token.royaltyInfo(this.tokenId2, this.salePrice); @@ -47,7 +47,7 @@ function shouldBehaveLikeERC2981 () { it('Remove royalty information', async function () { const newValue = new BN('0'); - await this.token.deleteDefaultRoyalty(); + await this.token.$_deleteDefaultRoyalty(); const token1Info = await this.token.royaltyInfo(this.tokenId1, this.salePrice); const token2Info = await this.token.royaltyInfo(this.tokenId2, this.salePrice); @@ -61,12 +61,12 @@ function shouldBehaveLikeERC2981 () { it('reverts if invalid parameters', async function () { await expectRevert( - this.token.setDefaultRoyalty(ZERO_ADDRESS, royaltyFraction), + this.token.$_setDefaultRoyalty(ZERO_ADDRESS, royaltyFraction), 'ERC2981: invalid receiver', ); await expectRevert( - this.token.setDefaultRoyalty(this.account1, new BN('11000')), + this.token.$_setDefaultRoyalty(this.account1, new BN('11000')), 'ERC2981: royalty fee will exceed salePrice', ); }); @@ -74,7 +74,7 @@ function shouldBehaveLikeERC2981 () { describe('token based royalty', function () { beforeEach(async function () { - await this.token.setTokenRoyalty(this.tokenId1, this.account1, royaltyFraction); + await this.token.$_setTokenRoyalty(this.tokenId1, this.account1, royaltyFraction); }); it('updates royalty amount', async function () { @@ -87,7 +87,7 @@ function shouldBehaveLikeERC2981 () { expect(initInfo[1]).to.be.bignumber.equal(royalty); // Updated royalty check - await this.token.setTokenRoyalty(this.tokenId1, this.account1, newPercentage); + await this.token.$_setTokenRoyalty(this.tokenId1, this.account1, newPercentage); royalty = new BN((this.salePrice * newPercentage) / 10000); const newInfo = await this.token.royaltyInfo(this.tokenId1, this.salePrice); @@ -97,7 +97,7 @@ function shouldBehaveLikeERC2981 () { it('holds different values for different tokens', async function () { const newPercentage = new BN('20'); - await this.token.setTokenRoyalty(this.tokenId2, this.account1, newPercentage); + await this.token.$_setTokenRoyalty(this.tokenId2, this.account1, newPercentage); const token1Info = await this.token.royaltyInfo(this.tokenId1, this.salePrice); const token2Info = await this.token.royaltyInfo(this.tokenId2, this.salePrice); @@ -108,12 +108,12 @@ function shouldBehaveLikeERC2981 () { it('reverts if invalid parameters', async function () { await expectRevert( - this.token.setTokenRoyalty(this.tokenId1, ZERO_ADDRESS, royaltyFraction), + this.token.$_setTokenRoyalty(this.tokenId1, ZERO_ADDRESS, royaltyFraction), 'ERC2981: Invalid parameters', ); await expectRevert( - this.token.setTokenRoyalty(this.tokenId1, this.account1, new BN('11000')), + this.token.$_setTokenRoyalty(this.tokenId1, this.account1, new BN('11000')), 'ERC2981: royalty fee will exceed salePrice', ); }); @@ -121,7 +121,7 @@ function shouldBehaveLikeERC2981 () { it('can reset token after setting royalty', async function () { const newPercentage = new BN('30'); const royalty = new BN((this.salePrice * newPercentage) / 10000); - await this.token.setTokenRoyalty(this.tokenId1, this.account2, newPercentage); + await this.token.$_setTokenRoyalty(this.tokenId1, this.account2, newPercentage); const tokenInfo = await this.token.royaltyInfo(this.tokenId1, this.salePrice); @@ -129,7 +129,7 @@ function shouldBehaveLikeERC2981 () { expect(tokenInfo[1]).to.be.bignumber.equal(royalty); expect(tokenInfo[0]).to.be.equal(this.account2); - await this.token.setTokenRoyalty(this.tokenId2, this.account1, new BN('0')); + await this.token.$_setTokenRoyalty(this.tokenId2, this.account1, new BN('0')); const result = await this.token.royaltyInfo(this.tokenId2, this.salePrice); // Token must not share default information expect(result[0]).to.be.equal(this.account1); @@ -140,7 +140,7 @@ function shouldBehaveLikeERC2981 () { const newPercentage = new BN('30'); const royalty = new BN((this.salePrice * newPercentage) / 10000); - await this.token.setTokenRoyalty(this.tokenId2, this.account2, newPercentage); + await this.token.$_setTokenRoyalty(this.tokenId2, this.account2, newPercentage); const token1Info = await this.token.royaltyInfo(this.tokenId1, this.salePrice); const token2Info = await this.token.royaltyInfo(this.tokenId2, this.salePrice); diff --git a/test/utils/Address.test.js b/test/utils/Address.test.js index 1bdfad483..135a7f96d 100644 --- a/test/utils/Address.test.js +++ b/test/utils/Address.test.js @@ -1,7 +1,7 @@ -const { balance, ether, expectRevert, send, expectEvent } = require('@openzeppelin/test-helpers'); +const { balance, constants, ether, expectRevert, send, expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const AddressImpl = artifacts.require('AddressImpl'); +const Address = artifacts.require('$Address'); const EtherReceiver = artifacts.require('EtherReceiverMock'); const CallReceiverMock = artifacts.require('CallReceiverMock'); @@ -9,17 +9,16 @@ contract('Address', function (accounts) { const [ recipient, other ] = accounts; beforeEach(async function () { - this.mock = await AddressImpl.new(); + this.mock = await Address.new(); }); describe('isContract', function () { it('returns false for account address', async function () { - expect(await this.mock.isContract(other)).to.equal(false); + expect(await this.mock.$isContract(other)).to.equal(false); }); it('returns true for contract address', async function () { - const contract = await AddressImpl.new(); - expect(await this.mock.isContract(contract.address)).to.equal(true); + expect(await this.mock.$isContract(this.mock.address)).to.equal(true); }); }); @@ -30,13 +29,16 @@ contract('Address', function (accounts) { context('when sender contract has no funds', function () { it('sends 0 wei', async function () { - await this.mock.sendValue(other, 0); + await this.mock.$sendValue(other, 0); expect(await this.recipientTracker.delta()).to.be.bignumber.equal('0'); }); it('reverts when sending non-zero amounts', async function () { - await expectRevert(this.mock.sendValue(other, 1), 'Address: insufficient balance'); + await expectRevert( + this.mock.$sendValue(other, 1), + 'Address: insufficient balance', + ); }); }); @@ -47,42 +49,46 @@ contract('Address', function (accounts) { }); it('sends 0 wei', async function () { - await this.mock.sendValue(recipient, 0); + await this.mock.$sendValue(recipient, 0); expect(await this.recipientTracker.delta()).to.be.bignumber.equal('0'); }); it('sends non-zero amounts', async function () { - await this.mock.sendValue(recipient, funds.subn(1)); + await this.mock.$sendValue(recipient, funds.subn(1)); expect(await this.recipientTracker.delta()).to.be.bignumber.equal(funds.subn(1)); }); it('sends the whole balance', async function () { - await this.mock.sendValue(recipient, funds); + await this.mock.$sendValue(recipient, funds); expect(await this.recipientTracker.delta()).to.be.bignumber.equal(funds); expect(await balance.current(this.mock.address)).to.be.bignumber.equal('0'); }); it('reverts when sending more than the balance', async function () { - await expectRevert(this.mock.sendValue(recipient, funds.addn(1)), 'Address: insufficient balance'); + await expectRevert( + this.mock.$sendValue(recipient, funds.addn(1)), + 'Address: insufficient balance', + ); }); context('with contract recipient', function () { beforeEach(async function () { - this.contractRecipient = await EtherReceiver.new(); + this.target = await EtherReceiver.new(); }); it('sends funds', async function () { - const tracker = await balance.tracker(this.contractRecipient.address); + const tracker = await balance.tracker(this.target.address); + + await this.target.setAcceptEther(true); + await this.mock.$sendValue(this.target.address, funds); - await this.contractRecipient.setAcceptEther(true); - await this.mock.sendValue(this.contractRecipient.address, funds); expect(await tracker.delta()).to.be.bignumber.equal(funds); }); it('reverts on recipient revert', async function () { - await this.contractRecipient.setAcceptEther(false); + await this.target.setAcceptEther(false); await expectRevert( - this.mock.sendValue(this.contractRecipient.address, funds), + this.mock.$sendValue(this.target.address, funds), 'Address: unable to send value, recipient may have reverted', ); }); @@ -92,71 +98,55 @@ contract('Address', function (accounts) { describe('functionCall', function () { beforeEach(async function () { - this.contractRecipient = await CallReceiverMock.new(); + this.target = await CallReceiverMock.new(); }); context('with valid contract receiver', function () { it('calls the requested function', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - const receipt = await this.mock.functionCall(this.contractRecipient.address, abiEncodedCall); + const receipt = await this.mock.$functionCall(this.target.address, abiEncodedCall); - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); + expectEvent( + receipt, + 'return$functionCall_address_bytes', + { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + ); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); it('reverts when the called function reverts with no reason', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionRevertsNoReason', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionRevertsNoReason().encodeABI(); await expectRevert( - this.mock.functionCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionCall(this.target.address, abiEncodedCall), 'Address: low-level call failed', ); }); it('reverts when the called function reverts, bubbling up the revert reason', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionRevertsReason', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionRevertsReason().encodeABI(); await expectRevert( - this.mock.functionCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionCall(this.target.address, abiEncodedCall), 'CallReceiverMock: reverting', ); }); it('reverts when the called function runs out of gas', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionOutOfGas', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionOutOfGas().encodeABI(); await expectRevert( - this.mock.functionCall(this.contractRecipient.address, abiEncodedCall, { gas: '120000' }), + this.mock.$functionCall(this.target.address, abiEncodedCall, { gas: '120000' }), 'Address: low-level call failed', ); }); it('reverts when the called function throws', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionThrows', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionThrows().encodeABI(); await expectRevert.unspecified( - this.mock.functionCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionCall(this.target.address, abiEncodedCall), ); }); @@ -168,7 +158,7 @@ contract('Address', function (accounts) { }, []); await expectRevert( - this.mock.functionCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionCall(this.target.address, abiEncodedCall), 'Address: low-level call failed', ); }); @@ -177,32 +167,31 @@ contract('Address', function (accounts) { context('with non-contract receiver', function () { it('reverts when address is not a contract', async function () { const [ recipient ] = accounts; - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); - await expectRevert(this.mock.functionCall(recipient, abiEncodedCall), 'Address: call to non-contract'); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); + + await expectRevert( + this.mock.$functionCall(recipient, abiEncodedCall), + 'Address: call to non-contract', + ); }); }); }); describe('functionCallWithValue', function () { beforeEach(async function () { - this.contractRecipient = await CallReceiverMock.new(); + this.target = await CallReceiverMock.new(); }); context('with zero value', function () { it('calls the requested function', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - const receipt = await this.mock.functionCallWithValue(this.contractRecipient.address, abiEncodedCall, 0); - - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); + const receipt = await this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, 0); + expectEvent( + receipt, + 'return$functionCallWithValue_address_bytes_uint256', + { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + ); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); }); @@ -211,66 +200,61 @@ contract('Address', function (accounts) { const amount = ether('1.2'); it('reverts if insufficient sender balance', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); await expectRevert( - this.mock.functionCallWithValue(this.contractRecipient.address, abiEncodedCall, amount), + this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, amount), 'Address: insufficient balance for call', ); }); it('calls the requested function with existing value', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - const tracker = await balance.tracker(this.contractRecipient.address); + const tracker = await balance.tracker(this.target.address); await send.ether(other, this.mock.address, amount); - const receipt = await this.mock.functionCallWithValue(this.contractRecipient.address, abiEncodedCall, amount); + + const receipt = await this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, amount); + expectEvent( + receipt, + 'return$functionCallWithValue_address_bytes_uint256', + { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + ); + await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); expect(await tracker.delta()).to.be.bignumber.equal(amount); - - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); - await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); it('calls the requested function with transaction funds', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - const tracker = await balance.tracker(this.contractRecipient.address); + const tracker = await balance.tracker(this.target.address); expect(await balance.current(this.mock.address)).to.be.bignumber.equal('0'); - const receipt = await this.mock.functionCallWithValue( - this.contractRecipient.address, abiEncodedCall, amount, { from: other, value: amount }, + + const receipt = await this.mock.$functionCallWithValue( + this.target.address, + abiEncodedCall, + amount, + { from: other, value: amount }, ); + expectEvent( + receipt, + 'return$functionCallWithValue_address_bytes_uint256', + { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + ); + await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); expect(await tracker.delta()).to.be.bignumber.equal(amount); - - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); - await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); it('reverts when calling non-payable functions', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionNonPayable', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionNonPayable().encodeABI(); await send.ether(other, this.mock.address, amount); await expectRevert( - this.mock.functionCallWithValue(this.contractRecipient.address, abiEncodedCall, amount), + this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, amount), 'Address: low-level call with value failed', ); }); @@ -279,56 +263,40 @@ contract('Address', function (accounts) { describe('functionStaticCall', function () { beforeEach(async function () { - this.contractRecipient = await CallReceiverMock.new(); + this.target = await CallReceiverMock.new(); }); it('calls the requested function', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockStaticFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockStaticFunction().encodeABI(); - const receipt = await this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall); - - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); + expect(await this.mock.$functionStaticCall(this.target.address, abiEncodedCall)) + .to.be.equal(web3.eth.abi.encodeParameters(['string'], [ '0x1234' ])); }); it('reverts on a non-static function', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); await expectRevert( - this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionStaticCall(this.target.address, abiEncodedCall), 'Address: low-level static call failed', ); }); it('bubbles up revert reason', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionRevertsReason', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionRevertsReason().encodeABI(); await expectRevert( - this.mock.functionStaticCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionStaticCall(this.target.address, abiEncodedCall), 'CallReceiverMock: reverting', ); }); it('reverts when address is not a contract', async function () { const [ recipient ] = accounts; - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); + await expectRevert( - this.mock.functionStaticCall(recipient, abiEncodedCall), + this.mock.$functionStaticCall(recipient, abiEncodedCall), 'Address: call to non-contract', ); }); @@ -336,45 +304,42 @@ contract('Address', function (accounts) { describe('functionDelegateCall', function () { beforeEach(async function () { - this.contractRecipient = await CallReceiverMock.new(); + this.target = await CallReceiverMock.new(); }); it('delegate calls the requested function', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionWritesStorage', - type: 'function', - inputs: [], - }, []); + // pseudorandom values + const slot = '0x93e4c53af435ddf777c3de84bb9a953a777788500e229a468ea1036496ab66a0'; + const value = '0x6a465d1c49869f71fb65562bcbd7e08c8044074927f0297127203f2a9924ff5b'; - const receipt = await this.mock.functionDelegateCall(this.contractRecipient.address, abiEncodedCall); + const abiEncodedCall = this.target.contract.methods.mockFunctionWritesStorage(slot, value).encodeABI(); - expectEvent(receipt, 'CallReturnValue', { data: '0x1234' }); + expect(await web3.eth.getStorageAt(this.mock.address, slot)).to.be.equal(constants.ZERO_BYTES32); - expect(await this.mock.sharedAnswer()).to.equal('42'); + expectEvent( + await this.mock.$functionDelegateCall(this.target.address, abiEncodedCall), + 'return$functionDelegateCall_address_bytes', + { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + ); + + expect(await web3.eth.getStorageAt(this.mock.address, slot)).to.be.equal(value); }); it('bubbles up revert reason', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionRevertsReason', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunctionRevertsReason().encodeABI(); await expectRevert( - this.mock.functionDelegateCall(this.contractRecipient.address, abiEncodedCall), + this.mock.$functionDelegateCall(this.target.address, abiEncodedCall), 'CallReceiverMock: reverting', ); }); it('reverts when address is not a contract', async function () { const [ recipient ] = accounts; - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunction', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); + await expectRevert( - this.mock.functionDelegateCall(recipient, abiEncodedCall), + this.mock.$functionDelegateCall(recipient, abiEncodedCall), 'Address: call to non-contract', ); }); diff --git a/test/utils/Base64.test.js b/test/utils/Base64.test.js index b6ee6579e..dfff0b0d0 100644 --- a/test/utils/Base64.test.js +++ b/test/utils/Base64.test.js @@ -1,33 +1,33 @@ const { expect } = require('chai'); -const Base64Mock = artifacts.require('Base64Mock'); +const Base64 = artifacts.require('$Base64'); contract('Strings', function () { beforeEach(async function () { - this.base64 = await Base64Mock.new(); + this.base64 = await Base64.new(); }); describe('from bytes - base64', function () { it('converts to base64 encoded string with double padding', async function () { const TEST_MESSAGE = 'test'; const input = web3.utils.asciiToHex(TEST_MESSAGE); - expect(await this.base64.encode(input)).to.equal('dGVzdA=='); + expect(await this.base64.$encode(input)).to.equal('dGVzdA=='); }); it('converts to base64 encoded string with single padding', async function () { const TEST_MESSAGE = 'test1'; const input = web3.utils.asciiToHex(TEST_MESSAGE); - expect(await this.base64.encode(input)).to.equal('dGVzdDE='); + expect(await this.base64.$encode(input)).to.equal('dGVzdDE='); }); it('converts to base64 encoded string without padding', async function () { const TEST_MESSAGE = 'test12'; const input = web3.utils.asciiToHex(TEST_MESSAGE); - expect(await this.base64.encode(input)).to.equal('dGVzdDEy'); + expect(await this.base64.$encode(input)).to.equal('dGVzdDEy'); }); it('empty bytes', async function () { - expect(await this.base64.encode([])).to.equal(''); + expect(await this.base64.$encode([])).to.equal(''); }); }); }); diff --git a/test/utils/Checkpoints.test.js b/test/utils/Checkpoints.test.js index abc5c9b36..520cf4fd0 100644 --- a/test/utils/Checkpoints.test.js +++ b/test/utils/Checkpoints.test.js @@ -4,22 +4,35 @@ const { expect } = require('chai'); const { batchInBlock } = require('../helpers/txpool'); -const CheckpointsMock = artifacts.require('CheckpointsMock'); +const $Checkpoints = artifacts.require('$Checkpoints'); const first = (array) => array.length ? array[0] : undefined; const last = (array) => array.length ? array[array.length - 1] : undefined; contract('Checkpoints', function () { + beforeEach(async function () { + this.mock = await $Checkpoints.new(); + }); + describe('History checkpoints', function () { - beforeEach(async function () { - this.checkpoint = await CheckpointsMock.new(); - }); + const latest = (self, ...args) => + self.methods['$latest_Checkpoints_History(uint256)'](0, ...args); + const latestCheckpoint = (self, ...args) => + self.methods['$latestCheckpoint_Checkpoints_History(uint256)'](0, ...args); + const push = (self, ...args) => + self.methods['$push(uint256,uint256)'](0, ...args); + const getAtBlock = (self, ...args) => + self.methods['$getAtBlock(uint256,uint256)'](0, ...args); + const getAtRecentBlock = (self, ...args) => + self.methods['$getAtProbablyRecentBlock(uint256,uint256)'](0, ...args); + const getLength = (self, ...args) => + self.methods['$length_Checkpoints_History(uint256)'](0, ...args); describe('without checkpoints', function () { it('returns zero as latest value', async function () { - expect(await this.checkpoint.latest()).to.be.bignumber.equal('0'); + expect(await latest(this.mock)).to.be.bignumber.equal('0'); - const ckpt = await this.checkpoint.latestCheckpoint(); + const ckpt = await latestCheckpoint(this.mock); expect(ckpt[0]).to.be.equal(false); expect(ckpt[1]).to.be.bignumber.equal('0'); expect(ckpt[2]).to.be.bignumber.equal('0'); @@ -27,51 +40,49 @@ contract('Checkpoints', function () { it('returns zero as past value', async function () { await time.advanceBlock(); - expect(await this.checkpoint.getAtBlock(await web3.eth.getBlockNumber() - 1)) - .to.be.bignumber.equal('0'); - expect(await this.checkpoint.getAtProbablyRecentBlock(await web3.eth.getBlockNumber() - 1)) - .to.be.bignumber.equal('0'); + expect(await getAtBlock(this.mock, await web3.eth.getBlockNumber() - 1)).to.be.bignumber.equal('0'); + expect(await getAtRecentBlock(this.mock, await web3.eth.getBlockNumber() - 1)).to.be.bignumber.equal('0'); }); }); describe('with checkpoints', function () { beforeEach('pushing checkpoints', async function () { - this.tx1 = await this.checkpoint.push(1); - this.tx2 = await this.checkpoint.push(2); + this.tx1 = await push(this.mock, 1); + this.tx2 = await push(this.mock, 2); await time.advanceBlock(); - this.tx3 = await this.checkpoint.push(3); + this.tx3 = await push(this.mock, 3); await time.advanceBlock(); await time.advanceBlock(); }); it('returns latest value', async function () { - expect(await this.checkpoint.latest()).to.be.bignumber.equal('3'); + expect(await latest(this.mock)).to.be.bignumber.equal('3'); - const ckpt = await this.checkpoint.latestCheckpoint(); + const ckpt = await latestCheckpoint(this.mock); expect(ckpt[0]).to.be.equal(true); expect(ckpt[1]).to.be.bignumber.equal(web3.utils.toBN(this.tx3.receipt.blockNumber)); expect(ckpt[2]).to.be.bignumber.equal(web3.utils.toBN('3')); }); - for (const fn of [ 'getAtBlock(uint256)', 'getAtProbablyRecentBlock(uint256)' ]) { - describe(`lookup: ${fn}`, function () { + for (const getAtBlockVariant of [ getAtBlock, getAtRecentBlock ]) { + describe(`lookup: ${getAtBlockVariant}`, function () { it('returns past values', async function () { - expect(await this.checkpoint.methods[fn](this.tx1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.checkpoint.methods[fn](this.tx1.receipt.blockNumber)).to.be.bignumber.equal('1'); - expect(await this.checkpoint.methods[fn](this.tx2.receipt.blockNumber)).to.be.bignumber.equal('2'); + expect(await getAtBlockVariant(this.mock, this.tx1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); + expect(await getAtBlockVariant(this.mock, this.tx1.receipt.blockNumber)).to.be.bignumber.equal('1'); + expect(await getAtBlockVariant(this.mock, this.tx2.receipt.blockNumber)).to.be.bignumber.equal('2'); // Block with no new checkpoints - expect(await this.checkpoint.methods[fn](this.tx2.receipt.blockNumber + 1)).to.be.bignumber.equal('2'); - expect(await this.checkpoint.methods[fn](this.tx3.receipt.blockNumber)).to.be.bignumber.equal('3'); - expect(await this.checkpoint.methods[fn](this.tx3.receipt.blockNumber + 1)).to.be.bignumber.equal('3'); + expect(await getAtBlockVariant(this.mock, this.tx2.receipt.blockNumber + 1)).to.be.bignumber.equal('2'); + expect(await getAtBlockVariant(this.mock, this.tx3.receipt.blockNumber)).to.be.bignumber.equal('3'); + expect(await getAtBlockVariant(this.mock, this.tx3.receipt.blockNumber + 1)).to.be.bignumber.equal('3'); }); it('reverts if block number >= current block', async function () { await expectRevert( - this.checkpoint.methods[fn](await web3.eth.getBlockNumber()), + getAtBlockVariant(this.mock, await web3.eth.getBlockNumber()), 'Checkpoints: block not yet mined', ); await expectRevert( - this.checkpoint.methods[fn](await web3.eth.getBlockNumber() + 1), + getAtBlockVariant(this.mock, await web3.eth.getBlockNumber() + 1), 'Checkpoints: block not yet mined', ); }); @@ -79,51 +90,60 @@ contract('Checkpoints', function () { } it('multiple checkpoints in the same block', async function () { - const lengthBefore = await this.checkpoint.length(); + const lengthBefore = await getLength(this.mock); await batchInBlock([ - () => this.checkpoint.push(8, { gas: 100000 }), - () => this.checkpoint.push(9, { gas: 100000 }), - () => this.checkpoint.push(10, { gas: 100000 }), + () => push(this.mock, 8, { gas: 100000 }), + () => push(this.mock, 9, { gas: 100000 }), + () => push(this.mock, 10, { gas: 100000 }), ]); - expect(await this.checkpoint.length()).to.be.bignumber.equal(lengthBefore.addn(1)); - expect(await this.checkpoint.latest()).to.be.bignumber.equal('10'); + expect(await getLength(this.mock)).to.be.bignumber.equal(lengthBefore.addn(1)); + expect(await latest(this.mock)).to.be.bignumber.equal('10'); }); it('more than 5 checkpoints', async function () { for (let i = 4; i <= 6; i++) { - await this.checkpoint.push(i); + await push(this.mock, i); } - expect(await this.checkpoint.length()).to.be.bignumber.equal('6'); + expect(await getLength(this.mock)).to.be.bignumber.equal('6'); const block = await web3.eth.getBlockNumber(); // recent - expect(await this.checkpoint.getAtProbablyRecentBlock(block - 1)).to.be.bignumber.equal('5'); + expect(await getAtRecentBlock(this.mock, block - 1)).to.be.bignumber.equal('5'); // non-recent - expect(await this.checkpoint.getAtProbablyRecentBlock(block - 9)).to.be.bignumber.equal('0'); + expect(await getAtRecentBlock(this.mock, block - 9)).to.be.bignumber.equal('0'); }); }); }); for (const length of [160, 224]) { describe(`Trace${length}`, function () { - beforeEach(async function () { - this.contract = await artifacts.require(`Checkpoints${length}Mock`).new(); - }); + const latest = (self, ...args) => + self.methods[`$latest_Checkpoints_Trace${length}(uint256)`](0, ...args); + const latestCheckpoint = (self, ...args) => + self.methods[`$latestCheckpoint_Checkpoints_Trace${length}(uint256)`](0, ...args); + const push = (self, ...args) => + self.methods[`$push(uint256,uint${256 - length},uint${length})`](0, ...args); + const upperLookup = (self, ...args) => + self.methods[`$upperLookup(uint256,uint${256 - length})`](0, ...args); + const lowerLookup = (self, ...args) => + self.methods[`$lowerLookup(uint256,uint${256 - length})`](0, ...args); + const getLength = (self, ...args) => + self.methods[`$length_Checkpoints_Trace${length}(uint256)`](0, ...args); describe('without checkpoints', function () { it('returns zero as latest value', async function () { - expect(await this.contract.latest()).to.be.bignumber.equal('0'); + expect(await latest(this.mock)).to.be.bignumber.equal('0'); - const ckpt = await this.contract.latestCheckpoint(); + const ckpt = await latestCheckpoint(this.mock); expect(ckpt[0]).to.be.equal(false); expect(ckpt[1]).to.be.bignumber.equal('0'); expect(ckpt[2]).to.be.bignumber.equal('0'); }); it('lookup returns 0', async function () { - expect(await this.contract.lowerLookup(0)).to.be.bignumber.equal('0'); - expect(await this.contract.upperLookup(0)).to.be.bignumber.equal('0'); + expect(await lowerLookup(this.mock, 0)).to.be.bignumber.equal('0'); + expect(await upperLookup(this.mock, 0)).to.be.bignumber.equal('0'); }); }); @@ -137,42 +157,47 @@ contract('Checkpoints', function () { { key: '11', value: '99' }, ]; for (const { key, value } of this.checkpoints) { - await this.contract.push(key, value); + await push(this.mock, key, value); } }); - it('returns latest value', async function () { - expect(await this.contract.latest()).to.be.bignumber.equal(last(this.checkpoints).value); + it('length', async function () { + expect(await getLength(this.mock)) + .to.be.bignumber.equal(this.checkpoints.length.toString()); + }); - const ckpt = await this.contract.latestCheckpoint(); + it('returns latest value', async function () { + expect(await latest(this.mock)).to.be.bignumber.equal(last(this.checkpoints).value); + + const ckpt = await latestCheckpoint(this.mock); expect(ckpt[0]).to.be.equal(true); expect(ckpt[1]).to.be.bignumber.equal(last(this.checkpoints).key); expect(ckpt[2]).to.be.bignumber.equal(last(this.checkpoints).value); }); it('cannot push values in the past', async function () { - await expectRevert(this.contract.push(last(this.checkpoints).key - 1, '0'), 'Checkpoint: decreasing keys'); + await expectRevert(push(this.mock, last(this.checkpoints).key - 1, '0'), 'Checkpoint: decreasing keys'); }); it('can update last value', async function () { const newValue = '42'; // check length before the update - expect(await this.contract.length()).to.be.bignumber.equal(this.checkpoints.length.toString()); + expect(await getLength(this.mock)).to.be.bignumber.equal(this.checkpoints.length.toString()); // update last key - await this.contract.push(last(this.checkpoints).key, newValue); - expect(await this.contract.latest()).to.be.bignumber.equal(newValue); + await push(this.mock, last(this.checkpoints).key, newValue); + expect(await latest(this.mock)).to.be.bignumber.equal(newValue); // check that length did not change - expect(await this.contract.length()).to.be.bignumber.equal(this.checkpoints.length.toString()); + expect(await getLength(this.mock)).to.be.bignumber.equal(this.checkpoints.length.toString()); }); it('lower lookup', async function () { for (let i = 0; i < 14; ++i) { const value = first(this.checkpoints.filter(x => i <= x.key))?.value || '0'; - expect(await this.contract.lowerLookup(i)).to.be.bignumber.equal(value); + expect(await lowerLookup(this.mock, i)).to.be.bignumber.equal(value); } }); @@ -180,7 +205,7 @@ contract('Checkpoints', function () { for (let i = 0; i < 14; ++i) { const value = last(this.checkpoints.filter(x => i >= x.key))?.value || '0'; - expect(await this.contract.upperLookup(i)).to.be.bignumber.equal(value); + expect(await upperLookup(this.mock, i)).to.be.bignumber.equal(value); } }); }); diff --git a/test/utils/Counters.test.js b/test/utils/Counters.test.js index 2159fd08d..6fb89922d 100644 --- a/test/utils/Counters.test.js +++ b/test/utils/Counters.test.js @@ -2,62 +2,62 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const CountersImpl = artifacts.require('CountersImpl'); +const Counters = artifacts.require('$Counters'); contract('Counters', function () { beforeEach(async function () { - this.counter = await CountersImpl.new(); + this.counter = await Counters.new(); }); it('starts at zero', async function () { - expect(await this.counter.current()).to.be.bignumber.equal('0'); + expect(await this.counter.$current(0)).to.be.bignumber.equal('0'); }); describe('increment', function () { context('starting from 0', function () { it('increments the current value by one', async function () { - await this.counter.increment(); - expect(await this.counter.current()).to.be.bignumber.equal('1'); + await this.counter.$increment(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('1'); }); it('can be called multiple times', async function () { - await this.counter.increment(); - await this.counter.increment(); - await this.counter.increment(); + await this.counter.$increment(0); + await this.counter.$increment(0); + await this.counter.$increment(0); - expect(await this.counter.current()).to.be.bignumber.equal('3'); + expect(await this.counter.$current(0)).to.be.bignumber.equal('3'); }); }); }); describe('decrement', function () { beforeEach(async function () { - await this.counter.increment(); - expect(await this.counter.current()).to.be.bignumber.equal('1'); + await this.counter.$increment(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('1'); }); context('starting from 1', function () { it('decrements the current value by one', async function () { - await this.counter.decrement(); - expect(await this.counter.current()).to.be.bignumber.equal('0'); + await this.counter.$decrement(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('0'); }); it('reverts if the current value is 0', async function () { - await this.counter.decrement(); - await expectRevert(this.counter.decrement(), 'Counter: decrement overflow'); + await this.counter.$decrement(0); + await expectRevert(this.counter.$decrement(0), 'Counter: decrement overflow'); }); }); context('after incremented to 3', function () { it('can be called multiple times', async function () { - await this.counter.increment(); - await this.counter.increment(); + await this.counter.$increment(0); + await this.counter.$increment(0); - expect(await this.counter.current()).to.be.bignumber.equal('3'); + expect(await this.counter.$current(0)).to.be.bignumber.equal('3'); - await this.counter.decrement(); - await this.counter.decrement(); - await this.counter.decrement(); + await this.counter.$decrement(0); + await this.counter.$decrement(0); + await this.counter.$decrement(0); - expect(await this.counter.current()).to.be.bignumber.equal('0'); + expect(await this.counter.$current(0)).to.be.bignumber.equal('0'); }); }); }); @@ -65,19 +65,19 @@ contract('Counters', function () { describe('reset', function () { context('null counter', function () { it('does not throw', async function () { - await this.counter.reset(); - expect(await this.counter.current()).to.be.bignumber.equal('0'); + await this.counter.$reset(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('0'); }); }); context('non null counter', function () { beforeEach(async function () { - await this.counter.increment(); - expect(await this.counter.current()).to.be.bignumber.equal('1'); + await this.counter.$increment(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('1'); }); it('reset to 0', async function () { - await this.counter.reset(); - expect(await this.counter.current()).to.be.bignumber.equal('0'); + await this.counter.$reset(0); + expect(await this.counter.$current(0)).to.be.bignumber.equal('0'); }); }); }); diff --git a/test/utils/Create2.test.js b/test/utils/Create2.test.js index b57e06366..121630265 100644 --- a/test/utils/Create2.test.js +++ b/test/utils/Create2.test.js @@ -1,39 +1,39 @@ -const { balance, BN, ether, expectRevert, send } = require('@openzeppelin/test-helpers'); +const { balance, ether, expectEvent, expectRevert, send } = require('@openzeppelin/test-helpers'); const { computeCreate2Address } = require('../helpers/create2'); const { expect } = require('chai'); -const Create2Impl = artifacts.require('Create2Impl'); -const ERC20Mock = artifacts.require('ERC20Mock'); -const ERC1820Implementer = artifacts.require('ERC1820Implementer'); +const Create2 = artifacts.require('$Create2'); +const VestingWallet = artifacts.require('VestingWallet'); +const ERC1820Implementer = artifacts.require('$ERC1820Implementer'); contract('Create2', function (accounts) { - const [deployerAccount] = accounts; + const [ deployerAccount, other ] = accounts; const salt = 'salt message'; const saltHex = web3.utils.soliditySha3(salt); const encodedParams = web3.eth.abi.encodeParameters( - ['string', 'string', 'address', 'uint256'], - ['MyToken', 'MTKN', deployerAccount, 100], + [ 'address', 'uint64', 'uint64' ], + [ other, 0, 0 ], ).slice(2); - const constructorByteCode = `${ERC20Mock.bytecode}${encodedParams}`; + const constructorByteCode = `${VestingWallet.bytecode}${encodedParams}`; beforeEach(async function () { - this.factory = await Create2Impl.new(); + this.factory = await Create2.new(); }); describe('computeAddress', function () { it('computes the correct contract address', async function () { - const onChainComputed = await this.factory - .computeAddress(saltHex, web3.utils.keccak256(constructorByteCode)); + const onChainComputed = + await this.factory.$computeAddress(saltHex, web3.utils.keccak256(constructorByteCode)); const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); expect(onChainComputed).to.equal(offChainComputed); }); it('computes the correct contract address with deployer', async function () { - const onChainComputed = await this.factory - .computeAddressWithDeployer(saltHex, web3.utils.keccak256(constructorByteCode), deployerAccount); + const onChainComputed = + await this.factory.$computeAddress(saltHex, web3.utils.keccak256(constructorByteCode), deployerAccount); const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, deployerAccount); expect(onChainComputed).to.equal(offChainComputed); @@ -42,19 +42,27 @@ contract('Create2', function (accounts) { describe('deploy', function () { it('deploys a ERC1820Implementer from inline assembly code', async function () { - const offChainComputed = - computeCreate2Address(saltHex, ERC1820Implementer.bytecode, this.factory.address); - await this.factory.deployERC1820Implementer(0, saltHex); + const offChainComputed = computeCreate2Address(saltHex, ERC1820Implementer.bytecode, this.factory.address); + + expectEvent( + await this.factory.$deploy(0, saltHex, ERC1820Implementer.bytecode), + 'return$deploy', + { addr: offChainComputed }, + ); + expect(ERC1820Implementer.bytecode).to.include((await web3.eth.getCode(offChainComputed)).slice(2)); }); - it('deploys a ERC20Mock with correct balances', async function () { + it('deploys a contract with constructor arguments', async function () { const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); - await this.factory.deploy(0, saltHex, constructorByteCode); + expectEvent( + await this.factory.$deploy(0, saltHex, constructorByteCode), + 'return$deploy', + { addr: offChainComputed }, + ); - const erc20 = await ERC20Mock.at(offChainComputed); - expect(await erc20.balanceOf(deployerAccount)).to.be.bignumber.equal(new BN(100)); + expect(await VestingWallet.at(offChainComputed).then(instance => instance.beneficiary())).to.be.equal(other); }); it('deploys a contract with funds deposited in the factory', async function () { @@ -62,29 +70,39 @@ contract('Create2', function (accounts) { await send.ether(deployerAccount, this.factory.address, deposit); expect(await balance.current(this.factory.address)).to.be.bignumber.equal(deposit); - const onChainComputed = await this.factory - .computeAddressWithDeployer(saltHex, web3.utils.keccak256(constructorByteCode), this.factory.address); + const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); - await this.factory.deploy(deposit, saltHex, constructorByteCode); - expect(await balance.current(onChainComputed)).to.be.bignumber.equal(deposit); + expectEvent( + await this.factory.$deploy(deposit, saltHex, constructorByteCode), + 'return$deploy', + { addr: offChainComputed }, + ); + + expect(await balance.current(offChainComputed)).to.be.bignumber.equal(deposit); }); it('fails deploying a contract in an existent address', async function () { - await this.factory.deploy(0, saltHex, constructorByteCode, { from: deployerAccount }); + expectEvent( + await this.factory.$deploy(0, saltHex, constructorByteCode), + 'return$deploy', + ); + await expectRevert( - this.factory.deploy(0, saltHex, constructorByteCode, { from: deployerAccount }), 'Create2: Failed on deploy', + this.factory.$deploy(0, saltHex, constructorByteCode), + 'Create2: Failed on deploy', ); }); it('fails deploying a contract if the bytecode length is zero', async function () { await expectRevert( - this.factory.deploy(0, saltHex, '0x', { from: deployerAccount }), 'Create2: bytecode length is zero', + this.factory.$deploy(0, saltHex, '0x'), + 'Create2: bytecode length is zero', ); }); it('fails deploying a contract if factory contract does not have sufficient balance', async function () { await expectRevert( - this.factory.deploy(1, saltHex, constructorByteCode, { from: deployerAccount }), + this.factory.$deploy(1, saltHex, constructorByteCode), 'Create2: insufficient balance', ); }); diff --git a/test/utils/Multicall.test.js b/test/utils/Multicall.test.js index 61c26344c..95cdddc92 100644 --- a/test/utils/Multicall.test.js +++ b/test/utils/Multicall.test.js @@ -1,12 +1,14 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); -const MulticallTokenMock = artifacts.require('MulticallTokenMock'); -contract('MulticallToken', function (accounts) { - const [deployer, alice, bob] = accounts; +const ERC20MulticallMock = artifacts.require('$ERC20MulticallMock'); + +contract('Multicall', function (accounts) { + const [ deployer, alice, bob ] = accounts; const amount = 12000; beforeEach(async function () { - this.multicallToken = await MulticallTokenMock.new(new BN(amount), { from: deployer }); + this.multicallToken = await ERC20MulticallMock.new('name', 'symbol'); + await this.multicallToken.$_mint(deployer, amount); }); it('batches function calls', async function () { diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index 6d8e3aa3c..11f3e7270 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -2,11 +2,11 @@ const { BN, constants, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const StringsMock = artifacts.require('StringsMock'); +const Strings = artifacts.require('$Strings'); contract('Strings', function () { before(async function () { - this.strings = await StringsMock.new(); + this.strings = await Strings.new(); }); describe('toString', function () { @@ -34,12 +34,12 @@ contract('Strings', function () { describe('uint256', function () { it('converts MAX_UINT256', async function () { const value = constants.MAX_UINT256; - expect(await this.strings.methods['toString(uint256)'](value)).to.equal(value.toString(10)); + expect(await this.strings.methods['$toString(uint256)'](value)).to.equal(value.toString(10)); }); for (const value of values) { it(`converts ${value}`, async function () { - expect(await this.strings.methods['toString(uint256)'](value)).to.equal(value); + expect(await this.strings.methods['$toString(uint256)'](value)).to.equal(value); }); } }); @@ -47,22 +47,22 @@ contract('Strings', function () { describe('int256', function () { it('converts MAX_INT256', async function () { const value = constants.MAX_INT256; - expect(await this.strings.methods['toString(int256)'](value)).to.equal(value.toString(10)); + expect(await this.strings.methods['$toString(int256)'](value)).to.equal(value.toString(10)); }); it('converts MIN_INT256', async function () { const value = constants.MIN_INT256; - expect(await this.strings.methods['toString(int256)'](value)).to.equal(value.toString(10)); + expect(await this.strings.methods['$toString(int256)'](value)).to.equal(value.toString(10)); }); for (const value of values) { it(`convert ${value}`, async function () { - expect(await this.strings.methods['toString(int256)'](value)).to.equal(value); + expect(await this.strings.methods['$toString(int256)'](value)).to.equal(value); }); it(`convert negative ${value}`, async function () { const negated = new BN(value).neg(); - expect(await this.strings.methods['toString(int256)'](negated)).to.equal(negated.toString(10)); + expect(await this.strings.methods['$toString(int256)'](negated)).to.equal(negated.toString(10)); }); } }); @@ -70,34 +70,34 @@ contract('Strings', function () { describe('toHexString', function () { it('converts 0', async function () { - expect(await this.strings.methods['toHexString(uint256)'](0)).to.equal('0x00'); + expect(await this.strings.methods['$toHexString(uint256)'](0)).to.equal('0x00'); }); it('converts a positive number', async function () { - expect(await this.strings.methods['toHexString(uint256)'](0x4132)).to.equal('0x4132'); + expect(await this.strings.methods['$toHexString(uint256)'](0x4132)).to.equal('0x4132'); }); it('converts MAX_UINT256', async function () { - expect(await this.strings.methods['toHexString(uint256)'](constants.MAX_UINT256)) + expect(await this.strings.methods['$toHexString(uint256)'](constants.MAX_UINT256)) .to.equal(web3.utils.toHex(constants.MAX_UINT256)); }); }); describe('toHexString fixed', function () { it('converts a positive number (long)', async function () { - expect(await this.strings.methods['toHexString(uint256,uint256)'](0x4132, 32)) + expect(await this.strings.methods['$toHexString(uint256,uint256)'](0x4132, 32)) .to.equal('0x0000000000000000000000000000000000000000000000000000000000004132'); }); it('converts a positive number (short)', async function () { await expectRevert( - this.strings.methods['toHexString(uint256,uint256)'](0x4132, 1), + this.strings.methods['$toHexString(uint256,uint256)'](0x4132, 1), 'Strings: hex length insufficient', ); }); it('converts MAX_UINT256', async function () { - expect(await this.strings.methods['toHexString(uint256,uint256)'](constants.MAX_UINT256, 32)) + expect(await this.strings.methods['$toHexString(uint256,uint256)'](constants.MAX_UINT256, 32)) .to.equal(web3.utils.toHex(constants.MAX_UINT256)); }); }); @@ -105,43 +105,43 @@ contract('Strings', function () { describe('toHexString address', function () { it('converts a random address', async function () { const addr = '0xa9036907dccae6a1e0033479b12e837e5cf5a02f'; - expect(await this.strings.methods['toHexString(address)'](addr)).to.equal(addr); + expect(await this.strings.methods['$toHexString(address)'](addr)).to.equal(addr); }); it('converts an address with leading zeros', async function () { const addr = '0x0000e0ca771e21bd00057f54a68c30d400000000'; - expect(await this.strings.methods['toHexString(address)'](addr)).to.equal(addr); + expect(await this.strings.methods['$toHexString(address)'](addr)).to.equal(addr); }); }); describe('equal', function () { it('compares two empty strings', async function () { - expect(await this.strings.methods['equal(string,string)']('', '')).to.equal(true); + expect(await this.strings.methods['$equal(string,string)']('', '')).to.equal(true); }); it('compares two equal strings', async function () { - expect(await this.strings.methods['equal(string,string)']('a', 'a')).to.equal(true); + expect(await this.strings.methods['$equal(string,string)']('a', 'a')).to.equal(true); }); it('compares two different strings', async function () { - expect(await this.strings.methods['equal(string,string)']('a', 'b')).to.equal(false); + expect(await this.strings.methods['$equal(string,string)']('a', 'b')).to.equal(false); }); it('compares two different strings of different lengths', async function () { - expect(await this.strings.methods['equal(string,string)']('a', 'aa')).to.equal(false); - expect(await this.strings.methods['equal(string,string)']('aa', 'a')).to.equal(false); + expect(await this.strings.methods['$equal(string,string)']('a', 'aa')).to.equal(false); + expect(await this.strings.methods['$equal(string,string)']('aa', 'a')).to.equal(false); }); it('compares two different large strings', async function () { const str1 = 'a'.repeat(201); const str2 = 'a'.repeat(200) + 'b'; - expect(await this.strings.methods['equal(string,string)'](str1, str2)).to.equal(false); + expect(await this.strings.methods['$equal(string,string)'](str1, str2)).to.equal(false); }); it('compares two equal large strings', async function () { const str1 = 'a'.repeat(201); const str2 = 'a'.repeat(201); - expect(await this.strings.methods['equal(string,string)'](str1, str2)).to.equal(true); + expect(await this.strings.methods['$equal(string,string)'](str1, str2)).to.equal(true); }); }); }); diff --git a/test/utils/cryptography/ECDSA.test.js b/test/utils/cryptography/ECDSA.test.js index 04374c4fe..fc3df0db4 100644 --- a/test/utils/cryptography/ECDSA.test.js +++ b/test/utils/cryptography/ECDSA.test.js @@ -3,7 +3,7 @@ const { toEthSignedMessageHash } = require('../../helpers/sign'); const { expect } = require('chai'); -const ECDSAMock = artifacts.require('ECDSAMock'); +const ECDSA = artifacts.require('$ECDSA'); const TEST_MESSAGE = web3.utils.sha3('OpenZeppelin'); const WRONG_MESSAGE = web3.utils.sha3('Nope'); @@ -45,18 +45,18 @@ contract('ECDSA', function (accounts) { const [ other ] = accounts; beforeEach(async function () { - this.ecdsa = await ECDSAMock.new(); + this.ecdsa = await ECDSA.new(); }); context('recover with invalid signature', function () { it('with short signature', async function () { - await expectRevert(this.ecdsa.recover(TEST_MESSAGE, '0x1234'), 'ECDSA: invalid signature length'); + await expectRevert(this.ecdsa.$recover(TEST_MESSAGE, '0x1234'), 'ECDSA: invalid signature length'); }); it('with long signature', async function () { await expectRevert( // eslint-disable-next-line max-len - this.ecdsa.recover(TEST_MESSAGE, '0x01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'), + this.ecdsa.$recover(TEST_MESSAGE, '0x01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'), 'ECDSA: invalid signature length', ); }); @@ -69,7 +69,7 @@ contract('ECDSA', function (accounts) { const signature = await web3.eth.sign(TEST_MESSAGE, other); // Recover the signer address from the generated message and signature. - expect(await this.ecdsa.recover( + expect(await this.ecdsa.$recover( toEthSignedMessageHash(TEST_MESSAGE), signature, )).to.equal(other); @@ -80,7 +80,7 @@ contract('ECDSA', function (accounts) { const signature = await web3.eth.sign(NON_HASH_MESSAGE, other); // Recover the signer address from the generated message and signature. - expect(await this.ecdsa.recover( + expect(await this.ecdsa.$recover( toEthSignedMessageHash(NON_HASH_MESSAGE), signature, )).to.equal(other); @@ -88,13 +88,13 @@ contract('ECDSA', function (accounts) { it('returns a different address', async function () { const signature = await web3.eth.sign(TEST_MESSAGE, other); - expect(await this.ecdsa.recover(WRONG_MESSAGE, signature)).to.not.equal(other); + expect(await this.ecdsa.$recover(WRONG_MESSAGE, signature)).to.not.equal(other); }); it('reverts with invalid signature', async function () { // eslint-disable-next-line max-len const signature = '0x332ce75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e01c'; - await expectRevert(this.ecdsa.recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); + await expectRevert(this.ecdsa.$recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); }); }); @@ -107,24 +107,53 @@ contract('ECDSA', function (accounts) { it('works with correct v value', async function () { const v = '1b'; // 27 = 1b. const signature = signatureWithoutV + v; - expect(await this.ecdsa.recover(TEST_MESSAGE, signature)).to.equal(signer); - expect(await this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature))).to.equal(signer); - expect(await this.ecdsa.recover_r_vs(TEST_MESSAGE, ...split(to2098Format(signature)))).to.equal(signer); + expect(await this.ecdsa.$recover( + TEST_MESSAGE, + signature, + )).to.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(signature), + )).to.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + )).to.equal(signer); }); it('rejects incorrect v value', async function () { const v = '1c'; // 28 = 1c. const signature = signatureWithoutV + v; - expect(await this.ecdsa.recover(TEST_MESSAGE, signature)).to.not.equal(signer); - expect(await this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature))).to.not.equal(signer); - expect(await this.ecdsa.recover_r_vs(TEST_MESSAGE, ...split(to2098Format(signature)))).to.not.equal(signer); + expect(await this.ecdsa.$recover( + TEST_MESSAGE, + signature, + )).to.not.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(signature), + )).to.not.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + )).to.not.equal(signer); }); it('reverts wrong v values', async function () { for (const v of ['00', '01']) { const signature = signatureWithoutV + v; - await expectRevert(this.ecdsa.recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); - await expectRevert(this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature)), 'ECDSA: invalid signature'); + await expectRevert( + this.ecdsa.$recover(TEST_MESSAGE, signature), + 'ECDSA: invalid signature', + ); + + await expectRevert( + this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + 'ECDSA: invalid signature', + ); } }); @@ -132,7 +161,7 @@ contract('ECDSA', function (accounts) { const v = '1b'; // 27 = 1b. const signature = signatureWithoutV + v; await expectRevert( - this.ecdsa.recover(TEST_MESSAGE, to2098Format(signature)), + this.ecdsa.$recover(TEST_MESSAGE, to2098Format(signature)), 'ECDSA: invalid signature length', ); }); @@ -146,24 +175,53 @@ contract('ECDSA', function (accounts) { it('works with correct v value', async function () { const v = '1c'; // 28 = 1c. const signature = signatureWithoutV + v; - expect(await this.ecdsa.recover(TEST_MESSAGE, signature)).to.equal(signer); - expect(await this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature))).to.equal(signer); - expect(await this.ecdsa.recover_r_vs(TEST_MESSAGE, ...split(to2098Format(signature)))).to.equal(signer); + expect(await this.ecdsa.$recover( + TEST_MESSAGE, + signature, + )).to.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(signature), + )).to.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + )).to.equal(signer); }); it('rejects incorrect v value', async function () { const v = '1b'; // 27 = 1b. const signature = signatureWithoutV + v; - expect(await this.ecdsa.recover(TEST_MESSAGE, signature)).to.not.equal(signer); - expect(await this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature))).to.not.equal(signer); - expect(await this.ecdsa.recover_r_vs(TEST_MESSAGE, ...split(to2098Format(signature)))).to.not.equal(signer); + expect(await this.ecdsa.$recover( + TEST_MESSAGE, + signature, + )).to.not.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(signature), + )).to.not.equal(signer); + + expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + )).to.not.equal(signer); }); it('reverts invalid v values', async function () { for (const v of ['00', '01']) { const signature = signatureWithoutV + v; - await expectRevert(this.ecdsa.recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); - await expectRevert(this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(signature)), 'ECDSA: invalid signature'); + await expectRevert( + this.ecdsa.$recover(TEST_MESSAGE, signature), + 'ECDSA: invalid signature', + ); + + await expectRevert( + this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + 'ECDSA: invalid signature', + ); } }); @@ -171,7 +229,7 @@ contract('ECDSA', function (accounts) { const v = '1c'; // 27 = 1b. const signature = signatureWithoutV + v; await expectRevert( - this.ecdsa.recover(TEST_MESSAGE, to2098Format(signature)), + this.ecdsa.$recover(TEST_MESSAGE, to2098Format(signature)), 'ECDSA: invalid signature length', ); }); @@ -181,9 +239,9 @@ contract('ECDSA', function (accounts) { const message = '0xb94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'; // eslint-disable-next-line max-len const highSSignature = '0xe742ff452d41413616a5bf43fe15dd88294e983d3d36206c2712f39083d638bde0a0fc89be718fbc1033e1d30d78be1c68081562ed2e97af876f286f3453231d1b'; - await expectRevert(this.ecdsa.recover(message, highSSignature), 'ECDSA: invalid signature \'s\' value'); + await expectRevert(this.ecdsa.$recover(message, highSSignature), 'ECDSA: invalid signature \'s\' value'); await expectRevert( - this.ecdsa.recover_v_r_s(TEST_MESSAGE, ...split(highSSignature)), + this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(highSSignature)), 'ECDSA: invalid signature \'s\' value', ); expect(() => to2098Format(highSSignature)).to.throw('invalid signature \'s\' value'); @@ -192,12 +250,12 @@ contract('ECDSA', function (accounts) { context('toEthSignedMessageHash', function () { it('prefixes bytes32 data correctly', async function () { - expect(await this.ecdsa.methods['toEthSignedMessageHash(bytes32)'](TEST_MESSAGE)) + expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes32)'](TEST_MESSAGE)) .to.equal(toEthSignedMessageHash(TEST_MESSAGE)); }); it('prefixes dynamic length data correctly', async function () { - expect(await this.ecdsa.methods['toEthSignedMessageHash(bytes)'](NON_HASH_MESSAGE)) + expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes)'](NON_HASH_MESSAGE)) .to.equal(toEthSignedMessageHash(NON_HASH_MESSAGE)); }); }); diff --git a/test/utils/cryptography/EIP712.test.js b/test/utils/cryptography/EIP712.test.js index 9e26a87c6..8c20b91ba 100644 --- a/test/utils/cryptography/EIP712.test.js +++ b/test/utils/cryptography/EIP712.test.js @@ -1,9 +1,10 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const { EIP712Domain, domainSeparator } = require('../../helpers/eip712'); +const { EIP712Domain, domainSeparator, hashTypedData } = require('../../helpers/eip712'); +const { getChainId } = require('../../helpers/chainid'); -const EIP712 = artifacts.require('EIP712External'); +const EIP712Verifier = artifacts.require('$EIP712Verifier'); contract('EIP712', function (accounts) { const [mailTo] = accounts; @@ -12,25 +13,30 @@ contract('EIP712', function (accounts) { const version = '1'; beforeEach('deploying', async function () { - this.eip712 = await EIP712.new(name, version); + this.eip712 = await EIP712Verifier.new(name, version); - // We get the chain id from the contract because Ganache (used for coverage) does not return the same chain id - // from within the EVM as from the JSON RPC interface. - // See https://github.com/trufflesuite/ganache-core/issues/515 - this.chainId = await this.eip712.getChainId(); + this.domain = { + name, + version, + chainId: await getChainId(), + verifyingContract: this.eip712.address, + }; }); it('domain separator', async function () { - expect( - await this.eip712.domainSeparator(), - ).to.equal( - await domainSeparator(name, version, this.chainId, this.eip712.address), - ); + const expected = await domainSeparator(this.domain); + + expect(await this.eip712.$_domainSeparatorV4()).to.equal(expected); + }); + + it('hash digest', async function () { + const structhash = web3.utils.randomHex(32); + const expected = await hashTypedData(this.domain, structhash); + + expect(await this.eip712.$_hashTypedDataV4(structhash)).to.be.equal(expected); }); it('digest', async function () { - const chainId = this.chainId; - const verifyingContract = this.eip712.address; const message = { to: mailTo, contents: 'very interesting', @@ -44,7 +50,7 @@ contract('EIP712', function (accounts) { { name: 'contents', type: 'string' }, ], }, - domain: { name, version, chainId, verifyingContract }, + domain: this.domain, primaryType: 'Mail', message, }; diff --git a/test/utils/cryptography/MerkleProof.test.js b/test/utils/cryptography/MerkleProof.test.js index 7af3d38d7..70271eea1 100644 --- a/test/utils/cryptography/MerkleProof.test.js +++ b/test/utils/cryptography/MerkleProof.test.js @@ -6,11 +6,11 @@ const keccak256 = require('keccak256'); const { expect } = require('chai'); -const MerkleProofWrapper = artifacts.require('MerkleProofWrapper'); +const MerkleProof = artifacts.require('$MerkleProof'); contract('MerkleProof', function () { beforeEach(async function () { - this.merkleProof = await MerkleProofWrapper.new(); + this.merkleProof = await MerkleProof.new(); }); describe('verify', function () { @@ -24,15 +24,15 @@ contract('MerkleProof', function () { const proof = merkleTree.getHexProof(leaf); - expect(await this.merkleProof.verify(proof, root, leaf)).to.equal(true); - expect(await this.merkleProof.verifyCalldata(proof, root, leaf)).to.equal(true); + expect(await this.merkleProof.$verify(proof, root, leaf)).to.equal(true); + expect(await this.merkleProof.$verifyCalldata(proof, root, leaf)).to.equal(true); // For demonstration, it is also possible to create valid proofs for certain 64-byte values *not* in elements: const noSuchLeaf = keccak256( Buffer.concat([keccak256(elements[0]), keccak256(elements[1])].sort(Buffer.compare)), ); - expect(await this.merkleProof.verify(proof.slice(1), root, noSuchLeaf)).to.equal(true); - expect(await this.merkleProof.verifyCalldata(proof.slice(1), root, noSuchLeaf)).to.equal(true); + expect(await this.merkleProof.$verify(proof.slice(1), root, noSuchLeaf)).to.equal(true); + expect(await this.merkleProof.$verifyCalldata(proof.slice(1), root, noSuchLeaf)).to.equal(true); }); it('returns false for an invalid Merkle proof', async function () { @@ -48,8 +48,8 @@ contract('MerkleProof', function () { const badProof = badMerkleTree.getHexProof(badElements[0]); - expect(await this.merkleProof.verify(badProof, correctRoot, correctLeaf)).to.equal(false); - expect(await this.merkleProof.verifyCalldata(badProof, correctRoot, correctLeaf)).to.equal(false); + expect(await this.merkleProof.$verify(badProof, correctRoot, correctLeaf)).to.equal(false); + expect(await this.merkleProof.$verifyCalldata(badProof, correctRoot, correctLeaf)).to.equal(false); }); it('returns false for a Merkle proof of invalid length', async function () { @@ -63,8 +63,8 @@ contract('MerkleProof', function () { const proof = merkleTree.getHexProof(leaf); const badProof = proof.slice(0, proof.length - 5); - expect(await this.merkleProof.verify(badProof, root, leaf)).to.equal(false); - expect(await this.merkleProof.verifyCalldata(badProof, root, leaf)).to.equal(false); + expect(await this.merkleProof.$verify(badProof, root, leaf)).to.equal(false); + expect(await this.merkleProof.$verifyCalldata(badProof, root, leaf)).to.equal(false); }); }); @@ -78,8 +78,8 @@ contract('MerkleProof', function () { const proof = merkleTree.getMultiProof(proofLeaves); const proofFlags = merkleTree.getProofFlags(proofLeaves, proof); - expect(await this.merkleProof.multiProofVerify(proof, proofFlags, root, proofLeaves)).to.equal(true); - expect(await this.merkleProof.multiProofVerifyCalldata(proof, proofFlags, root, proofLeaves)).to.equal(true); + expect(await this.merkleProof.$multiProofVerify(proof, proofFlags, root, proofLeaves)).to.equal(true); + expect(await this.merkleProof.$multiProofVerifyCalldata(proof, proofFlags, root, proofLeaves)).to.equal(true); }); it('returns false for an invalid Merkle multi proof', async function () { @@ -92,9 +92,9 @@ contract('MerkleProof', function () { const badProof = badMerkleTree.getMultiProof(badProofLeaves); const badProofFlags = badMerkleTree.getProofFlags(badProofLeaves, badProof); - expect(await this.merkleProof.multiProofVerify(badProof, badProofFlags, root, badProofLeaves)) + expect(await this.merkleProof.$multiProofVerify(badProof, badProofFlags, root, badProofLeaves)) .to.equal(false); - expect(await this.merkleProof.multiProofVerifyCalldata(badProof, badProofFlags, root, badProofLeaves)) + expect(await this.merkleProof.$multiProofVerifyCalldata(badProof, badProofFlags, root, badProofLeaves)) .to.equal(false); }); @@ -107,7 +107,7 @@ contract('MerkleProof', function () { const root = merkleTree.getRoot(); await expectRevert( - this.merkleProof.multiProofVerify( + this.merkleProof.$multiProofVerify( [ leaves[1], fill, merkleTree.layers[1][1] ], [ false, false, false ], root, @@ -116,7 +116,7 @@ contract('MerkleProof', function () { 'MerkleProof: invalid multiproof', ); await expectRevert( - this.merkleProof.multiProofVerifyCalldata( + this.merkleProof.$multiProofVerifyCalldata( [ leaves[1], fill, merkleTree.layers[1][1] ], [ false, false, false ], root, @@ -135,7 +135,7 @@ contract('MerkleProof', function () { const root = merkleTree.getRoot(); await expectRevert( - this.merkleProof.multiProofVerify( + this.merkleProof.$multiProofVerify( [ leaves[1], fill, merkleTree.layers[1][1] ], [ false, false, false, false ], root, @@ -143,8 +143,9 @@ contract('MerkleProof', function () { ), 'reverted with panic code 0x32', ); + await expectRevert( - this.merkleProof.multiProofVerifyCalldata( + this.merkleProof.$multiProofVerifyCalldata( [ leaves[1], fill, merkleTree.layers[1][1] ], [ false, false, false, false ], root, @@ -163,8 +164,8 @@ contract('MerkleProof', function () { const proof = merkleTree.getMultiProof(proofLeaves); const proofFlags = merkleTree.getProofFlags(proofLeaves, proof); - expect(await this.merkleProof.multiProofVerify(proof, proofFlags, root, proofLeaves)).to.equal(true); - expect(await this.merkleProof.multiProofVerifyCalldata(proof, proofFlags, root, proofLeaves)).to.equal(true); + expect(await this.merkleProof.$multiProofVerify(proof, proofFlags, root, proofLeaves)).to.equal(true); + expect(await this.merkleProof.$multiProofVerifyCalldata(proof, proofFlags, root, proofLeaves)).to.equal(true); }); it('limit case: can prove empty leaves', async function () { @@ -172,8 +173,8 @@ contract('MerkleProof', function () { const merkleTree = new MerkleTree(leaves, keccak256, { sort: true }); const root = merkleTree.getRoot(); - expect(await this.merkleProof.multiProofVerify([ root ], [], root, [])).to.equal(true); - expect(await this.merkleProof.multiProofVerifyCalldata([ root ], [], root, [])).to.equal(true); + expect(await this.merkleProof.$multiProofVerify([ root ], [], root, [])).to.equal(true); + expect(await this.merkleProof.$multiProofVerifyCalldata([ root ], [], root, [])).to.equal(true); }); }); }); diff --git a/test/utils/cryptography/SignatureChecker.test.js b/test/utils/cryptography/SignatureChecker.test.js index 801377a95..55ba75af0 100644 --- a/test/utils/cryptography/SignatureChecker.test.js +++ b/test/utils/cryptography/SignatureChecker.test.js @@ -2,7 +2,7 @@ const { toEthSignedMessageHash } = require('../../helpers/sign'); const { expect } = require('chai'); -const SignatureCheckerMock = artifacts.require('SignatureCheckerMock'); +const SignatureChecker = artifacts.require('$SignatureChecker'); const ERC1271WalletMock = artifacts.require('ERC1271WalletMock'); const ERC1271MaliciousMock = artifacts.require('ERC1271MaliciousMock'); @@ -13,7 +13,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { const [signer, other] = accounts; before('deploying', async function () { - this.signaturechecker = await SignatureCheckerMock.new(); + this.signaturechecker = await SignatureChecker.new(); this.wallet = await ERC1271WalletMock.new(signer); this.malicious = await ERC1271MaliciousMock.new(); this.signature = await web3.eth.sign(TEST_MESSAGE, signer); @@ -21,7 +21,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { context('EOA account', function () { it('with matching signer and signature', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( signer, toEthSignedMessageHash(TEST_MESSAGE), this.signature, @@ -29,7 +29,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); it('with invalid signer', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( other, toEthSignedMessageHash(TEST_MESSAGE), this.signature, @@ -37,7 +37,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); it('with invalid signature', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( signer, toEthSignedMessageHash(WRONG_MESSAGE), this.signature, @@ -47,7 +47,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { context('ERC1271 wallet', function () { it('with matching signer and signature', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( this.wallet.address, toEthSignedMessageHash(TEST_MESSAGE), this.signature, @@ -55,7 +55,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); it('with invalid signer', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( this.signaturechecker.address, toEthSignedMessageHash(TEST_MESSAGE), this.signature, @@ -63,7 +63,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); it('with invalid signature', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( this.wallet.address, toEthSignedMessageHash(WRONG_MESSAGE), this.signature, @@ -71,7 +71,7 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); it('with malicious wallet', async function () { - expect(await this.signaturechecker.isValidSignatureNow( + expect(await this.signaturechecker.$isValidSignatureNow( this.malicious.address, toEthSignedMessageHash(TEST_MESSAGE), this.signature, diff --git a/test/utils/introspection/ERC165.test.js b/test/utils/introspection/ERC165.test.js index fabad8cdc..c1db67768 100644 --- a/test/utils/introspection/ERC165.test.js +++ b/test/utils/introspection/ERC165.test.js @@ -1,10 +1,10 @@ const { shouldSupportInterfaces } = require('./SupportsInterface.behavior'); -const ERC165Mock = artifacts.require('ERC165Mock'); +const ERC165 = artifacts.require('$ERC165'); contract('ERC165', function () { beforeEach(async function () { - this.mock = await ERC165Mock.new(); + this.mock = await ERC165.new(); }); shouldSupportInterfaces([ diff --git a/test/utils/introspection/ERC165Checker.test.js b/test/utils/introspection/ERC165Checker.test.js index f4abf44f8..baa344a7f 100644 --- a/test/utils/introspection/ERC165Checker.test.js +++ b/test/utils/introspection/ERC165Checker.test.js @@ -2,11 +2,11 @@ require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const ERC165CheckerMock = artifacts.require('ERC165CheckerMock'); +const ERC165Checker = artifacts.require('$ERC165Checker'); +const ERC165Storage = artifacts.require('$ERC165Storage'); const ERC165MissingData = artifacts.require('ERC165MissingData'); const ERC165MaliciousData = artifacts.require('ERC165MaliciousData'); const ERC165NotSupported = artifacts.require('ERC165NotSupported'); -const ERC165InterfacesSupported = artifacts.require('ERC165InterfacesSupported'); const ERC165ReturnBombMock = artifacts.require('ERC165ReturnBombMock'); const DUMMY_ID = '0xdeadbeef'; @@ -18,7 +18,7 @@ const DUMMY_ACCOUNT = '0x1111111111111111111111111111111111111111'; contract('ERC165Checker', function () { beforeEach(async function () { - this.mock = await ERC165CheckerMock.new(); + this.mock = await ERC165Checker.new(); }); context('ERC165 missing return data', function () { @@ -27,28 +27,28 @@ contract('ERC165Checker', function () { }); it('does not support ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(false); }); it('does not support mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsInterface(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); it('does not support mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, [DUMMY_ID]); expect(supported).to.equal(false); }); it('does not support mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(false); }); it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); }); @@ -59,28 +59,28 @@ contract('ERC165Checker', function () { }); it('does not support ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(false); }); it('does not support mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsInterface(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); it('does not support mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, [DUMMY_ID]); expect(supported).to.equal(false); }); it('does not support mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(false); }); it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); expect(supported).to.equal(true); }); }); @@ -91,135 +91,137 @@ contract('ERC165Checker', function () { }); it('does not support ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(false); }); it('does not support mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsInterface(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); it('does not support mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, [DUMMY_ID]); expect(supported).to.equal(false); }); it('does not support mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(false); }); it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); }); context('ERC165 supported', function () { beforeEach(async function () { - this.target = await ERC165InterfacesSupported.new([]); + this.target = await ERC165Storage.new(); }); it('supports ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(true); }); it('does not support mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsInterface(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); it('does not support mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, [DUMMY_ID]); expect(supported).to.equal(false); }); it('does not support mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(false); }); it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); expect(supported).to.equal(false); }); }); context('ERC165 and single interface supported', function () { beforeEach(async function () { - this.target = await ERC165InterfacesSupported.new([DUMMY_ID]); + this.target = await ERC165Storage.new(); + await this.target.$_registerInterface(DUMMY_ID); }); it('supports ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(true); }); it('supports mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsInterface(this.target.address, DUMMY_ID); expect(supported).to.equal(true); }); it('supports mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, [DUMMY_ID]); expect(supported).to.equal(true); }); it('supports mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(true); }); it('supports mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID); expect(supported).to.equal(true); }); }); context('ERC165 and many interfaces supported', function () { beforeEach(async function () { - this.supportedInterfaces = [DUMMY_ID, DUMMY_ID_2, DUMMY_ID_3]; - this.target = await ERC165InterfacesSupported.new(this.supportedInterfaces); + this.supportedInterfaces = [ DUMMY_ID, DUMMY_ID_2, DUMMY_ID_3 ]; + this.target = await ERC165Storage.new(); + await Promise.all(this.supportedInterfaces.map(interfaceId => this.target.$_registerInterface(interfaceId))); }); it('supports ERC165', async function () { - const supported = await this.mock.supportsERC165(this.target.address); + const supported = await this.mock.$supportsERC165(this.target.address); expect(supported).to.equal(true); }); it('supports each interfaceId via supportsInterface', async function () { for (const interfaceId of this.supportedInterfaces) { - const supported = await this.mock.supportsInterface(this.target.address, interfaceId); + const supported = await this.mock.$supportsInterface(this.target.address, interfaceId); expect(supported).to.equal(true); }; }); it('supports all interfaceIds via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(this.target.address, this.supportedInterfaces); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, this.supportedInterfaces); expect(supported).to.equal(true); }); it('supports none of the interfaces queried via supportsAllInterfaces', async function () { const interfaceIdsToTest = [DUMMY_UNSUPPORTED_ID, DUMMY_UNSUPPORTED_ID_2]; - const supported = await this.mock.supportsAllInterfaces(this.target.address, interfaceIdsToTest); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, interfaceIdsToTest); expect(supported).to.equal(false); }); it('supports not all of the interfaces queried via supportsAllInterfaces', async function () { const interfaceIdsToTest = [...this.supportedInterfaces, DUMMY_UNSUPPORTED_ID]; - const supported = await this.mock.supportsAllInterfaces(this.target.address, interfaceIdsToTest); + const supported = await this.mock.$supportsAllInterfaces(this.target.address, interfaceIdsToTest); expect(supported).to.equal(false); }); it('supports all interfaceIds via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(this.target.address, this.supportedInterfaces); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, this.supportedInterfaces); expect(supported.length).to.equal(3); expect(supported[0]).to.equal(true); expect(supported[1]).to.equal(true); @@ -229,7 +231,7 @@ contract('ERC165Checker', function () { it('supports none of the interfaces queried via getSupportedInterfaces', async function () { const interfaceIdsToTest = [DUMMY_UNSUPPORTED_ID, DUMMY_UNSUPPORTED_ID_2]; - const supported = await this.mock.getSupportedInterfaces(this.target.address, interfaceIdsToTest); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, interfaceIdsToTest); expect(supported.length).to.equal(2); expect(supported[0]).to.equal(false); expect(supported[1]).to.equal(false); @@ -238,7 +240,7 @@ contract('ERC165Checker', function () { it('supports not all of the interfaces queried via getSupportedInterfaces', async function () { const interfaceIdsToTest = [...this.supportedInterfaces, DUMMY_UNSUPPORTED_ID]; - const supported = await this.mock.getSupportedInterfaces(this.target.address, interfaceIdsToTest); + const supported = await this.mock.$getSupportedInterfaces(this.target.address, interfaceIdsToTest); expect(supported.length).to.equal(4); expect(supported[0]).to.equal(true); expect(supported[1]).to.equal(true); @@ -248,7 +250,7 @@ contract('ERC165Checker', function () { it('supports each interfaceId via supportsERC165InterfaceUnchecked', async function () { for (const interfaceId of this.supportedInterfaces) { - const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, interfaceId); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, interfaceId); expect(supported).to.equal(true); }; }); @@ -256,28 +258,28 @@ contract('ERC165Checker', function () { context('account address does not support ERC165', function () { it('does not support ERC165', async function () { - const supported = await this.mock.supportsERC165(DUMMY_ACCOUNT); + const supported = await this.mock.$supportsERC165(DUMMY_ACCOUNT); expect(supported).to.equal(false); }); it('does not support mock interface via supportsInterface', async function () { - const supported = await this.mock.supportsInterface(DUMMY_ACCOUNT, DUMMY_ID); + const supported = await this.mock.$supportsInterface(DUMMY_ACCOUNT, DUMMY_ID); expect(supported).to.equal(false); }); it('does not support mock interface via supportsAllInterfaces', async function () { - const supported = await this.mock.supportsAllInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]); + const supported = await this.mock.$supportsAllInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]); expect(supported).to.equal(false); }); it('does not support mock interface via getSupportedInterfaces', async function () { - const supported = await this.mock.getSupportedInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]); + const supported = await this.mock.$getSupportedInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]); expect(supported.length).to.equal(1); expect(supported[0]).to.equal(false); }); it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () { - const supported = await this.mock.supportsERC165InterfaceUnchecked(DUMMY_ACCOUNT, DUMMY_ID); + const supported = await this.mock.$supportsERC165InterfaceUnchecked(DUMMY_ACCOUNT, DUMMY_ID); expect(supported).to.equal(false); }); }); @@ -285,10 +287,10 @@ contract('ERC165Checker', function () { it('Return bomb resistance', async function () { this.target = await ERC165ReturnBombMock.new(); - const tx1 = await this.mock.supportsInterface.sendTransaction(this.target.address, DUMMY_ID); + const tx1 = await this.mock.$supportsInterface.sendTransaction(this.target.address, DUMMY_ID); expect(tx1.receipt.gasUsed).to.be.lessThan(120000); // 3*30k + 21k + some margin - const tx2 = await this.mock.getSupportedInterfaces.sendTransaction( + const tx2 = await this.mock.$getSupportedInterfaces.sendTransaction( this.target.address, [ DUMMY_ID, diff --git a/test/utils/introspection/ERC165Storage.test.js b/test/utils/introspection/ERC165Storage.test.js index 9c2792de8..278f4ae18 100644 --- a/test/utils/introspection/ERC165Storage.test.js +++ b/test/utils/introspection/ERC165Storage.test.js @@ -2,21 +2,21 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { shouldSupportInterfaces } = require('./SupportsInterface.behavior'); -const ERC165Mock = artifacts.require('ERC165StorageMock'); +const ERC165Storage = artifacts.require('$ERC165Storage'); contract('ERC165Storage', function () { beforeEach(async function () { - this.mock = await ERC165Mock.new(); + this.mock = await ERC165Storage.new(); }); it('register interface', async function () { expect(await this.mock.supportsInterface('0x00000001')).to.be.equal(false); - await this.mock.registerInterface('0x00000001'); + await this.mock.$_registerInterface('0x00000001'); expect(await this.mock.supportsInterface('0x00000001')).to.be.equal(true); }); it('does not allow 0xffffffff', async function () { - await expectRevert(this.mock.registerInterface('0xffffffff'), 'ERC165: invalid interface id'); + await expectRevert(this.mock.$_registerInterface('0xffffffff'), 'ERC165: invalid interface id'); }); shouldSupportInterfaces([ diff --git a/test/utils/introspection/ERC1820Implementer.test.js b/test/utils/introspection/ERC1820Implementer.test.js index 8d9fe5634..ba0304625 100644 --- a/test/utils/introspection/ERC1820Implementer.test.js +++ b/test/utils/introspection/ERC1820Implementer.test.js @@ -3,7 +3,7 @@ const { bufferToHex, keccakFromString } = require('ethereumjs-util'); const { expect } = require('chai'); -const ERC1820ImplementerMock = artifacts.require('ERC1820ImplementerMock'); +const ERC1820Implementer = artifacts.require('$ERC1820Implementer'); contract('ERC1820Implementer', function (accounts) { const [ registryFunder, implementee, other ] = accounts; @@ -11,7 +11,7 @@ contract('ERC1820Implementer', function (accounts) { const ERC1820_ACCEPT_MAGIC = bufferToHex(keccakFromString('ERC1820_ACCEPT_MAGIC')); beforeEach(async function () { - this.implementer = await ERC1820ImplementerMock.new(); + this.implementer = await ERC1820Implementer.new(); this.registry = await singletons.ERC1820Registry(registryFunder); this.interfaceA = bufferToHex(keccakFromString('interfaceA')); @@ -36,7 +36,7 @@ contract('ERC1820Implementer', function (accounts) { context('with registered interfaces', function () { beforeEach(async function () { - await this.implementer.registerInterfaceForAddress(this.interfaceA, implementee); + await this.implementer.$_registerInterfaceForAddress(this.interfaceA, implementee); }); it('returns true when interface implementation is queried', async function () { diff --git a/test/utils/math/Math.test.js b/test/utils/math/Math.test.js index 51df28d12..63cfa186c 100644 --- a/test/utils/math/Math.test.js +++ b/test/utils/math/Math.test.js @@ -3,7 +3,7 @@ const { expect } = require('chai'); const { MAX_UINT256 } = constants; const { Rounding } = require('../../helpers/enums.js'); -const MathMock = artifacts.require('MathMock'); +const Math = artifacts.require('$Math'); contract('Math', function () { const min = new BN('1234'); @@ -12,26 +12,26 @@ contract('Math', function () { const MAX_UINT256_SUB2 = MAX_UINT256.sub(new BN('2')); beforeEach(async function () { - this.math = await MathMock.new(); + this.math = await Math.new(); }); describe('max', function () { it('is correctly detected in first argument position', async function () { - expect(await this.math.max(max, min)).to.be.bignumber.equal(max); + expect(await this.math.$max(max, min)).to.be.bignumber.equal(max); }); it('is correctly detected in second argument position', async function () { - expect(await this.math.max(min, max)).to.be.bignumber.equal(max); + expect(await this.math.$max(min, max)).to.be.bignumber.equal(max); }); }); describe('min', function () { it('is correctly detected in first argument position', async function () { - expect(await this.math.min(min, max)).to.be.bignumber.equal(min); + expect(await this.math.$min(min, max)).to.be.bignumber.equal(min); }); it('is correctly detected in second argument position', async function () { - expect(await this.math.min(max, min)).to.be.bignumber.equal(min); + expect(await this.math.$min(max, min)).to.be.bignumber.equal(min); }); }); @@ -43,24 +43,24 @@ contract('Math', function () { it('is correctly calculated with two odd numbers', async function () { const a = new BN('57417'); const b = new BN('95431'); - expect(await this.math.average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); + expect(await this.math.$average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); }); it('is correctly calculated with two even numbers', async function () { const a = new BN('42304'); const b = new BN('84346'); - expect(await this.math.average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); + expect(await this.math.$average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); }); it('is correctly calculated with one even and one odd number', async function () { const a = new BN('57417'); const b = new BN('84346'); - expect(await this.math.average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); + expect(await this.math.$average(a, b)).to.be.bignumber.equal(bnAverage(a, b)); }); it('is correctly calculated with two max uint256 numbers', async function () { const a = MAX_UINT256; - expect(await this.math.average(a, a)).to.be.bignumber.equal(bnAverage(a, a)); + expect(await this.math.$average(a, a)).to.be.bignumber.equal(bnAverage(a, a)); }); }); @@ -68,68 +68,68 @@ contract('Math', function () { it('does not round up on exact division', async function () { const a = new BN('10'); const b = new BN('5'); - expect(await this.math.ceilDiv(a, b)).to.be.bignumber.equal('2'); + expect(await this.math.$ceilDiv(a, b)).to.be.bignumber.equal('2'); }); it('rounds up on division with remainders', async function () { const a = new BN('42'); const b = new BN('13'); - expect(await this.math.ceilDiv(a, b)).to.be.bignumber.equal('4'); + expect(await this.math.$ceilDiv(a, b)).to.be.bignumber.equal('4'); }); it('does not overflow', async function () { const b = new BN('2'); const result = new BN('1').shln(255); - expect(await this.math.ceilDiv(MAX_UINT256, b)).to.be.bignumber.equal(result); + expect(await this.math.$ceilDiv(MAX_UINT256, b)).to.be.bignumber.equal(result); }); it('correctly computes max uint256 divided by 1', async function () { const b = new BN('1'); - expect(await this.math.ceilDiv(MAX_UINT256, b)).to.be.bignumber.equal(MAX_UINT256); + expect(await this.math.$ceilDiv(MAX_UINT256, b)).to.be.bignumber.equal(MAX_UINT256); }); }); describe('muldiv', function () { it('divide by 0', async function () { - await expectRevert.unspecified(this.math.mulDiv(1, 1, 0, Rounding.Down)); + await expectRevert.unspecified(this.math.$mulDiv(1, 1, 0, Rounding.Down)); }); describe('does round down', async function () { it('small values', async function () { - expect(await this.math.mulDiv('3', '4', '5', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.mulDiv('3', '5', '5', Rounding.Down)).to.be.bignumber.equal('3'); + expect(await this.math.$mulDiv('3', '4', '5', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$mulDiv('3', '5', '5', Rounding.Down)).to.be.bignumber.equal('3'); }); it('large values', async function () { - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( new BN('42'), MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down, )).to.be.bignumber.equal(new BN('41')); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( new BN('17'), MAX_UINT256, MAX_UINT256, Rounding.Down, )).to.be.bignumber.equal(new BN('17')); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256_SUB1, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down, )).to.be.bignumber.equal(MAX_UINT256_SUB2); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down, )).to.be.bignumber.equal(MAX_UINT256_SUB1); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256, MAX_UINT256, MAX_UINT256, @@ -140,40 +140,40 @@ contract('Math', function () { describe('does round up', async function () { it('small values', async function () { - expect(await this.math.mulDiv('3', '4', '5', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.mulDiv('3', '5', '5', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$mulDiv('3', '4', '5', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$mulDiv('3', '5', '5', Rounding.Up)).to.be.bignumber.equal('3'); }); it('large values', async function () { - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( new BN('42'), MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up, )).to.be.bignumber.equal(new BN('42')); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( new BN('17'), MAX_UINT256, MAX_UINT256, Rounding.Up, )).to.be.bignumber.equal(new BN('17')); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256_SUB1, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up, )).to.be.bignumber.equal(MAX_UINT256_SUB1); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up, )).to.be.bignumber.equal(MAX_UINT256_SUB1); - expect(await this.math.mulDiv( + expect(await this.math.$mulDiv( MAX_UINT256, MAX_UINT256, MAX_UINT256, @@ -185,34 +185,34 @@ contract('Math', function () { describe('sqrt', function () { it('rounds down', async function () { - expect(await this.math.sqrt('0', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.sqrt('1', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.sqrt('2', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.sqrt('3', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.sqrt('4', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.sqrt('144', Rounding.Down)).to.be.bignumber.equal('12'); - expect(await this.math.sqrt('999999', Rounding.Down)).to.be.bignumber.equal('999'); - expect(await this.math.sqrt('1000000', Rounding.Down)).to.be.bignumber.equal('1000'); - expect(await this.math.sqrt('1000001', Rounding.Down)).to.be.bignumber.equal('1000'); - expect(await this.math.sqrt('1002000', Rounding.Down)).to.be.bignumber.equal('1000'); - expect(await this.math.sqrt('1002001', Rounding.Down)).to.be.bignumber.equal('1001'); - expect(await this.math.sqrt(MAX_UINT256, Rounding.Down)) + expect(await this.math.$sqrt('0', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$sqrt('1', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$sqrt('2', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$sqrt('3', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$sqrt('4', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$sqrt('144', Rounding.Down)).to.be.bignumber.equal('12'); + expect(await this.math.$sqrt('999999', Rounding.Down)).to.be.bignumber.equal('999'); + expect(await this.math.$sqrt('1000000', Rounding.Down)).to.be.bignumber.equal('1000'); + expect(await this.math.$sqrt('1000001', Rounding.Down)).to.be.bignumber.equal('1000'); + expect(await this.math.$sqrt('1002000', Rounding.Down)).to.be.bignumber.equal('1000'); + expect(await this.math.$sqrt('1002001', Rounding.Down)).to.be.bignumber.equal('1001'); + expect(await this.math.$sqrt(MAX_UINT256, Rounding.Down)) .to.be.bignumber.equal('340282366920938463463374607431768211455'); }); it('rounds up', async function () { - expect(await this.math.sqrt('0', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.sqrt('1', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.sqrt('2', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.sqrt('3', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.sqrt('4', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.sqrt('144', Rounding.Up)).to.be.bignumber.equal('12'); - expect(await this.math.sqrt('999999', Rounding.Up)).to.be.bignumber.equal('1000'); - expect(await this.math.sqrt('1000000', Rounding.Up)).to.be.bignumber.equal('1000'); - expect(await this.math.sqrt('1000001', Rounding.Up)).to.be.bignumber.equal('1001'); - expect(await this.math.sqrt('1002000', Rounding.Up)).to.be.bignumber.equal('1001'); - expect(await this.math.sqrt('1002001', Rounding.Up)).to.be.bignumber.equal('1001'); - expect(await this.math.sqrt(MAX_UINT256, Rounding.Up)) + expect(await this.math.$sqrt('0', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.$sqrt('1', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$sqrt('2', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$sqrt('3', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$sqrt('4', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$sqrt('144', Rounding.Up)).to.be.bignumber.equal('12'); + expect(await this.math.$sqrt('999999', Rounding.Up)).to.be.bignumber.equal('1000'); + expect(await this.math.$sqrt('1000000', Rounding.Up)).to.be.bignumber.equal('1000'); + expect(await this.math.$sqrt('1000001', Rounding.Up)).to.be.bignumber.equal('1001'); + expect(await this.math.$sqrt('1002000', Rounding.Up)).to.be.bignumber.equal('1001'); + expect(await this.math.$sqrt('1002001', Rounding.Up)).to.be.bignumber.equal('1001'); + expect(await this.math.$sqrt(MAX_UINT256, Rounding.Up)) .to.be.bignumber.equal('340282366920938463463374607431768211456'); }); }); @@ -220,92 +220,97 @@ contract('Math', function () { describe('log', function () { describe('log2', function () { it('rounds down', async function () { - expect(await this.math.log2('0', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log2('1', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log2('2', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log2('3', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log2('4', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log2('5', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log2('6', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log2('7', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log2('8', Rounding.Down)).to.be.bignumber.equal('3'); - expect(await this.math.log2('9', Rounding.Down)).to.be.bignumber.equal('3'); - expect(await this.math.log2(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal('255'); + // For some reason calling .$log2() directly fails + expect(await this.math.methods['$log2(uint256,uint8)']('0', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.methods['$log2(uint256,uint8)']('1', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.methods['$log2(uint256,uint8)']('2', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.methods['$log2(uint256,uint8)']('3', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.methods['$log2(uint256,uint8)']('4', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('5', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('6', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('7', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('8', Rounding.Down)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)']('9', Rounding.Down)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Down)) + .to.be.bignumber.equal('255'); }); it('rounds up', async function () { - expect(await this.math.log2('0', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log2('1', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log2('2', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log2('3', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log2('4', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log2('5', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log2('6', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log2('7', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log2('8', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log2(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('256'); + // For some reason calling .$log2() directly fails + expect(await this.math.methods['$log2(uint256,uint8)']('0', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.methods['$log2(uint256,uint8)']('1', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.methods['$log2(uint256,uint8)']('2', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.methods['$log2(uint256,uint8)']('3', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('4', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.methods['$log2(uint256,uint8)']('5', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)']('6', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)']('7', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)']('8', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.methods['$log2(uint256,uint8)']('9', Rounding.Up)).to.be.bignumber.equal('4'); + expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Up)) + .to.be.bignumber.equal('256'); }); }); describe('log10', function () { it('rounds down', async function () { - expect(await this.math.log10('0', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log10('1', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log10('2', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log10('9', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log10('10', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log10('11', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log10('99', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log10('100', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log10('101', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log10('999', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log10('1000', Rounding.Down)).to.be.bignumber.equal('3'); - expect(await this.math.log10('1001', Rounding.Down)).to.be.bignumber.equal('3'); - expect(await this.math.log10(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal('77'); + expect(await this.math.$log10('0', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('1', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('2', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('9', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('10', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('11', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('99', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('100', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('101', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('999', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('1000', Rounding.Down)).to.be.bignumber.equal('3'); + expect(await this.math.$log10('1001', Rounding.Down)).to.be.bignumber.equal('3'); + expect(await this.math.$log10(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal('77'); }); it('rounds up', async function () { - expect(await this.math.log10('0', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log10('1', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log10('2', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log10('9', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log10('10', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log10('11', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log10('99', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log10('100', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log10('101', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log10('999', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log10('1000', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log10('1001', Rounding.Up)).to.be.bignumber.equal('4'); - expect(await this.math.log10(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('78'); + expect(await this.math.$log10('0', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('1', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.$log10('2', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('9', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('10', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log10('11', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('99', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('100', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log10('101', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$log10('999', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$log10('1000', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$log10('1001', Rounding.Up)).to.be.bignumber.equal('4'); + expect(await this.math.$log10(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('78'); }); }); describe('log256', function () { it('rounds down', async function () { - expect(await this.math.log256('0', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log256('1', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log256('2', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log256('255', Rounding.Down)).to.be.bignumber.equal('0'); - expect(await this.math.log256('256', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log256('257', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log256('65535', Rounding.Down)).to.be.bignumber.equal('1'); - expect(await this.math.log256('65536', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log256('65537', Rounding.Down)).to.be.bignumber.equal('2'); - expect(await this.math.log256(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal('31'); + expect(await this.math.$log256('0', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('1', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('2', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('255', Rounding.Down)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('256', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('257', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('65535', Rounding.Down)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('65536', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$log256('65537', Rounding.Down)).to.be.bignumber.equal('2'); + expect(await this.math.$log256(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal('31'); }); it('rounds up', async function () { - expect(await this.math.log256('0', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log256('1', Rounding.Up)).to.be.bignumber.equal('0'); - expect(await this.math.log256('2', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log256('255', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log256('256', Rounding.Up)).to.be.bignumber.equal('1'); - expect(await this.math.log256('257', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log256('65535', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log256('65536', Rounding.Up)).to.be.bignumber.equal('2'); - expect(await this.math.log256('65537', Rounding.Up)).to.be.bignumber.equal('3'); - expect(await this.math.log256(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('32'); + expect(await this.math.$log256('0', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('1', Rounding.Up)).to.be.bignumber.equal('0'); + expect(await this.math.$log256('2', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('255', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('256', Rounding.Up)).to.be.bignumber.equal('1'); + expect(await this.math.$log256('257', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log256('65535', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log256('65536', Rounding.Up)).to.be.bignumber.equal('2'); + expect(await this.math.$log256('65537', Rounding.Up)).to.be.bignumber.equal('3'); + expect(await this.math.$log256(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('32'); }); }); }); diff --git a/test/utils/math/SafeCast.test.js b/test/utils/math/SafeCast.test.js index 1399350a5..38374e500 100644 --- a/test/utils/math/SafeCast.test.js +++ b/test/utils/math/SafeCast.test.js @@ -2,11 +2,11 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const { range } = require('../../../scripts/helpers'); -const SafeCastMock = artifacts.require('SafeCastMock'); +const SafeCast = artifacts.require('$SafeCast'); contract('SafeCast', async function () { beforeEach(async function () { - this.safeCast = await SafeCastMock.new(); + this.safeCast = await SafeCast.new(); }); function testToUint (bits) { @@ -14,27 +14,27 @@ contract('SafeCast', async function () { const maxValue = new BN('2').pow(new BN(bits)).subn(1); it('downcasts 0', async function () { - expect(await this.safeCast[`toUint${bits}`](0)).to.be.bignumber.equal('0'); + expect(await this.safeCast[`$toUint${bits}`](0)).to.be.bignumber.equal('0'); }); it('downcasts 1', async function () { - expect(await this.safeCast[`toUint${bits}`](1)).to.be.bignumber.equal('1'); + expect(await this.safeCast[`$toUint${bits}`](1)).to.be.bignumber.equal('1'); }); it(`downcasts 2^${bits} - 1 (${maxValue})`, async function () { - expect(await this.safeCast[`toUint${bits}`](maxValue)).to.be.bignumber.equal(maxValue); + expect(await this.safeCast[`$toUint${bits}`](maxValue)).to.be.bignumber.equal(maxValue); }); it(`reverts when downcasting 2^${bits} (${maxValue.addn(1)})`, async function () { await expectRevert( - this.safeCast[`toUint${bits}`](maxValue.addn(1)), + this.safeCast[`$toUint${bits}`](maxValue.addn(1)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); it(`reverts when downcasting 2^${bits} + 1 (${maxValue.addn(2)})`, async function () { await expectRevert( - this.safeCast[`toUint${bits}`](maxValue.addn(2)), + this.safeCast[`$toUint${bits}`](maxValue.addn(2)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); @@ -48,27 +48,27 @@ contract('SafeCast', async function () { const minInt256 = new BN('2').pow(new BN(255)).neg(); it('casts 0', async function () { - expect(await this.safeCast.toUint256(0)).to.be.bignumber.equal('0'); + expect(await this.safeCast.$toUint256(0)).to.be.bignumber.equal('0'); }); it('casts 1', async function () { - expect(await this.safeCast.toUint256(1)).to.be.bignumber.equal('1'); + expect(await this.safeCast.$toUint256(1)).to.be.bignumber.equal('1'); }); it(`casts INT256_MAX (${maxInt256})`, async function () { - expect(await this.safeCast.toUint256(maxInt256)).to.be.bignumber.equal(maxInt256); + expect(await this.safeCast.$toUint256(maxInt256)).to.be.bignumber.equal(maxInt256); }); it('reverts when casting -1', async function () { await expectRevert( - this.safeCast.toUint256(-1), + this.safeCast.$toUint256(-1), 'SafeCast: value must be positive', ); }); it(`reverts when casting INT256_MIN (${minInt256})`, async function () { await expectRevert( - this.safeCast.toUint256(minInt256), + this.safeCast.$toUint256(minInt256), 'SafeCast: value must be positive', ); }); @@ -80,49 +80,49 @@ contract('SafeCast', async function () { const maxValue = new BN('2').pow(new BN(bits - 1)).subn(1); it('downcasts 0', async function () { - expect(await this.safeCast[`toInt${bits}`](0)).to.be.bignumber.equal('0'); + expect(await this.safeCast[`$toInt${bits}`](0)).to.be.bignumber.equal('0'); }); it('downcasts 1', async function () { - expect(await this.safeCast[`toInt${bits}`](1)).to.be.bignumber.equal('1'); + expect(await this.safeCast[`$toInt${bits}`](1)).to.be.bignumber.equal('1'); }); it('downcasts -1', async function () { - expect(await this.safeCast[`toInt${bits}`](-1)).to.be.bignumber.equal('-1'); + expect(await this.safeCast[`$toInt${bits}`](-1)).to.be.bignumber.equal('-1'); }); it(`downcasts -2^${bits - 1} (${minValue})`, async function () { - expect(await this.safeCast[`toInt${bits}`](minValue)).to.be.bignumber.equal(minValue); + expect(await this.safeCast[`$toInt${bits}`](minValue)).to.be.bignumber.equal(minValue); }); it(`downcasts 2^${bits - 1} - 1 (${maxValue})`, async function () { - expect(await this.safeCast[`toInt${bits}`](maxValue)).to.be.bignumber.equal(maxValue); + expect(await this.safeCast[`$toInt${bits}`](maxValue)).to.be.bignumber.equal(maxValue); }); it(`reverts when downcasting -2^${bits - 1} - 1 (${minValue.subn(1)})`, async function () { await expectRevert( - this.safeCast[`toInt${bits}`](minValue.subn(1)), + this.safeCast[`$toInt${bits}`](minValue.subn(1)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); it(`reverts when downcasting -2^${bits - 1} - 2 (${minValue.subn(2)})`, async function () { await expectRevert( - this.safeCast[`toInt${bits}`](minValue.subn(2)), + this.safeCast[`$toInt${bits}`](minValue.subn(2)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); it(`reverts when downcasting 2^${bits - 1} (${maxValue.addn(1)})`, async function () { await expectRevert( - this.safeCast[`toInt${bits}`](maxValue.addn(1)), + this.safeCast[`$toInt${bits}`](maxValue.addn(1)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); it(`reverts when downcasting 2^${bits - 1} + 1 (${maxValue.addn(2)})`, async function () { await expectRevert( - this.safeCast[`toInt${bits}`](maxValue.addn(2)), + this.safeCast[`$toInt${bits}`](maxValue.addn(2)), `SafeCast: value doesn't fit in ${bits} bits`, ); }); @@ -136,27 +136,27 @@ contract('SafeCast', async function () { const maxInt256 = new BN('2').pow(new BN(255)).subn(1); it('casts 0', async function () { - expect(await this.safeCast.toInt256(0)).to.be.bignumber.equal('0'); + expect(await this.safeCast.$toInt256(0)).to.be.bignumber.equal('0'); }); it('casts 1', async function () { - expect(await this.safeCast.toInt256(1)).to.be.bignumber.equal('1'); + expect(await this.safeCast.$toInt256(1)).to.be.bignumber.equal('1'); }); it(`casts INT256_MAX (${maxInt256})`, async function () { - expect(await this.safeCast.toInt256(maxInt256)).to.be.bignumber.equal(maxInt256); + expect(await this.safeCast.$toInt256(maxInt256)).to.be.bignumber.equal(maxInt256); }); it(`reverts when casting INT256_MAX + 1 (${maxInt256.addn(1)})`, async function () { await expectRevert( - this.safeCast.toInt256(maxInt256.addn(1)), + this.safeCast.$toInt256(maxInt256.addn(1)), 'SafeCast: value doesn\'t fit in an int256', ); }); it(`reverts when casting UINT256_MAX (${maxUint256})`, async function () { await expectRevert( - this.safeCast.toInt256(maxUint256), + this.safeCast.$toInt256(maxUint256), 'SafeCast: value doesn\'t fit in an int256', ); }); diff --git a/test/utils/math/SafeMath.test.js b/test/utils/math/SafeMath.test.js index 4c2cfe551..a74d7fb96 100644 --- a/test/utils/math/SafeMath.test.js +++ b/test/utils/math/SafeMath.test.js @@ -3,7 +3,8 @@ const { MAX_UINT256 } = constants; const { expect } = require('chai'); -const SafeMathMock = artifacts.require('SafeMathMock'); +const SafeMath = artifacts.require('$SafeMath'); +const SafeMathMemoryCheck = artifacts.require('$SafeMathMemoryCheck'); function expectStruct (value, expected) { for (const key in expected) { @@ -17,7 +18,7 @@ function expectStruct (value, expected) { contract('SafeMath', function () { beforeEach(async function () { - this.safeMath = await SafeMathMock.new(); + this.safeMath = await SafeMath.new(); }); async function testCommutative (fn, lhs, rhs, expected, ...extra) { @@ -46,14 +47,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - testCommutativeIterable(this.safeMath.tryAdd, a, b, { flag: true, value: a.add(b) }); + testCommutativeIterable(this.safeMath.$tryAdd, a, b, [ true, a.add(b) ]); }); it('reverts on addition overflow', async function () { const a = MAX_UINT256; const b = new BN('1'); - testCommutativeIterable(this.safeMath.tryAdd, a, b, { flag: false, value: '0' }); + testCommutativeIterable(this.safeMath.$tryAdd, a, b, [ false, '0' ]); }); }); @@ -62,14 +63,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - expectStruct(await this.safeMath.trySub(a, b), { flag: true, value: a.sub(b) }); + expectStruct(await this.safeMath.$trySub(a, b), [ true, a.sub(b) ]); }); it('reverts if subtraction result would be negative', async function () { const a = new BN('1234'); const b = new BN('5678'); - expectStruct(await this.safeMath.trySub(a, b), { flag: false, value: '0' }); + expectStruct(await this.safeMath.$trySub(a, b), [ false, '0' ]); }); }); @@ -78,21 +79,21 @@ contract('SafeMath', function () { const a = new BN('1234'); const b = new BN('5678'); - testCommutativeIterable(this.safeMath.tryMul, a, b, { flag: true, value: a.mul(b) }); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [ true, a.mul(b) ]); }); it('multiplies by zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - testCommutativeIterable(this.safeMath.tryMul, a, b, { flag: true, value: a.mul(b) }); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [ true, a.mul(b) ]); }); it('reverts on multiplication overflow', async function () { const a = MAX_UINT256; const b = new BN('2'); - testCommutativeIterable(this.safeMath.tryMul, a, b, { flag: false, value: '0' }); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [ false, '0' ]); }); }); @@ -101,28 +102,28 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryDiv(a, b), { flag: true, value: a.div(b) }); + expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); }); it('divides zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryDiv(a, b), { flag: true, value: a.div(b) }); + expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryDiv(a, b), { flag: true, value: a.div(b) }); + expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); }); it('reverts on division by zero', async function () { const a = new BN('5678'); const b = new BN('0'); - expectStruct(await this.safeMath.tryDiv(a, b), { flag: false, value: '0' }); + expectStruct(await this.safeMath.$tryDiv(a, b), [ false, '0' ]); }); }); @@ -132,28 +133,28 @@ contract('SafeMath', function () { const a = new BN('284'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryMod(a, b), { flag: true, value: a.mod(b) }); + expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); }); it('when the dividend is equal to the divisor', async function () { const a = new BN('5678'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryMod(a, b), { flag: true, value: a.mod(b) }); + expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); }); it('when the dividend is larger than the divisor', async function () { const a = new BN('7000'); const b = new BN('5678'); - expectStruct(await this.safeMath.tryMod(a, b), { flag: true, value: a.mod(b) }); + expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); }); it('when the dividend is a multiple of the divisor', async function () { const a = new BN('17034'); // 17034 == 5678 * 3 const b = new BN('5678'); - expectStruct(await this.safeMath.tryMod(a, b), { flag: true, value: a.mod(b) }); + expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); }); }); @@ -161,7 +162,7 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('0'); - expectStruct(await this.safeMath.tryMod(a, b), { flag: false, value: '0' }); + expectStruct(await this.safeMath.$tryMod(a, b), [ false, '0' ]); }); }); }); @@ -172,14 +173,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - await testCommutative(this.safeMath.doAdd, a, b, a.add(b)); + await testCommutative(this.safeMath.$add, a, b, a.add(b)); }); it('reverts on addition overflow', async function () { const a = MAX_UINT256; const b = new BN('1'); - await testFailsCommutative(this.safeMath.doAdd, a, b, undefined); + await testFailsCommutative(this.safeMath.$add, a, b, undefined); }); }); @@ -188,14 +189,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - expect(await this.safeMath.doSub(a, b)).to.be.bignumber.equal(a.sub(b)); + expect(await this.safeMath.$sub(a, b)).to.be.bignumber.equal(a.sub(b)); }); it('reverts if subtraction result would be negative', async function () { const a = new BN('1234'); const b = new BN('5678'); - await expectRevert.unspecified(this.safeMath.doSub(a, b)); + await expectRevert.unspecified(this.safeMath.$sub(a, b)); }); }); @@ -204,21 +205,21 @@ contract('SafeMath', function () { const a = new BN('1234'); const b = new BN('5678'); - await testCommutative(this.safeMath.doMul, a, b, a.mul(b)); + await testCommutative(this.safeMath.$mul, a, b, a.mul(b)); }); it('multiplies by zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - await testCommutative(this.safeMath.doMul, a, b, '0'); + await testCommutative(this.safeMath.$mul, a, b, '0'); }); it('reverts on multiplication overflow', async function () { const a = MAX_UINT256; const b = new BN('2'); - await testFailsCommutative(this.safeMath.doMul, a, b, undefined); + await testFailsCommutative(this.safeMath.$mul, a, b, undefined); }); }); @@ -227,28 +228,28 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.doDiv(a, b)).to.be.bignumber.equal(a.div(b)); + expect(await this.safeMath.$div(a, b)).to.be.bignumber.equal(a.div(b)); }); it('divides zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - expect(await this.safeMath.doDiv(a, b)).to.be.bignumber.equal('0'); + expect(await this.safeMath.$div(a, b)).to.be.bignumber.equal('0'); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.doDiv(a, b)).to.be.bignumber.equal('1'); + expect(await this.safeMath.$div(a, b)).to.be.bignumber.equal('1'); }); it('reverts on division by zero', async function () { const a = new BN('5678'); const b = new BN('0'); - await expectRevert.unspecified(this.safeMath.doDiv(a, b)); + await expectRevert.unspecified(this.safeMath.$div(a, b)); }); }); @@ -258,28 +259,28 @@ contract('SafeMath', function () { const a = new BN('284'); const b = new BN('5678'); - expect(await this.safeMath.doMod(a, b)).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.$mod(a, b)).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is equal to the divisor', async function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.doMod(a, b)).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.$mod(a, b)).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is larger than the divisor', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.doMod(a, b)).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.$mod(a, b)).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is a multiple of the divisor', async function () { const a = new BN('17034'); // 17034 == 5678 * 3 const b = new BN('5678'); - expect(await this.safeMath.doMod(a, b)).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.$mod(a, b)).to.be.bignumber.equal(a.mod(b)); }); }); @@ -287,7 +288,7 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('0'); - await expectRevert.unspecified(this.safeMath.doMod(a, b)); + await expectRevert.unspecified(this.safeMath.$mod(a, b)); }); }); }); @@ -298,14 +299,18 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - expect(await this.safeMath.subWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.sub(b)); + expect(await this.safeMath.methods['$sub(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.sub(b)); }); it('reverts if subtraction result would be negative', async function () { const a = new BN('1234'); const b = new BN('5678'); - await expectRevert(this.safeMath.subWithMessage(a, b, 'MyErrorMessage'), 'MyErrorMessage'); + await expectRevert( + this.safeMath.methods['$sub(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + 'MyErrorMessage', + ); }); }); @@ -314,28 +319,34 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.divWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.div(b)); + expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.div(b)); }); it('divides zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - expect(await this.safeMath.divWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal('0'); + expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal('0'); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.divWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal('1'); + expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal('1'); }); it('reverts on division by zero', async function () { const a = new BN('5678'); const b = new BN('0'); - await expectRevert(this.safeMath.divWithMessage(a, b, 'MyErrorMessage'), 'MyErrorMessage'); + await expectRevert( + this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + 'MyErrorMessage', + ); }); }); @@ -345,28 +356,32 @@ contract('SafeMath', function () { const a = new BN('284'); const b = new BN('5678'); - expect(await this.safeMath.modWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is equal to the divisor', async function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.modWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is larger than the divisor', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.modWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is a multiple of the divisor', async function () { const a = new BN('17034'); // 17034 == 5678 * 3 const b = new BN('5678'); - expect(await this.safeMath.modWithMessage(a, b, 'MyErrorMessage')).to.be.bignumber.equal(a.mod(b)); + expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) + .to.be.bignumber.equal(a.mod(b)); }); }); @@ -374,30 +389,37 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('0'); - await expectRevert(this.safeMath.modWithMessage(a, b, 'MyErrorMessage'), 'MyErrorMessage'); + await expectRevert( + this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + 'MyErrorMessage', + ); }); }); }); describe('memory leakage', function () { + beforeEach(async function () { + this.safeMathMemoryCheck = await SafeMathMemoryCheck.new(); + }); + it('add', async function () { - expect(await this.safeMath.addMemoryCheck()).to.be.bignumber.equal('0'); + expect(await this.safeMathMemoryCheck.$addMemoryCheck()).to.be.bignumber.equal('0'); }); it('sub', async function () { - expect(await this.safeMath.subMemoryCheck()).to.be.bignumber.equal('0'); + expect(await this.safeMathMemoryCheck.$subMemoryCheck()).to.be.bignumber.equal('0'); }); it('mul', async function () { - expect(await this.safeMath.mulMemoryCheck()).to.be.bignumber.equal('0'); + expect(await this.safeMathMemoryCheck.$mulMemoryCheck()).to.be.bignumber.equal('0'); }); it('div', async function () { - expect(await this.safeMath.divMemoryCheck()).to.be.bignumber.equal('0'); + expect(await this.safeMathMemoryCheck.$divMemoryCheck()).to.be.bignumber.equal('0'); }); it('mod', async function () { - expect(await this.safeMath.modMemoryCheck()).to.be.bignumber.equal('0'); + expect(await this.safeMathMemoryCheck.$modMemoryCheck()).to.be.bignumber.equal('0'); }); }); }); diff --git a/test/utils/math/SignedMath.test.js b/test/utils/math/SignedMath.test.js index f1bcc18b3..bbf492b20 100644 --- a/test/utils/math/SignedMath.test.js +++ b/test/utils/math/SignedMath.test.js @@ -2,33 +2,33 @@ const { BN, constants } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const { MIN_INT256, MAX_INT256 } = constants; -const SignedMathMock = artifacts.require('SignedMathMock'); +const SignedMath = artifacts.require('$SignedMath'); contract('SignedMath', function () { const min = new BN('-1234'); const max = new BN('5678'); beforeEach(async function () { - this.math = await SignedMathMock.new(); + this.math = await SignedMath.new(); }); describe('max', function () { it('is correctly detected in first argument position', async function () { - expect(await this.math.max(max, min)).to.be.bignumber.equal(max); + expect(await this.math.$max(max, min)).to.be.bignumber.equal(max); }); it('is correctly detected in second argument position', async function () { - expect(await this.math.max(min, max)).to.be.bignumber.equal(max); + expect(await this.math.$max(min, max)).to.be.bignumber.equal(max); }); }); describe('min', function () { it('is correctly detected in first argument position', async function () { - expect(await this.math.min(min, max)).to.be.bignumber.equal(min); + expect(await this.math.$min(min, max)).to.be.bignumber.equal(min); }); it('is correctly detected in second argument position', async function () { - expect(await this.math.min(max, min)).to.be.bignumber.equal(min); + expect(await this.math.$min(max, min)).to.be.bignumber.equal(min); }); }); @@ -68,7 +68,7 @@ contract('SignedMath', function () { for (const x of valuesX) { for (const y of valuesY) { - expect(await this.math.average(x, y)) + expect(await this.math.$average(x, y)) .to.be.bignumber.equal(bnAverage(x, y), `Bad result for average(${x}, ${y})`); } } @@ -86,7 +86,7 @@ contract('SignedMath', function () { MAX_INT256, ]) { it(`correctly computes the absolute value of ${n}`, async function () { - expect(await this.math.abs(n)).to.be.bignumber.equal(n.abs()); + expect(await this.math.$abs(n)).to.be.bignumber.equal(n.abs()); }); } }); diff --git a/test/utils/math/SignedSafeMath.test.js b/test/utils/math/SignedSafeMath.test.js index c14d40be0..5702a4330 100644 --- a/test/utils/math/SignedSafeMath.test.js +++ b/test/utils/math/SignedSafeMath.test.js @@ -3,11 +3,11 @@ const { MAX_INT256, MIN_INT256 } = constants; const { expect } = require('chai'); -const SignedSafeMathMock = artifacts.require('SignedSafeMathMock'); +const SignedSafeMath = artifacts.require('$SignedSafeMath'); contract('SignedSafeMath', function () { beforeEach(async function () { - this.safeMath = await SignedSafeMathMock.new(); + this.safeMath = await SignedSafeMath.new(); }); async function testCommutative (fn, lhs, rhs, expected) { @@ -25,28 +25,28 @@ contract('SignedSafeMath', function () { const a = new BN('1234'); const b = new BN('5678'); - await testCommutative(this.safeMath.add, a, b, a.add(b)); + await testCommutative(this.safeMath.$add, a, b, a.add(b)); }); it('adds correctly if it does not overflow and the result is negative', async function () { const a = MAX_INT256; const b = MIN_INT256; - await testCommutative(this.safeMath.add, a, b, a.add(b)); + await testCommutative(this.safeMath.$add, a, b, a.add(b)); }); it('reverts on positive addition overflow', async function () { const a = MAX_INT256; const b = new BN('1'); - await testFailsCommutative(this.safeMath.add, a, b); + await testFailsCommutative(this.safeMath.$add, a, b); }); it('reverts on negative addition overflow', async function () { const a = MIN_INT256; const b = new BN('-1'); - await testFailsCommutative(this.safeMath.add, a, b); + await testFailsCommutative(this.safeMath.$add, a, b); }); }); @@ -55,7 +55,7 @@ contract('SignedSafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - const result = await this.safeMath.sub(a, b); + const result = await this.safeMath.$sub(a, b); expect(result).to.be.bignumber.equal(a.sub(b)); }); @@ -63,7 +63,7 @@ contract('SignedSafeMath', function () { const a = new BN('1234'); const b = new BN('5678'); - const result = await this.safeMath.sub(a, b); + const result = await this.safeMath.$sub(a, b); expect(result).to.be.bignumber.equal(a.sub(b)); }); @@ -71,14 +71,14 @@ contract('SignedSafeMath', function () { const a = MAX_INT256; const b = new BN('-1'); - await expectRevert.unspecified(this.safeMath.sub(a, b)); + await expectRevert.unspecified(this.safeMath.$sub(a, b)); }); it('reverts on negative subtraction overflow', async function () { const a = MIN_INT256; const b = new BN('1'); - await expectRevert.unspecified(this.safeMath.sub(a, b)); + await expectRevert.unspecified(this.safeMath.$sub(a, b)); }); }); @@ -87,28 +87,28 @@ contract('SignedSafeMath', function () { const a = new BN('5678'); const b = new BN('-1234'); - await testCommutative(this.safeMath.mul, a, b, a.mul(b)); + await testCommutative(this.safeMath.$mul, a, b, a.mul(b)); }); it('multiplies by zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - await testCommutative(this.safeMath.mul, a, b, '0'); + await testCommutative(this.safeMath.$mul, a, b, '0'); }); it('reverts on multiplication overflow, positive operands', async function () { const a = MAX_INT256; const b = new BN('2'); - await testFailsCommutative(this.safeMath.mul, a, b); + await testFailsCommutative(this.safeMath.$mul, a, b); }); it('reverts when minimum integer is multiplied by -1', async function () { const a = MIN_INT256; const b = new BN('-1'); - await testFailsCommutative(this.safeMath.mul, a, b); + await testFailsCommutative(this.safeMath.$mul, a, b); }); }); @@ -117,7 +117,7 @@ contract('SignedSafeMath', function () { const a = new BN('-5678'); const b = new BN('5678'); - const result = await this.safeMath.div(a, b); + const result = await this.safeMath.$div(a, b); expect(result).to.be.bignumber.equal(a.div(b)); }); @@ -125,28 +125,28 @@ contract('SignedSafeMath', function () { const a = new BN('0'); const b = new BN('5678'); - expect(await this.safeMath.div(a, b)).to.be.bignumber.equal('0'); + expect(await this.safeMath.$div(a, b)).to.be.bignumber.equal('0'); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.div(a, b)).to.be.bignumber.equal('1'); + expect(await this.safeMath.$div(a, b)).to.be.bignumber.equal('1'); }); it('reverts on division by zero', async function () { const a = new BN('-5678'); const b = new BN('0'); - await expectRevert.unspecified(this.safeMath.div(a, b)); + await expectRevert.unspecified(this.safeMath.$div(a, b)); }); it('reverts on overflow, negative second', async function () { const a = new BN(MIN_INT256); const b = new BN('-1'); - await expectRevert.unspecified(this.safeMath.div(a, b)); + await expectRevert.unspecified(this.safeMath.$div(a, b)); }); }); }); diff --git a/test/utils/structs/BitMap.test.js b/test/utils/structs/BitMap.test.js index 4d85bcfbf..8a1470c5c 100644 --- a/test/utils/structs/BitMap.test.js +++ b/test/utils/structs/BitMap.test.js @@ -1,7 +1,7 @@ const { BN } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const BitMap = artifacts.require('BitMapMock'); +const BitMap = artifacts.require('$BitMaps'); contract('BitMap', function () { const keyA = new BN('7891'); @@ -13,133 +13,133 @@ contract('BitMap', function () { }); it('starts empty', async function () { - expect(await this.bitmap.get(keyA)).to.equal(false); - expect(await this.bitmap.get(keyB)).to.equal(false); - expect(await this.bitmap.get(keyC)).to.equal(false); + expect(await this.bitmap.$get(0, keyA)).to.equal(false); + expect(await this.bitmap.$get(0, keyB)).to.equal(false); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); describe('setTo', function () { it('set a key to true', async function () { - await this.bitmap.setTo(keyA, true); - expect(await this.bitmap.get(keyA)).to.equal(true); - expect(await this.bitmap.get(keyB)).to.equal(false); - expect(await this.bitmap.get(keyC)).to.equal(false); + await this.bitmap.$setTo(0, keyA, true); + expect(await this.bitmap.$get(0, keyA)).to.equal(true); + expect(await this.bitmap.$get(0, keyB)).to.equal(false); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); it('set a key to false', async function () { - await this.bitmap.setTo(keyA, true); - await this.bitmap.setTo(keyA, false); - expect(await this.bitmap.get(keyA)).to.equal(false); - expect(await this.bitmap.get(keyB)).to.equal(false); - expect(await this.bitmap.get(keyC)).to.equal(false); + await this.bitmap.$setTo(0, keyA, true); + await this.bitmap.$setTo(0, keyA, false); + expect(await this.bitmap.$get(0, keyA)).to.equal(false); + expect(await this.bitmap.$get(0, keyB)).to.equal(false); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); it('set several consecutive keys', async function () { - await this.bitmap.setTo(keyA.addn(0), true); - await this.bitmap.setTo(keyA.addn(1), true); - await this.bitmap.setTo(keyA.addn(2), true); - await this.bitmap.setTo(keyA.addn(3), true); - await this.bitmap.setTo(keyA.addn(4), true); - await this.bitmap.setTo(keyA.addn(2), false); - await this.bitmap.setTo(keyA.addn(4), false); - expect(await this.bitmap.get(keyA.addn(0))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(1))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(2))).to.equal(false); - expect(await this.bitmap.get(keyA.addn(3))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(4))).to.equal(false); + await this.bitmap.$setTo(0, keyA.addn(0), true); + await this.bitmap.$setTo(0, keyA.addn(1), true); + await this.bitmap.$setTo(0, keyA.addn(2), true); + await this.bitmap.$setTo(0, keyA.addn(3), true); + await this.bitmap.$setTo(0, keyA.addn(4), true); + await this.bitmap.$setTo(0, keyA.addn(2), false); + await this.bitmap.$setTo(0, keyA.addn(4), false); + expect(await this.bitmap.$get(0, keyA.addn(0))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(1))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(2))).to.equal(false); + expect(await this.bitmap.$get(0, keyA.addn(3))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(4))).to.equal(false); }); }); describe('set', function () { it('adds a key', async function () { - await this.bitmap.set(keyA); - expect(await this.bitmap.get(keyA)).to.equal(true); - expect(await this.bitmap.get(keyB)).to.equal(false); - expect(await this.bitmap.get(keyC)).to.equal(false); + await this.bitmap.$set(0, keyA); + expect(await this.bitmap.$get(0, keyA)).to.equal(true); + expect(await this.bitmap.$get(0, keyB)).to.equal(false); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); it('adds several keys', async function () { - await this.bitmap.set(keyA); - await this.bitmap.set(keyB); - expect(await this.bitmap.get(keyA)).to.equal(true); - expect(await this.bitmap.get(keyB)).to.equal(true); - expect(await this.bitmap.get(keyC)).to.equal(false); + await this.bitmap.$set(0, keyA); + await this.bitmap.$set(0, keyB); + expect(await this.bitmap.$get(0, keyA)).to.equal(true); + expect(await this.bitmap.$get(0, keyB)).to.equal(true); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); it('adds several consecutive keys', async function () { - await this.bitmap.set(keyA.addn(0)); - await this.bitmap.set(keyA.addn(1)); - await this.bitmap.set(keyA.addn(3)); - expect(await this.bitmap.get(keyA.addn(0))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(1))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(2))).to.equal(false); - expect(await this.bitmap.get(keyA.addn(3))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(4))).to.equal(false); + await this.bitmap.$set(0, keyA.addn(0)); + await this.bitmap.$set(0, keyA.addn(1)); + await this.bitmap.$set(0, keyA.addn(3)); + expect(await this.bitmap.$get(0, keyA.addn(0))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(1))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(2))).to.equal(false); + expect(await this.bitmap.$get(0, keyA.addn(3))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(4))).to.equal(false); }); }); describe('unset', function () { it('removes added keys', async function () { - await this.bitmap.set(keyA); - await this.bitmap.set(keyB); - await this.bitmap.unset(keyA); - expect(await this.bitmap.get(keyA)).to.equal(false); - expect(await this.bitmap.get(keyB)).to.equal(true); - expect(await this.bitmap.get(keyC)).to.equal(false); + await this.bitmap.$set(0, keyA); + await this.bitmap.$set(0, keyB); + await this.bitmap.$unset(0, keyA); + expect(await this.bitmap.$get(0, keyA)).to.equal(false); + expect(await this.bitmap.$get(0, keyB)).to.equal(true); + expect(await this.bitmap.$get(0, keyC)).to.equal(false); }); it('removes consecutive added keys', async function () { - await this.bitmap.set(keyA.addn(0)); - await this.bitmap.set(keyA.addn(1)); - await this.bitmap.set(keyA.addn(3)); - await this.bitmap.unset(keyA.addn(1)); - expect(await this.bitmap.get(keyA.addn(0))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(1))).to.equal(false); - expect(await this.bitmap.get(keyA.addn(2))).to.equal(false); - expect(await this.bitmap.get(keyA.addn(3))).to.equal(true); - expect(await this.bitmap.get(keyA.addn(4))).to.equal(false); + await this.bitmap.$set(0, keyA.addn(0)); + await this.bitmap.$set(0, keyA.addn(1)); + await this.bitmap.$set(0, keyA.addn(3)); + await this.bitmap.$unset(0, keyA.addn(1)); + expect(await this.bitmap.$get(0, keyA.addn(0))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(1))).to.equal(false); + expect(await this.bitmap.$get(0, keyA.addn(2))).to.equal(false); + expect(await this.bitmap.$get(0, keyA.addn(3))).to.equal(true); + expect(await this.bitmap.$get(0, keyA.addn(4))).to.equal(false); }); it('adds and removes multiple keys', async function () { // [] - await this.bitmap.set(keyA); - await this.bitmap.set(keyC); + await this.bitmap.$set(0, keyA); + await this.bitmap.$set(0, keyC); // [A, C] - await this.bitmap.unset(keyA); - await this.bitmap.unset(keyB); + await this.bitmap.$unset(0, keyA); + await this.bitmap.$unset(0, keyB); // [C] - await this.bitmap.set(keyB); + await this.bitmap.$set(0, keyB); // [C, B] - await this.bitmap.set(keyA); - await this.bitmap.unset(keyC); + await this.bitmap.$set(0, keyA); + await this.bitmap.$unset(0, keyC); // [A, B] - await this.bitmap.set(keyA); - await this.bitmap.set(keyB); + await this.bitmap.$set(0, keyA); + await this.bitmap.$set(0, keyB); // [A, B] - await this.bitmap.set(keyC); - await this.bitmap.unset(keyA); + await this.bitmap.$set(0, keyC); + await this.bitmap.$unset(0, keyA); // [B, C] - await this.bitmap.set(keyA); - await this.bitmap.unset(keyB); + await this.bitmap.$set(0, keyA); + await this.bitmap.$unset(0, keyB); // [A, C] - expect(await this.bitmap.get(keyA)).to.equal(true); - expect(await this.bitmap.get(keyB)).to.equal(false); - expect(await this.bitmap.get(keyC)).to.equal(true); + expect(await this.bitmap.$get(0, keyA)).to.equal(true); + expect(await this.bitmap.$get(0, keyB)).to.equal(false); + expect(await this.bitmap.$get(0, keyC)).to.equal(true); }); }); }); diff --git a/test/utils/structs/DoubleEndedQueue.test.js b/test/utils/structs/DoubleEndedQueue.test.js index 667df77ca..8900663d8 100644 --- a/test/utils/structs/DoubleEndedQueue.test.js +++ b/test/utils/structs/DoubleEndedQueue.test.js @@ -1,14 +1,12 @@ const { expectEvent } = require('@openzeppelin/test-helpers'); const { expectRevertCustomError } = require('../../helpers/customError'); -const Bytes32DequeMock = artifacts.require('Bytes32DequeMock'); +const DoubleEndedQueue = artifacts.require('$DoubleEndedQueue'); /** Rebuild the content of the deque as a JS array. */ -async function getContent (deque) { - const length = await deque.length().then(bn => bn.toNumber()); - const values = await Promise.all(Array(length).fill().map((_, i) => deque.at(i))); - return values; -} +const getContent = (deque) => deque.$length(0).then(bn => + Promise.all(Array(bn.toNumber()).fill().map((_, i) => deque.$at(0, i))), +); contract('DoubleEndedQueue', function () { const bytesA = '0xdeadbeef'.padEnd(66, '0'); @@ -17,53 +15,53 @@ contract('DoubleEndedQueue', function () { const bytesD = '0x171717'.padEnd(66, '0'); beforeEach(async function () { - this.deque = await Bytes32DequeMock.new(); + this.deque = await DoubleEndedQueue.new(); }); describe('when empty', function () { it('getters', async function () { - expect(await this.deque.empty()).to.be.equal(true); + expect(await this.deque.$empty(0)).to.be.equal(true); expect(await getContent(this.deque)).to.have.ordered.members([]); }); it('reverts on accesses', async function () { - await expectRevertCustomError(this.deque.popBack(), 'Empty()'); - await expectRevertCustomError(this.deque.popFront(), 'Empty()'); - await expectRevertCustomError(this.deque.back(), 'Empty()'); - await expectRevertCustomError(this.deque.front(), 'Empty()'); + await expectRevertCustomError(this.deque.$popBack(0), 'Empty()'); + await expectRevertCustomError(this.deque.$popFront(0), 'Empty()'); + await expectRevertCustomError(this.deque.$back(0), 'Empty()'); + await expectRevertCustomError(this.deque.$front(0), 'Empty()'); }); }); describe('when not empty', function () { beforeEach(async function () { - await this.deque.pushBack(bytesB); - await this.deque.pushFront(bytesA); - await this.deque.pushBack(bytesC); + await this.deque.$pushBack(0, bytesB); + await this.deque.$pushFront(0, bytesA); + await this.deque.$pushBack(0, bytesC); this.content = [ bytesA, bytesB, bytesC ]; }); it('getters', async function () { - expect(await this.deque.empty()).to.be.equal(false); - expect(await this.deque.length()).to.be.bignumber.equal(this.content.length.toString()); - expect(await this.deque.front()).to.be.equal(this.content[0]); - expect(await this.deque.back()).to.be.equal(this.content[this.content.length - 1]); + expect(await this.deque.$empty(0)).to.be.equal(false); + expect(await this.deque.$length(0)).to.be.bignumber.equal(this.content.length.toString()); + expect(await this.deque.$front(0)).to.be.equal(this.content[0]); + expect(await this.deque.$back(0)).to.be.equal(this.content[this.content.length - 1]); expect(await getContent(this.deque)).to.have.ordered.members(this.content); }); it('out of bounds access', async function () { - await expectRevertCustomError(this.deque.at(this.content.length), 'OutOfBounds()'); + await expectRevertCustomError(this.deque.$at(0, this.content.length), 'OutOfBounds()'); }); describe('push', function () { it('front', async function () { - await this.deque.pushFront(bytesD); + await this.deque.$pushFront(0, bytesD); this.content.unshift(bytesD); // add element at the beginning expect(await getContent(this.deque)).to.have.ordered.members(this.content); }); it('back', async function () { - await this.deque.pushBack(bytesD); + await this.deque.$pushBack(0, bytesD); this.content.push(bytesD); // add element at the end expect(await getContent(this.deque)).to.have.ordered.members(this.content); @@ -73,23 +71,23 @@ contract('DoubleEndedQueue', function () { describe('pop', function () { it('front', async function () { const value = this.content.shift(); // remove first element - expectEvent(await this.deque.popFront(), 'OperationResult', { value }); + expectEvent(await this.deque.$popFront(0), 'return$popFront', { value }); expect(await getContent(this.deque)).to.have.ordered.members(this.content); }); it('back', async function () { const value = this.content.pop(); // remove last element - expectEvent(await this.deque.popBack(), 'OperationResult', { value }); + expectEvent(await this.deque.$popBack(0), 'return$popBack', { value }); expect(await getContent(this.deque)).to.have.ordered.members(this.content); }); }); it('clear', async function () { - await this.deque.clear(); + await this.deque.$clear(0); - expect(await this.deque.empty()).to.be.equal(true); + expect(await this.deque.$empty(0)).to.be.equal(true); expect(await getContent(this.deque)).to.have.ordered.members([]); }); }); diff --git a/test/utils/structs/EnumerableMap.behavior.js b/test/utils/structs/EnumerableMap.behavior.js index b1d0d0dce..4d698f334 100644 --- a/test/utils/structs/EnumerableMap.behavior.js +++ b/test/utils/structs/EnumerableMap.behavior.js @@ -3,21 +3,27 @@ const { expect } = require('chai'); const zip = require('lodash.zip'); -function shouldBehaveLikeMap (keys, values, zeroValue) { - const [keyA, keyB, keyC] = keys; - const [valueA, valueB, valueC] = values; +function shouldBehaveLikeMap ( + keys, + values, + zeroValue, + methods, + events, +) { + const [ keyA, keyB, keyC ] = keys; + const [ valueA, valueB, valueC ] = values; async function expectMembersMatch (map, keys, values) { expect(keys.length).to.equal(values.length); await Promise.all(keys.map(async key => - expect(await map.contains(key)).to.equal(true), + expect(await methods.contains(map, key)).to.equal(true), )); - expect(await map.length()).to.bignumber.equal(keys.length.toString()); + expect(await methods.length(map)).to.bignumber.equal(keys.length.toString()); expect( - (await Promise.all(keys.map(key => map.get(key)))).map(k => k.toString()), + (await Promise.all(keys.map(key => methods.get(map, key)))).map(k => k.toString()), ).to.have.same.members( values.map(value => value.toString()), ); @@ -25,48 +31,47 @@ function shouldBehaveLikeMap (keys, values, zeroValue) { // To compare key-value pairs, we zip keys and values, and convert BNs to // strings to workaround Chai limitations when dealing with nested arrays expect(await Promise.all([...Array(keys.length).keys()].map(async (index) => { - const entry = await map.at(index); - return [entry.key.toString(), entry.value.toString()]; + const entry = await methods.at(map, index); + return [ entry[0].toString(), entry[1].toString() ]; }))).to.have.same.deep.members( zip(keys.map(k => k.toString()), values.map(v => v.toString())), ); } it('starts empty', async function () { - expect(await this.map.contains(keyA)).to.equal(false); + expect(await methods.contains(this.map, keyA)).to.equal(false); await expectMembersMatch(this.map, [], []); }); describe('set', function () { it('adds a key', async function () { - const receipt = await this.map.set(keyA, valueA); - expectEvent(receipt, 'OperationResult', { result: true }); + const receipt = await methods.set(this.map, keyA, valueA); + expectEvent(receipt, events.setReturn, { ret0: true }); await expectMembersMatch(this.map, [keyA], [valueA]); }); it('adds several keys', async function () { - await this.map.set(keyA, valueA); - await this.map.set(keyB, valueB); + await methods.set(this.map, keyA, valueA); + await methods.set(this.map, keyB, valueB); await expectMembersMatch(this.map, [keyA, keyB], [valueA, valueB]); - expect(await this.map.contains(keyC)).to.equal(false); + expect(await methods.contains(this.map, keyC)).to.equal(false); }); it('returns false when adding keys already in the set', async function () { - await this.map.set(keyA, valueA); + await methods.set(this.map, keyA, valueA); - const receipt = (await this.map.set(keyA, valueA)); - expectEvent(receipt, 'OperationResult', { result: false }); + const receipt = await methods.set(this.map, keyA, valueA); + expectEvent(receipt, events.setReturn, { ret0: false }); await expectMembersMatch(this.map, [keyA], [valueA]); }); it('updates values for keys already in the set', async function () { - await this.map.set(keyA, valueA); - - await this.map.set(keyA, valueB); + await methods.set(this.map, keyA, valueA); + await methods.set(this.map, keyA, valueB); await expectMembersMatch(this.map, [keyA], [valueB]); }); @@ -74,101 +79,108 @@ function shouldBehaveLikeMap (keys, values, zeroValue) { describe('remove', function () { it('removes added keys', async function () { - await this.map.set(keyA, valueA); + await methods.set(this.map, keyA, valueA); - const receipt = await this.map.remove(keyA); - expectEvent(receipt, 'OperationResult', { result: true }); + const receipt = await methods.remove(this.map, keyA); + expectEvent(receipt, events.removeReturn, { ret0: true }); - expect(await this.map.contains(keyA)).to.equal(false); + expect(await methods.contains(this.map, keyA)).to.equal(false); await expectMembersMatch(this.map, [], []); }); it('returns false when removing keys not in the set', async function () { - const receipt = await this.map.remove(keyA); - expectEvent(receipt, 'OperationResult', { result: false }); + const receipt = await methods.remove(this.map, keyA); + expectEvent(receipt, events.removeReturn, { ret0: false }); - expect(await this.map.contains(keyA)).to.equal(false); + expect(await methods.contains(this.map, keyA)).to.equal(false); }); it('adds and removes multiple keys', async function () { // [] - await this.map.set(keyA, valueA); - await this.map.set(keyC, valueC); + await methods.set(this.map, keyA, valueA); + await methods.set(this.map, keyC, valueC); // [A, C] - await this.map.remove(keyA); - await this.map.remove(keyB); + await methods.remove(this.map, keyA); + await methods.remove(this.map, keyB); // [C] - await this.map.set(keyB, valueB); + await methods.set(this.map, keyB, valueB); // [C, B] - await this.map.set(keyA, valueA); - await this.map.remove(keyC); + await methods.set(this.map, keyA, valueA); + await methods.remove(this.map, keyC); // [A, B] - await this.map.set(keyA, valueA); - await this.map.set(keyB, valueB); + await methods.set(this.map, keyA, valueA); + await methods.set(this.map, keyB, valueB); // [A, B] - await this.map.set(keyC, valueC); - await this.map.remove(keyA); + await methods.set(this.map, keyC, valueC); + await methods.remove(this.map, keyA); // [B, C] - await this.map.set(keyA, valueA); - await this.map.remove(keyB); + await methods.set(this.map, keyA, valueA); + await methods.remove(this.map, keyB); // [A, C] await expectMembersMatch(this.map, [keyA, keyC], [valueA, valueC]); - expect(await this.map.contains(keyB)).to.equal(false); + expect(await methods.contains(this.map, keyA)).to.equal(true); + expect(await methods.contains(this.map, keyB)).to.equal(false); + expect(await methods.contains(this.map, keyC)).to.equal(true); }); }); describe('read', function () { beforeEach(async function () { - await this.map.set(keyA, valueA); + await methods.set(this.map, keyA, valueA); }); describe('get', function () { it('existing value', async function () { expect( - (await this.map.get(keyA)).toString(), + await methods.get(this.map, keyA).then(r => r.toString()), ).to.be.equal(valueA.toString()); }); it('missing value', async function () { - await expectRevert(this.map.get(keyB), 'EnumerableMap: nonexistent key'); + await expectRevert( + methods.get(this.map, keyB), + 'EnumerableMap: nonexistent key', + ); }); }); describe('get with message', function () { it('existing value', async function () { expect( - (await this.map.getWithMessage(keyA, 'custom error string')) - .toString(), + await methods.getWithMessage(this.map, keyA, 'custom error string').then(r => r.toString()), ).to.be.equal(valueA.toString()); }); it('missing value', async function () { - await expectRevert(this.map.getWithMessage(keyB, 'custom error string'), 'custom error string'); + await expectRevert( + methods.getWithMessage(this.map, keyB, 'custom error string'), + 'custom error string', + ); }); }); describe('tryGet', function () { it('existing value', async function () { - const result = await this.map.tryGet(keyA); + const result = await methods.tryGet(this.map, keyA); expect(result['0']).to.be.equal(true); expect(result['1'].toString()).to.be.equal(valueA.toString()); }); it('missing value', async function () { - const result = await this.map.tryGet(keyB); + const result = await methods.tryGet(this.map, keyB); expect(result['0']).to.be.equal(false); expect(result['1'].toString()).to.be.equal(zeroValue.toString()); }); diff --git a/test/utils/structs/EnumerableMap.test.js b/test/utils/structs/EnumerableMap.test.js index 58f4eb861..2587f7595 100644 --- a/test/utils/structs/EnumerableMap.test.js +++ b/test/utils/structs/EnumerableMap.test.js @@ -1,13 +1,14 @@ const { BN, constants } = require('@openzeppelin/test-helpers'); +const { mapValues } = require('../../helpers/map-values'); -const AddressToUintMapMock = artifacts.require('AddressToUintMapMock'); -const UintToAddressMapMock = artifacts.require('UintToAddressMapMock'); -const Bytes32ToBytes32MapMock = artifacts.require('Bytes32ToBytes32MapMock'); -const UintToUintMapMock = artifacts.require('UintToUintMapMock'); -const Bytes32ToUintMapMock = artifacts.require('Bytes32ToUintMapMock'); +const EnumerableMap = artifacts.require('$EnumerableMap'); const { shouldBehaveLikeMap } = require('./EnumerableMap.behavior'); +const getMethods = (ms) => { + return mapValues(ms, m => (self, ...args) => self.methods[m](0, ...args)); +}; + contract('EnumerableMap', function (accounts) { const [ accountA, accountB, accountC ] = accounts; @@ -19,68 +20,122 @@ contract('EnumerableMap', function (accounts) { const bytesB = '0x0123456789'.padEnd(66, '0'); const bytesC = '0x42424242'.padEnd(66, '0'); + beforeEach(async function () { + this.map = await EnumerableMap.new(); + }); + // AddressToUintMap describe('AddressToUintMap', function () { - beforeEach(async function () { - this.map = await AddressToUintMapMock.new(); - }); - shouldBehaveLikeMap( [ accountA, accountB, accountC ], [ keyA, keyB, keyC ], new BN('0'), + getMethods({ + set: '$set(uint256,address,uint256)', + get: '$get(uint256,address)', + getWithMessage: '$get(uint256,address,string)', + tryGet: '$tryGet(uint256,address)', + remove: '$remove(uint256,address)', + length: '$length_EnumerableMap_AddressToUintMap(uint256)', + at: '$at_EnumerableMap_AddressToUintMap(uint256,uint256)', + contains: '$contains(uint256,address)', + }), + { + setReturn: 'return$set_EnumerableMap_AddressToUintMap_address_uint256', + removeReturn: 'return$remove_EnumerableMap_AddressToUintMap_address', + }, ); }); // UintToAddressMap describe('UintToAddressMap', function () { - beforeEach(async function () { - this.map = await UintToAddressMapMock.new(); - }); - shouldBehaveLikeMap( [ keyA, keyB, keyC ], [ accountA, accountB, accountC ], constants.ZERO_ADDRESS, + getMethods({ + set: '$set(uint256,uint256,address)', + get: '$get_EnumerableMap_UintToAddressMap(uint256,uint256)', + getWithMessage: '$get_EnumerableMap_UintToAddressMap(uint256,uint256,string)', + tryGet: '$tryGet_EnumerableMap_UintToAddressMap(uint256,uint256)', + remove: '$remove_EnumerableMap_UintToAddressMap(uint256,uint256)', + length: '$length_EnumerableMap_UintToAddressMap(uint256)', + at: '$at_EnumerableMap_UintToAddressMap(uint256,uint256)', + contains: '$contains_EnumerableMap_UintToAddressMap(uint256,uint256)', + }), + { + setReturn: 'return$set_EnumerableMap_UintToAddressMap_uint256_address', + removeReturn: 'return$remove_EnumerableMap_UintToAddressMap_uint256', + }, ); }); // Bytes32ToBytes32Map describe('Bytes32ToBytes32Map', function () { - beforeEach(async function () { - this.map = await Bytes32ToBytes32MapMock.new(); - }); - shouldBehaveLikeMap( [ keyA, keyB, keyC ].map(k => '0x' + k.toString(16).padEnd(64, '0')), [ bytesA, bytesB, bytesC ], constants.ZERO_BYTES32, + getMethods({ + set: '$set(uint256,bytes32,bytes32)', + get: '$get_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32)', + getWithMessage: '$get_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32,string)', + tryGet: '$tryGet_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32)', + remove: '$remove_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32)', + length: '$length_EnumerableMap_Bytes32ToBytes32Map(uint256)', + at: '$at_EnumerableMap_Bytes32ToBytes32Map(uint256,uint256)', + contains: '$contains_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32)', + }), + { + setReturn: 'return$set_EnumerableMap_Bytes32ToBytes32Map_bytes32_bytes32', + removeReturn: 'return$remove_EnumerableMap_Bytes32ToBytes32Map_bytes32', + }, ); }); // UintToUintMap describe('UintToUintMap', function () { - beforeEach(async function () { - this.map = await UintToUintMapMock.new(); - }); - shouldBehaveLikeMap( [ keyA, keyB, keyC ], [ keyA, keyB, keyC ].map(k => k.add(new BN('1332'))), new BN('0'), + getMethods({ + set: '$set(uint256,uint256,uint256)', + get: '$get_EnumerableMap_UintToUintMap(uint256,uint256)', + getWithMessage: '$get_EnumerableMap_UintToUintMap(uint256,uint256,string)', + tryGet: '$tryGet_EnumerableMap_UintToUintMap(uint256,uint256)', + remove: '$remove_EnumerableMap_UintToUintMap(uint256,uint256)', + length: '$length_EnumerableMap_UintToUintMap(uint256)', + at: '$at_EnumerableMap_UintToUintMap(uint256,uint256)', + contains: '$contains_EnumerableMap_UintToUintMap(uint256,uint256)', + }), + { + setReturn: 'return$set_EnumerableMap_UintToUintMap_uint256_uint256', + removeReturn: 'return$remove_EnumerableMap_UintToUintMap_uint256', + }, ); }); // Bytes32ToUintMap describe('Bytes32ToUintMap', function () { - beforeEach(async function () { - this.map = await Bytes32ToUintMapMock.new(); - }); - shouldBehaveLikeMap( [ bytesA, bytesB, bytesC ], [ keyA, keyB, keyC ], new BN('0'), + getMethods({ + set: '$set(uint256,bytes32,uint256)', + get: '$get_EnumerableMap_Bytes32ToUintMap(uint256,bytes32)', + getWithMessage: '$get_EnumerableMap_Bytes32ToUintMap(uint256,bytes32,string)', + tryGet: '$tryGet_EnumerableMap_Bytes32ToUintMap(uint256,bytes32)', + remove: '$remove_EnumerableMap_Bytes32ToUintMap(uint256,bytes32)', + length: '$length_EnumerableMap_Bytes32ToUintMap(uint256)', + at: '$at_EnumerableMap_Bytes32ToUintMap(uint256,uint256)', + contains: '$contains_EnumerableMap_Bytes32ToUintMap(uint256,bytes32)', + }), + { + setReturn: 'return$set_EnumerableMap_Bytes32ToUintMap_bytes32_uint256', + removeReturn: 'return$remove_EnumerableMap_Bytes32ToUintMap_bytes32', + }, ); }); }); diff --git a/test/utils/structs/EnumerableSet.behavior.js b/test/utils/structs/EnumerableSet.behavior.js index 17e086671..db56a2eca 100644 --- a/test/utils/structs/EnumerableSet.behavior.js +++ b/test/utils/structs/EnumerableSet.behavior.js @@ -1,24 +1,30 @@ const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -function shouldBehaveLikeSet (valueA, valueB, valueC) { +function shouldBehaveLikeSet ( + values, + methods, + events, +) { + const [ valueA, valueB, valueC ] = values; + async function expectMembersMatch (set, values) { - const contains = await Promise.all(values.map(value => set.contains(value))); + const contains = await Promise.all(values.map(value => methods.contains(set, value))); expect(contains.every(Boolean)).to.be.equal(true); - const length = await set.length(); + const length = await methods.length(set); expect(length).to.bignumber.equal(values.length.toString()); // To compare values we convert to strings to workaround Chai // limitations when dealing with nested arrays (required for BNs) - const indexedValues = await Promise.all(Array(values.length).fill().map((_, index) => set.at(index))); + const indexedValues = await Promise.all(Array(values.length).fill().map((_, index) => methods.at(set, index))); expect( indexedValues.map(v => v.toString()), ).to.have.same.members( values.map(v => v.toString()), ); - const returnedValues = await set.values(); + const returnedValues = await methods.values(set); expect( returnedValues.map(v => v.toString()), ).to.have.same.members( @@ -27,32 +33,32 @@ function shouldBehaveLikeSet (valueA, valueB, valueC) { } it('starts empty', async function () { - expect(await this.set.contains(valueA)).to.equal(false); + expect(await methods.contains(this.set, valueA)).to.equal(false); await expectMembersMatch(this.set, []); }); describe('add', function () { it('adds a value', async function () { - const receipt = await this.set.add(valueA); - expectEvent(receipt, 'OperationResult', { result: true }); + const receipt = await methods.add(this.set, valueA); + expectEvent(receipt, events.addReturn, { ret0: true }); await expectMembersMatch(this.set, [valueA]); }); it('adds several values', async function () { - await this.set.add(valueA); - await this.set.add(valueB); + await methods.add(this.set, valueA); + await methods.add(this.set, valueB); await expectMembersMatch(this.set, [valueA, valueB]); - expect(await this.set.contains(valueC)).to.equal(false); + expect(await methods.contains(this.set, valueC)).to.equal(false); }); it('returns false when adding values already in the set', async function () { - await this.set.add(valueA); + await methods.add(this.set, valueA); - const receipt = (await this.set.add(valueA)); - expectEvent(receipt, 'OperationResult', { result: false }); + const receipt = await methods.add(this.set, valueA); + expectEvent(receipt, events.addReturn, { ret0: false }); await expectMembersMatch(this.set, [valueA]); }); @@ -60,68 +66,68 @@ function shouldBehaveLikeSet (valueA, valueB, valueC) { describe('at', function () { it('reverts when retrieving non-existent elements', async function () { - await expectRevert.unspecified(this.set.at(0)); + await expectRevert.unspecified(methods.at(this.set, 0)); }); }); describe('remove', function () { it('removes added values', async function () { - await this.set.add(valueA); + await methods.add(this.set, valueA); - const receipt = await this.set.remove(valueA); - expectEvent(receipt, 'OperationResult', { result: true }); + const receipt = await methods.remove(this.set, valueA); + expectEvent(receipt, events.removeReturn, { ret0: true }); - expect(await this.set.contains(valueA)).to.equal(false); + expect(await methods.contains(this.set, valueA)).to.equal(false); await expectMembersMatch(this.set, []); }); it('returns false when removing values not in the set', async function () { - const receipt = await this.set.remove(valueA); - expectEvent(receipt, 'OperationResult', { result: false }); + const receipt = await methods.remove(this.set, valueA); + expectEvent(receipt, events.removeReturn, { ret0: false }); - expect(await this.set.contains(valueA)).to.equal(false); + expect(await methods.contains(this.set, valueA)).to.equal(false); }); it('adds and removes multiple values', async function () { // [] - await this.set.add(valueA); - await this.set.add(valueC); + await methods.add(this.set, valueA); + await methods.add(this.set, valueC); // [A, C] - await this.set.remove(valueA); - await this.set.remove(valueB); + await methods.remove(this.set, valueA); + await methods.remove(this.set, valueB); // [C] - await this.set.add(valueB); + await methods.add(this.set, valueB); // [C, B] - await this.set.add(valueA); - await this.set.remove(valueC); + await methods.add(this.set, valueA); + await methods.remove(this.set, valueC); // [A, B] - await this.set.add(valueA); - await this.set.add(valueB); + await methods.add(this.set, valueA); + await methods.add(this.set, valueB); // [A, B] - await this.set.add(valueC); - await this.set.remove(valueA); + await methods.add(this.set, valueC); + await methods.remove(this.set, valueA); // [B, C] - await this.set.add(valueA); - await this.set.remove(valueB); + await methods.add(this.set, valueA); + await methods.remove(this.set, valueB); // [A, C] await expectMembersMatch(this.set, [valueA, valueC]); - expect(await this.set.contains(valueB)).to.equal(false); + expect(await methods.contains(this.set, valueB)).to.equal(false); }); }); } diff --git a/test/utils/structs/EnumerableSet.test.js b/test/utils/structs/EnumerableSet.test.js index 2b7d0a3d6..27f1c731e 100644 --- a/test/utils/structs/EnumerableSet.test.js +++ b/test/utils/structs/EnumerableSet.test.js @@ -1,46 +1,71 @@ -const { BN } = require('@openzeppelin/test-helpers'); - -const EnumerableBytes32SetMock = artifacts.require('EnumerableBytes32SetMock'); -const EnumerableAddressSetMock = artifacts.require('EnumerableAddressSetMock'); -const EnumerableUintSetMock = artifacts.require('EnumerableUintSetMock'); +const EnumerableSet = artifacts.require('$EnumerableSet'); +const { mapValues } = require('../../helpers/map-values'); const { shouldBehaveLikeSet } = require('./EnumerableSet.behavior'); +const getMethods = (ms) => { + return mapValues(ms, m => (self, ...args) => self.methods[m](0, ...args)); +}; + contract('EnumerableSet', function (accounts) { + beforeEach(async function () { + this.set = await EnumerableSet.new(); + }); + // Bytes32Set describe('EnumerableBytes32Set', function () { - const bytesA = '0xdeadbeef'.padEnd(66, '0'); - const bytesB = '0x0123456789'.padEnd(66, '0'); - const bytesC = '0x42424242'.padEnd(66, '0'); - - beforeEach(async function () { - this.set = await EnumerableBytes32SetMock.new(); - }); - - shouldBehaveLikeSet(bytesA, bytesB, bytesC); + shouldBehaveLikeSet( + [ '0xdeadbeef', '0x0123456789', '0x42424242' ].map(e => e.padEnd(66, '0')), + getMethods({ + add: '$add(uint256,bytes32)', + remove: '$remove(uint256,bytes32)', + contains: '$contains(uint256,bytes32)', + length: '$length_EnumerableSet_Bytes32Set(uint256)', + at: '$at_EnumerableSet_Bytes32Set(uint256,uint256)', + values: '$values_EnumerableSet_Bytes32Set(uint256)', + }), + { + addReturn: 'return$add_EnumerableSet_Bytes32Set_bytes32', + removeReturn: 'return$remove_EnumerableSet_Bytes32Set_bytes32', + }, + ); }); // AddressSet describe('EnumerableAddressSet', function () { - const [accountA, accountB, accountC] = accounts; - - beforeEach(async function () { - this.set = await EnumerableAddressSetMock.new(); - }); - - shouldBehaveLikeSet(accountA, accountB, accountC); + shouldBehaveLikeSet( + accounts, + getMethods({ + add: '$add(uint256,address)', + remove: '$remove(uint256,address)', + contains: '$contains(uint256,address)', + length: '$length_EnumerableSet_AddressSet(uint256)', + at: '$at_EnumerableSet_AddressSet(uint256,uint256)', + values: '$values_EnumerableSet_AddressSet(uint256)', + }), + { + addReturn: 'return$add_EnumerableSet_AddressSet_address', + removeReturn: 'return$remove_EnumerableSet_AddressSet_address', + }, + ); }); // UintSet describe('EnumerableUintSet', function () { - const uintA = new BN('1234'); - const uintB = new BN('5678'); - const uintC = new BN('9101112'); - - beforeEach(async function () { - this.set = await EnumerableUintSetMock.new(); - }); - - shouldBehaveLikeSet(uintA, uintB, uintC); + shouldBehaveLikeSet( + [ 1234, 5678, 9101112 ].map(e => web3.utils.toBN(e)), + getMethods({ + add: '$add(uint256,uint256)', + remove: '$remove(uint256,uint256)', + contains: '$contains(uint256,uint256)', + length: '$length_EnumerableSet_UintSet(uint256)', + at: '$at_EnumerableSet_UintSet(uint256,uint256)', + values: '$values_EnumerableSet_UintSet(uint256)', + }), + { + addReturn: 'return$add_EnumerableSet_UintSet_uint256', + removeReturn: 'return$remove_EnumerableSet_UintSet_uint256', + }, + ); }); }); From 3a3c87b1a676f277c17a4601de56ddfc432d427d Mon Sep 17 00:00:00 2001 From: Saint Rat Wrongtail <36714477+saint-rat@users.noreply.github.com> Date: Wed, 4 Jan 2023 00:52:53 +1000 Subject: [PATCH 112/197] Fix docs for Math.log256 (#3916) --- contracts/utils/math/Math.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index f3a83b0ff..8400d0669 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -324,7 +324,7 @@ library Math { } /** - * @dev Return the log in base 10, following the selected rounding direction, of a positive value. + * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { From 2fc24fc8d4c3998de71d9d2319dd07db442d28eb Mon Sep 17 00:00:00 2001 From: Benjamin Date: Tue, 3 Jan 2023 16:30:51 +0100 Subject: [PATCH 113/197] Rename param to match the interface (#3917) --- contracts/token/common/ERC2981.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/token/common/ERC2981.sol b/contracts/token/common/ERC2981.sol index 84cb6b8de..f49cc8d98 100644 --- a/contracts/token/common/ERC2981.sol +++ b/contracts/token/common/ERC2981.sol @@ -40,14 +40,14 @@ abstract contract ERC2981 is IERC2981, ERC165 { /** * @inheritdoc IERC2981 */ - function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { - RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; + function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { + RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } - uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); + uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } From 88754d0b36cde4e6b1daab591058eaef449f5adb Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 3 Jan 2023 22:25:37 +0100 Subject: [PATCH 114/197] Add keys() accessor to EnumerableMaps (#3920) Co-authored-by: Francisco Giordano --- CHANGELOG.md | 1 + contracts/utils/structs/EnumerableMap.sol | 108 +++++++++++++++++-- scripts/generate/templates/EnumerableMap.js | 36 ++++++- test/utils/structs/EnumerableMap.behavior.js | 7 ++ test/utils/structs/EnumerableMap.test.js | 5 + 5 files changed, 147 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58f21d999..7f6a9be40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) * `MerkleProof`: optimize by using unchecked arithmetic. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) + * `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) ### Deprecations diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index d359671f4..8b188c734 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -156,6 +156,18 @@ library EnumerableMap { return value; } + /** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function keys(Bytes32ToBytes32Map storage map) internal view returns (bytes32[] memory) { + return map._keys.values(); + } + // UintToUintMap struct UintToUintMap { @@ -174,7 +186,7 @@ library EnumerableMap { } /** - * @dev Removes a value from a set. O(1). + * @dev Removes a value from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ @@ -197,7 +209,7 @@ library EnumerableMap { } /** - * @dev Returns the element stored at position `index` in the set. O(1). + * @dev Returns the element stored at position `index` in the map. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * @@ -240,6 +252,26 @@ library EnumerableMap { return uint256(get(map._inner, bytes32(key), errorMessage)); } + /** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function keys(UintToUintMap storage map) internal view returns (uint256[] memory) { + bytes32[] memory store = keys(map._inner); + uint256[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + // UintToAddressMap struct UintToAddressMap { @@ -258,7 +290,7 @@ library EnumerableMap { } /** - * @dev Removes a value from a set. O(1). + * @dev Removes a value from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ @@ -281,7 +313,7 @@ library EnumerableMap { } /** - * @dev Returns the element stored at position `index` in the set. O(1). + * @dev Returns the element stored at position `index` in the map. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * @@ -328,6 +360,26 @@ library EnumerableMap { return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage)))); } + /** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function keys(UintToAddressMap storage map) internal view returns (uint256[] memory) { + bytes32[] memory store = keys(map._inner); + uint256[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + // AddressToUintMap struct AddressToUintMap { @@ -346,7 +398,7 @@ library EnumerableMap { } /** - * @dev Removes a value from a set. O(1). + * @dev Removes a value from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ @@ -369,7 +421,7 @@ library EnumerableMap { } /** - * @dev Returns the element stored at position `index` in the set. O(1). + * @dev Returns the element stored at position `index` in the map. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * @@ -416,6 +468,26 @@ library EnumerableMap { return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage)); } + /** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function keys(AddressToUintMap storage map) internal view returns (address[] memory) { + bytes32[] memory store = keys(map._inner); + address[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } + // Bytes32ToUintMap struct Bytes32ToUintMap { @@ -434,7 +506,7 @@ library EnumerableMap { } /** - * @dev Removes a value from a set. O(1). + * @dev Removes a value from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ @@ -457,7 +529,7 @@ library EnumerableMap { } /** - * @dev Returns the element stored at position `index` in the set. O(1). + * @dev Returns the element stored at position `index` in the map. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * @@ -503,4 +575,24 @@ library EnumerableMap { ) internal view returns (uint256) { return uint256(get(map._inner, key, errorMessage)); } + + /** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function keys(Bytes32ToUintMap storage map) internal view returns (bytes32[] memory) { + bytes32[] memory store = keys(map._inner); + bytes32[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; + } } diff --git a/scripts/generate/templates/EnumerableMap.js b/scripts/generate/templates/EnumerableMap.js index ca8e0e77d..dbd502a0b 100644 --- a/scripts/generate/templates/EnumerableMap.js +++ b/scripts/generate/templates/EnumerableMap.js @@ -168,6 +168,18 @@ function get( require(value != 0 || contains(map, key), errorMessage); return value; } + +/** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ +function keys(Bytes32ToBytes32Map storage map) internal view returns (bytes32[] memory) { + return map._keys.values(); +} `; const customMap = ({ name, keyType, valueType }) => `\ @@ -193,7 +205,7 @@ function set( } /** - * @dev Removes a value from a set. O(1). + * @dev Removes a value from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ @@ -216,7 +228,7 @@ function length(${name} storage map) internal view returns (uint256) { } /** - * @dev Returns the element stored at position \`index\` in the set. O(1). + * @dev Returns the element stored at position \`index\` in the map. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * @@ -262,6 +274,26 @@ function get( ) internal view returns (${valueType}) { return ${fromBytes32(valueType, `get(map._inner, ${toBytes32(keyType, 'key')}, errorMessage)`)}; } + +/** + * @dev Return the an array containing all the keys + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block. + */ +function keys(${name} storage map) internal view returns (${keyType}[] memory) { + bytes32[] memory store = keys(map._inner); + ${keyType}[] memory result; + + /// @solidity memory-safe-assembly + assembly { + result := store + } + + return result; +} `; // GENERATE diff --git a/test/utils/structs/EnumerableMap.behavior.js b/test/utils/structs/EnumerableMap.behavior.js index 4d698f334..25ae84215 100644 --- a/test/utils/structs/EnumerableMap.behavior.js +++ b/test/utils/structs/EnumerableMap.behavior.js @@ -36,6 +36,13 @@ function shouldBehaveLikeMap ( }))).to.have.same.deep.members( zip(keys.map(k => k.toString()), values.map(v => v.toString())), ); + + // This also checks that both arrays have the same length + expect( + (await methods.keys(map)).map(k => k.toString()), + ).to.have.same.members( + keys.map(key => key.toString()), + ); } it('starts empty', async function () { diff --git a/test/utils/structs/EnumerableMap.test.js b/test/utils/structs/EnumerableMap.test.js index 2587f7595..14f31b429 100644 --- a/test/utils/structs/EnumerableMap.test.js +++ b/test/utils/structs/EnumerableMap.test.js @@ -39,6 +39,7 @@ contract('EnumerableMap', function (accounts) { length: '$length_EnumerableMap_AddressToUintMap(uint256)', at: '$at_EnumerableMap_AddressToUintMap(uint256,uint256)', contains: '$contains(uint256,address)', + keys: '$keys_EnumerableMap_AddressToUintMap(uint256)', }), { setReturn: 'return$set_EnumerableMap_AddressToUintMap_address_uint256', @@ -62,6 +63,7 @@ contract('EnumerableMap', function (accounts) { length: '$length_EnumerableMap_UintToAddressMap(uint256)', at: '$at_EnumerableMap_UintToAddressMap(uint256,uint256)', contains: '$contains_EnumerableMap_UintToAddressMap(uint256,uint256)', + keys: '$keys_EnumerableMap_UintToAddressMap(uint256)', }), { setReturn: 'return$set_EnumerableMap_UintToAddressMap_uint256_address', @@ -85,6 +87,7 @@ contract('EnumerableMap', function (accounts) { length: '$length_EnumerableMap_Bytes32ToBytes32Map(uint256)', at: '$at_EnumerableMap_Bytes32ToBytes32Map(uint256,uint256)', contains: '$contains_EnumerableMap_Bytes32ToBytes32Map(uint256,bytes32)', + keys: '$keys_EnumerableMap_Bytes32ToBytes32Map(uint256)', }), { setReturn: 'return$set_EnumerableMap_Bytes32ToBytes32Map_bytes32_bytes32', @@ -108,6 +111,7 @@ contract('EnumerableMap', function (accounts) { length: '$length_EnumerableMap_UintToUintMap(uint256)', at: '$at_EnumerableMap_UintToUintMap(uint256,uint256)', contains: '$contains_EnumerableMap_UintToUintMap(uint256,uint256)', + keys: '$keys_EnumerableMap_UintToUintMap(uint256)', }), { setReturn: 'return$set_EnumerableMap_UintToUintMap_uint256_uint256', @@ -131,6 +135,7 @@ contract('EnumerableMap', function (accounts) { length: '$length_EnumerableMap_Bytes32ToUintMap(uint256)', at: '$at_EnumerableMap_Bytes32ToUintMap(uint256,uint256)', contains: '$contains_EnumerableMap_Bytes32ToUintMap(uint256,bytes32)', + keys: '$keys_EnumerableMap_Bytes32ToUintMap(uint256)', }), { setReturn: 'return$set_EnumerableMap_Bytes32ToUintMap_bytes32_uint256', From a28aafdc85a592776544f7978c6b1a462d28ede2 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 4 Jan 2023 11:03:40 -0300 Subject: [PATCH 115/197] Use Prettier for JS files (#3913) Co-authored-by: Hadrien Croubois --- .prettierrc | 5 +- .solcover.js | 26 +- docs/templates/helpers.js | 16 +- docs/templates/properties.js | 10 +- hardhat.config.js | 7 +- hardhat/ignore-unreachable-warnings.js | 4 +- hardhat/skip-foundry-tests.js | 7 +- package-lock.json | 2 +- package.json | 12 +- scripts/checks/compareGasReports.js | 176 ++++++----- scripts/checks/inheritance-ordering.js | 38 ++- scripts/gen-nav.js | 16 +- scripts/generate/format-lines.js | 8 +- scripts/generate/run.js | 10 +- scripts/generate/templates/Checkpoints.js | 10 +- scripts/generate/templates/EnumerableSet.js | 5 +- scripts/generate/templates/SafeCast.js | 97 +++--- scripts/generate/templates/conversion.js | 36 +-- scripts/helpers.js | 23 +- scripts/migrate-imports.js | 12 +- scripts/release/synchronize-versions.js | 2 +- .../release/update-changelog-release-date.js | 5 +- scripts/release/update-comment.js | 2 +- scripts/remove-ignored-artifacts.js | 6 +- scripts/update-docs-branch.js | 14 +- test/access/AccessControl.behavior.js | 18 +- test/access/AccessControl.test.js | 5 +- test/access/AccessControlCrossChain.test.js | 28 +- test/access/Ownable.test.js | 12 +- test/crosschain/CrossChainEnabled.test.js | 20 +- test/finance/PaymentSplitter.test.js | 85 +++-- test/finance/VestingWallet.behavior.js | 39 +-- test/finance/VestingWallet.test.js | 18 +- test/governance/Governor.test.js | 297 +++++++++--------- test/governance/TimelockController.test.js | 200 +++++------- .../GovernorCompatibilityBravo.test.js | 122 +++---- .../extensions/GovernorComp.test.js | 19 +- .../extensions/GovernorERC721.test.js | 61 ++-- .../GovernorPreventLateQuorum.test.js | 80 +++-- .../GovernorTimelockCompound.test.js | 193 +++++------- .../GovernorTimelockControl.test.js | 174 +++++----- .../GovernorVotesQuorumFraction.test.js | 92 +++--- .../extensions/GovernorWithParams.test.js | 48 +-- test/governance/utils/Votes.behavior.js | 106 ++++--- test/governance/utils/Votes.test.js | 11 +- test/helpers/chainid.js | 2 +- test/helpers/create2.js | 13 +- test/helpers/crosschain.js | 54 ++-- test/helpers/customError.js | 6 +- test/helpers/eip712.js | 16 +- test/helpers/enums.js | 27 +- test/helpers/erc1967.js | 4 +- test/helpers/governance.js | 177 +++++------ test/helpers/sign.js | 48 +-- test/helpers/txpool.js | 10 +- test/metatx/MinimalForwarder.test.js | 48 ++- test/migrate-imports.test.js | 5 +- test/proxy/Clones.behaviour.js | 44 +-- test/proxy/Clones.test.js | 26 +- test/proxy/Proxy.behaviour.js | 15 +- test/proxy/beacon/BeaconProxy.test.js | 31 +- test/proxy/beacon/UpgradeableBeacon.test.js | 10 +- test/proxy/transparent/ProxyAdmin.test.js | 18 +- .../TransparentUpgradeableProxy.behaviour.js | 41 ++- test/proxy/utils/UUPSUpgradeable.test.js | 10 +- test/security/Pausable.test.js | 14 +- test/security/PullPayment.test.js | 2 +- test/security/ReentrancyGuard.test.js | 11 +- test/token/ERC1155/ERC1155.behavior.js | 291 +++++++++-------- test/token/ERC1155/ERC1155.test.js | 53 +--- .../extensions/ERC1155Burnable.test.js | 16 +- .../extensions/ERC1155Pausable.test.js | 8 +- .../ERC1155/extensions/ERC1155Supply.test.js | 16 +- .../extensions/ERC1155URIStorage.test.js | 2 +- .../presets/ERC1155PresetMinterPauser.test.js | 38 ++- .../token/ERC1155/utils/ERC1155Holder.test.js | 12 +- test/token/ERC20/ERC20.behavior.js | 97 +++--- test/token/ERC20/ERC20.test.js | 67 ++-- .../extensions/ERC20Burnable.behavior.js | 19 +- .../ERC20/extensions/ERC20Burnable.test.js | 2 +- .../ERC20/extensions/ERC20Capped.behavior.js | 2 +- .../ERC20/extensions/ERC20FlashMint.test.js | 93 +++++- .../ERC20/extensions/ERC20Pausable.test.js | 18 +- .../ERC20/extensions/ERC20Snapshot.test.js | 26 +- .../token/ERC20/extensions/ERC20Votes.test.js | 249 +++++++++------ .../ERC20/extensions/ERC20VotesComp.test.js | 231 ++++++++------ .../ERC20/extensions/ERC20Wrapper.test.js | 2 +- test/token/ERC20/extensions/ERC4626.test.js | 8 +- .../extensions/draft-ERC20Permit.test.js | 11 +- .../presets/ERC20PresetMinterPauser.test.js | 7 +- test/token/ERC20/utils/SafeERC20.test.js | 34 +- test/token/ERC20/utils/TokenTimelock.test.js | 2 +- test/token/ERC721/ERC721.behavior.js | 197 +++++------- test/token/ERC721/ERC721.test.js | 5 +- .../ERC721/extensions/ERC721Burnable.test.js | 13 +- .../extensions/ERC721Consecutive.test.js | 93 +++--- .../ERC721/extensions/ERC721Pausable.test.js | 19 +- .../ERC721/extensions/ERC721Royalty.test.js | 2 +- .../extensions/ERC721URIStorage.test.js | 17 +- .../ERC721/extensions/ERC721Votes.test.js | 24 +- .../ERC721PresetMinterPauserAutoId.test.js | 7 +- test/token/ERC721/utils/ERC721Holder.test.js | 2 +- test/token/ERC777/ERC777.behavior.js | 146 ++++++--- test/token/ERC777/ERC777.test.js | 105 ++----- test/token/common/ERC2981.behavior.js | 7 +- test/utils/Address.test.js | 104 +++--- test/utils/Arrays.test.js | 24 +- test/utils/Checkpoints.test.js | 45 +-- test/utils/Context.behavior.js | 2 +- test/utils/Context.test.js | 2 +- test/utils/Create2.test.js | 67 ++-- test/utils/Multicall.test.js | 35 ++- test/utils/Strings.test.js | 15 +- test/utils/cryptography/ECDSA.test.js | 177 +++++------ test/utils/cryptography/MerkleProof.test.js | 36 +-- .../cryptography/SignatureChecker.test.js | 72 ++--- test/utils/escrow/ConditionalEscrow.test.js | 5 +- test/utils/escrow/Escrow.behavior.js | 10 +- test/utils/escrow/Escrow.test.js | 2 +- test/utils/escrow/RefundEscrow.test.js | 47 ++- test/utils/introspection/ERC165.test.js | 4 +- .../utils/introspection/ERC165Checker.test.js | 23 +- .../utils/introspection/ERC165Storage.test.js | 4 +- .../introspection/ERC1820Implementer.test.js | 39 ++- .../SupportsInterface.behavior.js | 33 +- test/utils/math/Math.test.js | 98 +++--- test/utils/math/SafeCast.test.js | 24 +- test/utils/math/SafeMath.test.js | 80 ++--- test/utils/math/SignedMath.test.js | 8 +- test/utils/math/SignedSafeMath.test.js | 4 +- test/utils/structs/DoubleEndedQueue.test.js | 13 +- test/utils/structs/EnumerableMap.behavior.js | 65 ++-- test/utils/structs/EnumerableMap.test.js | 31 +- test/utils/structs/EnumerableSet.behavior.js | 26 +- test/utils/structs/EnumerableSet.test.js | 13 +- 135 files changed, 2737 insertions(+), 3121 deletions(-) diff --git a/.prettierrc b/.prettierrc index 923a710a6..e08e24273 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,12 +1,13 @@ { + "printWidth": 120, "singleQuote": true, "trailingComma": "all", + "arrowParens": "avoid", "overrides": [ { "files": "*.sol", "options": { - "singleQuote": false, - "printWidth": 120 + "singleQuote": false } } ] diff --git a/.solcover.js b/.solcover.js index 6cf991ef1..e0dea5e2c 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,15 +1,13 @@ module.exports = { - norpc: true, - testCommand: 'npm test', - compileCommand: 'npm run compile', - skipFiles: [ - 'mocks', - ], - providerOptions: { - default_balance_ether: '10000000000000000000000000', - }, - mocha: { - fgrep: '[skip-on-coverage]', - invert: true, - }, -} + norpc: true, + testCommand: 'npm test', + compileCommand: 'npm run compile', + skipFiles: ['mocks'], + providerOptions: { + default_balance_ether: '10000000000000000000000000', + }, + mocha: { + fgrep: '[skip-on-coverage]', + invert: true, + }, +}; diff --git a/docs/templates/helpers.js b/docs/templates/helpers.js index 8c94d757c..0d587caa8 100644 --- a/docs/templates/helpers.js +++ b/docs/templates/helpers.js @@ -2,26 +2,26 @@ const { version } = require('../../package.json'); module.exports['oz-version'] = () => version; -module.exports['readme-path'] = (opts) => { +module.exports['readme-path'] = opts => { return 'contracts/' + opts.data.root.id.replace(/\.adoc$/, '') + '/README.adoc'; }; -module.exports.names = (params) => params.map(p => p.name).join(', '); +module.exports.names = params => params.map(p => p.name).join(', '); -module.exports['typed-params'] = (params) => { +module.exports['typed-params'] = params => { return params.map(p => `${p.type}${p.name ? ' ' + p.name : ''}`).join(', '); }; -const slug = module.exports.slug = (str) => { +const slug = (module.exports.slug = str => { if (str === undefined) { throw new Error('Missing argument'); } return str.replace(/\W/g, '-'); -}; +}); const linksCache = new WeakMap(); -function getAllLinks (items) { +function getAllLinks(items) { if (linksCache.has(items)) { return linksCache.get(items); } @@ -34,11 +34,11 @@ function getAllLinks (items) { return res; } -module.exports['with-prelude'] = (opts) => { +module.exports['with-prelude'] = opts => { const links = getAllLinks(opts.data.site.items); const contents = opts.fn(); const neededLinks = contents - .match(/\{[-._a-z0-9]+\}/ig) + .match(/\{[-._a-z0-9]+\}/gi) .map(m => m.replace(/^\{(.+)\}$/, '$1')) .filter(k => k in links); const prelude = neededLinks.map(k => `:${k}: ${links[k]}`).join('\n'); diff --git a/docs/templates/properties.js b/docs/templates/properties.js index 5dde3a471..99bdf88b2 100644 --- a/docs/templates/properties.js +++ b/docs/templates/properties.js @@ -1,7 +1,7 @@ const { isNodeType } = require('solidity-ast/utils'); const { slug } = require('./helpers'); -module.exports.anchor = function anchor ({ item, contract }) { +module.exports.anchor = function anchor({ item, contract }) { let res = ''; if (contract) { res += contract.name + '-'; @@ -37,13 +37,9 @@ module.exports['has-events'] = function ({ item }) { module.exports['inherited-functions'] = function ({ item }) { const { inheritance } = item; - const baseFunctions = new Set( - inheritance.flatMap(c => c.functions.flatMap(f => f.baseFunctions ?? [])), - ); + const baseFunctions = new Set(inheritance.flatMap(c => c.functions.flatMap(f => f.baseFunctions ?? []))); return inheritance.map((contract, i) => ({ contract, - functions: contract.functions.filter(f => - !baseFunctions.has(f.id) && (f.name !== 'constructor' || i === 0), - ), + functions: contract.functions.filter(f => !baseFunctions.has(f.id) && (f.name !== 'constructor' || i === 0)), })); }; diff --git a/hardhat.config.js b/hardhat.config.js index 1722faf91..74f40c4d1 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -29,7 +29,7 @@ const argv = require('yargs/yargs')() mode: { alias: 'compileMode', type: 'string', - choices: [ 'production', 'development' ], + choices: ['production', 'development'], default: 'development', }, ir: { @@ -46,8 +46,7 @@ const argv = require('yargs/yargs')() alias: 'coinmarketcapApiKey', type: 'string', }, - }) - .argv; + }).argv; require('@nomiclabs/hardhat-truffle5'); require('hardhat-ignore-warnings'); @@ -106,7 +105,7 @@ if (argv.gas) { outputFile: argv.gasReport, coinmarketcap: argv.coinmarketcap, }; -}; +} if (argv.coverage) { require('solidity-coverage'); diff --git a/hardhat/ignore-unreachable-warnings.js b/hardhat/ignore-unreachable-warnings.js index c9d3c36a4..8e3e34340 100644 --- a/hardhat/ignore-unreachable-warnings.js +++ b/hardhat/ignore-unreachable-warnings.js @@ -38,9 +38,7 @@ task(TASK_COMPILE_SOLIDITY_COMPILE, async (params, _, runSuper) => { if (marked) { result.output = { ...result.output, - errors: result.output.errors?.filter( - e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE, - ), + errors: result.output.errors?.filter(e => e.severity !== 'warning' || e.errorCode !== W_UNREACHABLE_CODE), }; } return result; diff --git a/hardhat/skip-foundry-tests.js b/hardhat/skip-foundry-tests.js index b8030288d..965ba37c3 100644 --- a/hardhat/skip-foundry-tests.js +++ b/hardhat/skip-foundry-tests.js @@ -1,7 +1,6 @@ const { subtask } = require('hardhat/config'); const { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } = require('hardhat/builtin-tasks/task-names'); -subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS) - .setAction(async (_, __, runSuper) => - (await runSuper()).filter((path) => !path.endsWith('.t.sol')), - ); +subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, __, runSuper) => + (await runSuper()).filter(path => !path.endsWith('.t.sol')), +); diff --git a/package-lock.json b/package-lock.json index 172fa0944..c847f2c92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "lodash.zip": "^4.2.0", "merkletreejs": "^0.2.13", "micromatch": "^4.0.2", - "prettier": "^2.3.0", + "prettier": "^2.8.1", "prettier-plugin-solidity": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", diff --git a/package.json b/package.json index 3ea1d7301..41d1131bb 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,14 @@ "compile": "hardhat compile", "coverage": "env COVERAGE=true hardhat coverage", "docs": "npm run prepare-docs && oz-docs", - "docs:watch": "oz-docs watch contracts 'docs/templates' docs/config.js", + "docs:watch": "oz-docs watch contracts docs/templates docs/config.js", "prepare-docs": "scripts/prepare-docs.sh", "lint": "npm run lint:js && npm run lint:sol", "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix", - "lint:js": "eslint --ignore-path .gitignore .", - "lint:js:fix": "eslint --ignore-path .gitignore . --fix", - "lint:sol": "solhint '{contracts,test}/**/*.sol' && prettier -c '{contracts,test}/**/*.sol'", - "lint:sol:fix": "prettier --write '{contracts,test}/**/*.sol'", + "lint:js": "prettier --loglevel warn --ignore-path .gitignore '**/*.{js,ts}' --check && eslint --ignore-path .gitignore .", + "lint:js:fix": "prettier --loglevel warn --ignore-path .gitignore '**/*.{js,ts}' --write && eslint --ignore-path .gitignore . --fix", + "lint:sol": "prettier --loglevel warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --write && solhint '{contracts,test}/**/*.sol'", + "lint:sol:fix": "prettier --loglevel warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --write", "clean": "hardhat clean && rimraf build contracts/build", "prepare": "scripts/prepare.sh", "prepack": "scripts/prepack.sh", @@ -75,7 +75,7 @@ "lodash.zip": "^4.2.0", "merkletreejs": "^0.2.13", "micromatch": "^4.0.2", - "prettier": "^2.3.0", + "prettier": "^2.8.1", "prettier-plugin-solidity": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.5", diff --git a/scripts/checks/compareGasReports.js b/scripts/checks/compareGasReports.js index 5e3a0e7cd..ca99dea0d 100755 --- a/scripts/checks/compareGasReports.js +++ b/scripts/checks/compareGasReports.js @@ -7,7 +7,7 @@ const { argv } = require('yargs') .options({ style: { type: 'string', - choices: [ 'shell', 'markdown' ], + choices: ['shell', 'markdown'], default: 'shell', }, }); @@ -16,52 +16,55 @@ const { argv } = require('yargs') const BASE_TX_COST = 21000; // Utilities -function sum (...args) { +function sum(...args) { return args.reduce((a, b) => a + b, 0); } -function average (...args) { +function average(...args) { return sum(...args) / args.length; } -function variation (current, previous, offset = 0) { +function variation(current, previous, offset = 0) { return { value: current, delta: current - previous, - prcnt: 100 * (current - previous) / (previous - offset), + prcnt: (100 * (current - previous)) / (previous - offset), }; } // Report class class Report { // Read report file - static load (filepath) { + static load(filepath) { return JSON.parse(fs.readFileSync(filepath, 'utf8')); } // Compare two reports - static compare (update, ref, opts = { hideEqual: true }) { + static compare(update, ref, opts = { hideEqual: true }) { if (JSON.stringify(update.config.metadata) !== JSON.stringify(ref.config.metadata)) { throw new Error('Reports produced with non matching metadata'); } const deployments = update.info.deployments - .map(contract => Object.assign( - contract, - { previousVersion: ref.info.deployments.find(({ name }) => name === contract.name) }, - )) + .map(contract => + Object.assign(contract, { previousVersion: ref.info.deployments.find(({ name }) => name === contract.name) }), + ) .filter(contract => contract.gasData?.length && contract.previousVersion?.gasData?.length) - .flatMap(contract => [{ - contract: contract.name, - method: '[bytecode length]', - avg: variation(contract.bytecode.length / 2 - 1, contract.previousVersion.bytecode.length / 2 - 1), - }, { - contract: contract.name, - method: '[construction cost]', - avg: variation( - ...[contract.gasData, contract.previousVersion.gasData].map(x => Math.round(average(...x))), - BASE_TX_COST), - }]) + .flatMap(contract => [ + { + contract: contract.name, + method: '[bytecode length]', + avg: variation(contract.bytecode.length / 2 - 1, contract.previousVersion.bytecode.length / 2 - 1), + }, + { + contract: contract.name, + method: '[construction cost]', + avg: variation( + ...[contract.gasData, contract.previousVersion.gasData].map(x => Math.round(average(...x))), + BASE_TX_COST, + ), + }, + ]) .sort((a, b) => `${a.contract}:${a.method}`.localeCompare(`${b.contract}:${b.method}`)); const methods = Object.keys(update.info.methods) @@ -77,21 +80,22 @@ class Report { })) .sort((a, b) => `${a.contract}:${a.method}`.localeCompare(`${b.contract}:${b.method}`)); - return [].concat(deployments, methods) + return [] + .concat(deployments, methods) .filter(row => !opts.hideEqual || row.min?.delta || row.max?.delta || row.avg?.delta); } } // Display -function center (text, length) { +function center(text, length) { return text.padStart((text.length + length) / 2).padEnd(length); } -function plusSign (num) { +function plusSign(num) { return num > 0 ? '+' : ''; } -function formatCellShell (cell) { +function formatCellShell(cell) { const format = chalk[cell?.delta > 0 ? 'red' : cell?.delta < 0 ? 'green' : 'reset']; return [ format((!isFinite(cell?.value) ? '-' : cell.value.toString()).padStart(8)), @@ -100,7 +104,7 @@ function formatCellShell (cell) { ]; } -function formatCmpShell (rows) { +function formatCmpShell(rows) { const contractLength = Math.max(8, ...rows.map(({ contract }) => contract.length)); const methodLength = Math.max(7, ...rows.map(({ method }) => method.length)); @@ -113,54 +117,60 @@ function formatCmpShell (rows) { { txt: 'Avg', length: 30 }, { txt: '', length: 0 }, ]; - const HEADER = COLS.map(entry => chalk.bold(center(entry.txt, entry.length || 0))).join(' | ').trim(); - const SEPARATOR = COLS.map(({ length }) => length > 0 ? '-'.repeat(length + 2) : '').join('|').trim(); + const HEADER = COLS.map(entry => chalk.bold(center(entry.txt, entry.length || 0))) + .join(' | ') + .trim(); + const SEPARATOR = COLS.map(({ length }) => (length > 0 ? '-'.repeat(length + 2) : '')) + .join('|') + .trim(); return [ '', HEADER, - ...rows.map(entry => [ - '', - chalk.grey(entry.contract.padEnd(contractLength)), - entry.method.padEnd(methodLength), - ...formatCellShell(entry.min), - ...formatCellShell(entry.max), - ...formatCellShell(entry.avg), - '', - ].join(' | ').trim()), + ...rows.map(entry => + [ + '', + chalk.grey(entry.contract.padEnd(contractLength)), + entry.method.padEnd(methodLength), + ...formatCellShell(entry.min), + ...formatCellShell(entry.max), + ...formatCellShell(entry.avg), + '', + ] + .join(' | ') + .trim(), + ), '', - ].join(`\n${SEPARATOR}\n`).trim(); + ] + .join(`\n${SEPARATOR}\n`) + .trim(); } -function alignPattern (align) { +function alignPattern(align) { switch (align) { - case 'left': - case undefined: - return ':-'; - case 'right': - return '-:'; - case 'center': - return ':-:'; + case 'left': + case undefined: + return ':-'; + case 'right': + return '-:'; + case 'center': + return ':-:'; } } -function trend (value) { - return value > 0 - ? ':x:' - : value < 0 - ? ':heavy_check_mark:' - : ':heavy_minus_sign:'; +function trend(value) { + return value > 0 ? ':x:' : value < 0 ? ':heavy_check_mark:' : ':heavy_minus_sign:'; } -function formatCellMarkdown (cell) { +function formatCellMarkdown(cell) { return [ - (!isFinite(cell?.value) ? '-' : cell.value.toString()), - (!isFinite(cell?.delta) ? '-' : plusSign(cell.delta) + cell.delta.toString()), - (!isFinite(cell?.prcnt) ? '-' : plusSign(cell.prcnt) + cell.prcnt.toFixed(2) + '%' + trend(cell.delta)), + !isFinite(cell?.value) ? '-' : cell.value.toString(), + !isFinite(cell?.delta) ? '-' : plusSign(cell.delta) + cell.delta.toString(), + !isFinite(cell?.prcnt) ? '-' : plusSign(cell.prcnt) + cell.prcnt.toFixed(2) + '%' + trend(cell.delta), ]; } -function formatCmpMarkdown (rows) { +function formatCmpMarkdown(rows) { const COLS = [ { txt: '' }, { txt: 'Contract', align: 'left' }, @@ -176,36 +186,48 @@ function formatCmpMarkdown (rows) { { txt: '%', align: 'right' }, { txt: '' }, ]; - const HEADER = COLS.map(entry => entry.txt).join(' | ').trim(); - const SEPARATOR = COLS.map(entry => entry.txt ? alignPattern(entry.align) : '').join('|').trim(); + const HEADER = COLS.map(entry => entry.txt) + .join(' | ') + .trim(); + const SEPARATOR = COLS.map(entry => (entry.txt ? alignPattern(entry.align) : '')) + .join('|') + .trim(); return [ '# Changes to gas costs', '', HEADER, SEPARATOR, - rows.map(entry => [ - '', - entry.contract, - entry.method, - ...formatCellMarkdown(entry.min), - ...formatCellMarkdown(entry.max), - ...formatCellMarkdown(entry.avg), - '', - ].join(' | ').trim()).join('\n'), + rows + .map(entry => + [ + '', + entry.contract, + entry.method, + ...formatCellMarkdown(entry.min), + ...formatCellMarkdown(entry.max), + ...formatCellMarkdown(entry.avg), + '', + ] + .join(' | ') + .trim(), + ) + .join('\n'), '', - ].join('\n').trim(); + ] + .join('\n') + .trim(); } // MAIN const report = Report.compare(Report.load(argv._[0]), Report.load(argv._[1])); switch (argv.style) { -case 'markdown': - console.log(formatCmpMarkdown(report)); - break; -case 'shell': -default: - console.log(formatCmpShell(report)); - break; + case 'markdown': + console.log(formatCmpMarkdown(report)); + break; + case 'shell': + default: + console.log(formatCmpShell(report)); + break; } diff --git a/scripts/checks/inheritance-ordering.js b/scripts/checks/inheritance-ordering.js index 3ade7409a..45c707e6f 100755 --- a/scripts/checks/inheritance-ordering.js +++ b/scripts/checks/inheritance-ordering.js @@ -21,28 +21,32 @@ for (const artifact of artifacts) { names[contractDef.id] = contractDef.name; linearized.push(contractDef.linearizedBaseContracts); - contractDef.linearizedBaseContracts.forEach((c1, i, contracts) => contracts.slice(i + 1).forEach(c2 => { - graph.setEdge(c1, c2); - })); + contractDef.linearizedBaseContracts.forEach((c1, i, contracts) => + contracts.slice(i + 1).forEach(c2 => { + graph.setEdge(c1, c2); + }), + ); } } /// graphlib.alg.findCycles will not find minimal cycles. /// We are only interested int cycles of lengths 2 (needs proof) - graph.nodes().forEach((x, i, nodes) => nodes - .slice(i + 1) - .filter(y => graph.hasEdge(x, y) && graph.hasEdge(y, x)) - .forEach(y => { - console.log(`Conflict between ${names[x]} and ${names[y]} detected in the following dependency chains:`); - linearized - .filter(chain => chain.includes(parseInt(x)) && chain.includes(parseInt(y))) - .forEach(chain => { - const comp = chain.indexOf(parseInt(x)) < chain.indexOf(parseInt(y)) ? '>' : '<'; - console.log(`- ${names[x]} ${comp} ${names[y]} in ${names[chain.find(Boolean)]}`); - // console.log(`- ${names[x]} ${comp} ${names[y]}: ${chain.reverse().map(id => names[id]).join(', ')}`); - }); - process.exitCode = 1; - })); + graph.nodes().forEach((x, i, nodes) => + nodes + .slice(i + 1) + .filter(y => graph.hasEdge(x, y) && graph.hasEdge(y, x)) + .forEach(y => { + console.log(`Conflict between ${names[x]} and ${names[y]} detected in the following dependency chains:`); + linearized + .filter(chain => chain.includes(parseInt(x)) && chain.includes(parseInt(y))) + .forEach(chain => { + const comp = chain.indexOf(parseInt(x)) < chain.indexOf(parseInt(y)) ? '>' : '<'; + console.log(`- ${names[x]} ${comp} ${names[y]} in ${names[chain.find(Boolean)]}`); + // console.log(`- ${names[x]} ${comp} ${names[y]}: ${chain.reverse().map(id => names[id]).join(', ')}`); + }); + process.exitCode = 1; + }), + ); } if (!process.exitCode) { diff --git a/scripts/gen-nav.js b/scripts/gen-nav.js index b39d23e0d..de3d0daba 100644 --- a/scripts/gen-nav.js +++ b/scripts/gen-nav.js @@ -10,18 +10,18 @@ const files = glob.sync(baseDir + '/**/*.adoc').map(f => path.relative(baseDir, console.log('.API'); -function getPageTitle (directory) { +function getPageTitle(directory) { switch (directory) { - case 'metatx': - return 'Meta Transactions'; - case 'common': - return 'Common (Tokens)'; - default: - return startCase(directory); + case 'metatx': + return 'Meta Transactions'; + case 'common': + return 'Common (Tokens)'; + default: + return startCase(directory); } } -const links = files.map((file) => { +const links = files.map(file => { const doc = file.replace(baseDir, ''); const title = path.parse(file).name; diff --git a/scripts/generate/format-lines.js b/scripts/generate/format-lines.js index e1f1823e8..fa3d6b120 100644 --- a/scripts/generate/format-lines.js +++ b/scripts/generate/format-lines.js @@ -1,14 +1,14 @@ -function formatLines (...lines) { +function formatLines(...lines) { return [...indentEach(0, lines)].join('\n') + '\n'; } -function *indentEach (indent, lines) { +function* indentEach(indent, lines) { for (const line of lines) { if (Array.isArray(line)) { - yield * indentEach(indent + 1, line); + yield* indentEach(indent + 1, line); } else { const padding = ' '.repeat(indent); - yield * line.split('\n').map(subline => subline === '' ? '' : padding + subline); + yield* line.split('\n').map(subline => (subline === '' ? '' : padding + subline)); } } } diff --git a/scripts/generate/run.js b/scripts/generate/run.js index 51ddba339..a34823223 100755 --- a/scripts/generate/run.js +++ b/scripts/generate/run.js @@ -5,17 +5,15 @@ const fs = require('fs'); const path = require('path'); const format = require('./format-lines'); -function getVersion (path) { +function getVersion(path) { try { - return fs - .readFileSync(path, 'utf8') - .match(/\/\/ OpenZeppelin Contracts \(last updated v[^)]+\)/)[0]; + return fs.readFileSync(path, 'utf8').match(/\/\/ OpenZeppelin Contracts \(last updated v[^)]+\)/)[0]; } catch (err) { return null; } } -for (const [ file, template ] of Object.entries({ +for (const [file, template] of Object.entries({ 'utils/math/SafeCast.sol': './templates/SafeCast.js', 'utils/structs/EnumerableSet.sol': './templates/EnumerableSet.js', 'utils/structs/EnumerableMap.sol': './templates/EnumerableMap.js', @@ -27,7 +25,7 @@ for (const [ file, template ] of Object.entries({ const version = getVersion(output); const content = format( '// SPDX-License-Identifier: MIT', - ...(version ? [ version + ` (${file})` ] : []), + ...(version ? [version + ` (${file})`] : []), `// This file was procedurally generated from ${input}.`, '', require(template), diff --git a/scripts/generate/templates/Checkpoints.js b/scripts/generate/templates/Checkpoints.js index 858ddb4aa..afac25991 100644 --- a/scripts/generate/templates/Checkpoints.js +++ b/scripts/generate/templates/Checkpoints.js @@ -1,6 +1,6 @@ const format = require('../format-lines'); -const VALUE_SIZES = [ 224, 160 ]; +const VALUE_SIZES = [224, 160]; const header = `\ pragma solidity ^0.8.0; @@ -264,7 +264,7 @@ function _unsafeAccess(${opts.checkpointTypeName}[] storage self, uint256 pos) /* eslint-enable max-len */ // OPTIONS -const defaultOpts = (size) => ({ +const defaultOpts = size => ({ historyTypeName: `Trace${size}`, checkpointTypeName: `Checkpoint${size}`, checkpointFieldName: '_checkpoints', @@ -293,11 +293,7 @@ module.exports = format( legacyOperations(LEGACY_OPTS), common(LEGACY_OPTS), // New flavors - ...OPTS.flatMap(opts => [ - types(opts), - operations(opts), - common(opts), - ]), + ...OPTS.flatMap(opts => [types(opts), operations(opts), common(opts)]), ], '}', ); diff --git a/scripts/generate/templates/EnumerableSet.js b/scripts/generate/templates/EnumerableSet.js index 22178ecca..a3af2c304 100644 --- a/scripts/generate/templates/EnumerableSet.js +++ b/scripts/generate/templates/EnumerableSet.js @@ -245,9 +245,6 @@ function values(${name} storage set) internal view returns (${type}[] memory) { module.exports = format( header.trimEnd(), 'library EnumerableSet {', - [ - defaultSet(), - TYPES.map(details => customSet(details).trimEnd()).join('\n\n'), - ], + [defaultSet(), TYPES.map(details => customSet(details).trimEnd()).join('\n\n')], '}', ); diff --git a/scripts/generate/templates/SafeCast.js b/scripts/generate/templates/SafeCast.js index 8cf174206..3e2b148fd 100644 --- a/scripts/generate/templates/SafeCast.js +++ b/scripts/generate/templates/SafeCast.js @@ -8,55 +8,55 @@ const LENGTHS = range(8, 256, 8).reverse(); // 248 → 8 (in steps of 8) // This is used in the docs for each function. const version = (selector, length) => { switch (selector) { - case 'toUint(uint)': { - switch (length) { - case 8: - case 16: - case 32: - case 64: - case 128: - return '2.5'; - case 96: - case 224: - return '4.2'; - default: - assert(LENGTHS.includes(length)); - return '4.7'; + case 'toUint(uint)': { + switch (length) { + case 8: + case 16: + case 32: + case 64: + case 128: + return '2.5'; + case 96: + case 224: + return '4.2'; + default: + assert(LENGTHS.includes(length)); + return '4.7'; + } } - } - case 'toInt(int)': { - switch (length) { - case 8: - case 16: - case 32: - case 64: - case 128: - return '3.1'; - default: - assert(LENGTHS.includes(length)); - return '4.7'; + case 'toInt(int)': { + switch (length) { + case 8: + case 16: + case 32: + case 64: + case 128: + return '3.1'; + default: + assert(LENGTHS.includes(length)); + return '4.7'; + } + } + case 'toUint(int)': { + switch (length) { + case 256: + return '3.0'; + default: + assert(false); + return; + } + } + case 'toInt(uint)': { + switch (length) { + case 256: + return '3.0'; + default: + assert(false); + return; + } } - } - case 'toUint(int)': { - switch (length) { - case 256: - return '3.0'; default: assert(false); - return; - } - } - case 'toInt(uint)': { - switch (length) { - case 256: - return '3.0'; - default: - assert(false); - return; - } - } - default: - assert(false); } }; @@ -158,11 +158,6 @@ function toUint${length}(int${length} value) internal pure returns (uint${length module.exports = format( header.trimEnd(), 'library SafeCast {', - [ - ...LENGTHS.map(toUintDownCast), - toUint(256), - ...LENGTHS.map(toIntDownCast), - toInt(256), - ], + [...LENGTHS.map(toUintDownCast), toUint(256), ...LENGTHS.map(toIntDownCast), toInt(256)], '}', ); diff --git a/scripts/generate/templates/conversion.js b/scripts/generate/templates/conversion.js index 5c26c6821..9221f7c21 100644 --- a/scripts/generate/templates/conversion.js +++ b/scripts/generate/templates/conversion.js @@ -1,26 +1,26 @@ -function toBytes32 (type, value) { +function toBytes32(type, value) { switch (type) { - case 'bytes32': - return value; - case 'uint256': - return `bytes32(${value})`; - case 'address': - return `bytes32(uint256(uint160(${value})))`; - default: - throw new Error(`Conversion from ${type} to bytes32 not supported`); + case 'bytes32': + return value; + case 'uint256': + return `bytes32(${value})`; + case 'address': + return `bytes32(uint256(uint160(${value})))`; + default: + throw new Error(`Conversion from ${type} to bytes32 not supported`); } } -function fromBytes32 (type, value) { +function fromBytes32(type, value) { switch (type) { - case 'bytes32': - return value; - case 'uint256': - return `uint256(${value})`; - case 'address': - return `address(uint160(uint256(${value})))`; - default: - throw new Error(`Conversion from bytes32 to ${type} not supported`); + case 'bytes32': + return value; + case 'uint256': + return `uint256(${value})`; + case 'address': + return `address(uint160(uint256(${value})))`; + default: + throw new Error(`Conversion from bytes32 to ${type} not supported`); } } diff --git a/scripts/helpers.js b/scripts/helpers.js index cbd0e01e3..26d0a2baa 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -1,18 +1,27 @@ -function chunk (array, size = 1) { +function chunk(array, size = 1) { return Array.range(Math.ceil(array.length / size)).map(i => array.slice(i * size, i * size + size)); } -function range (start, stop = undefined, step = 1) { - if (!stop) { stop = start; start = 0; } - return start < stop ? Array(Math.ceil((stop - start) / step)).fill().map((_, i) => start + i * step) : []; +function range(start, stop = undefined, step = 1) { + if (!stop) { + stop = start; + start = 0; + } + return start < stop + ? Array(Math.ceil((stop - start) / step)) + .fill() + .map((_, i) => start + i * step) + : []; } -function unique (array, op = x => x) { +function unique(array, op = x => x) { return array.filter((obj, i) => array.findIndex(entry => op(obj) === op(entry)) === i); } -function zip (...args) { - return Array(Math.max(...args.map(arg => arg.length))).fill(null).map((_, i) => args.map(arg => arg[i])); +function zip(...args) { + return Array(Math.max(...args.map(arg => arg.length))) + .fill(null) + .map((_, i) => args.map(arg => arg[i])); } module.exports = { diff --git a/scripts/migrate-imports.js b/scripts/migrate-imports.js index 04ebce76c..f60441903 100755 --- a/scripts/migrate-imports.js +++ b/scripts/migrate-imports.js @@ -92,7 +92,7 @@ const pathUpdates = { 'token/ERC20/extensions/draft-IERC20Permit.sol': 'token/ERC20/extensions/IERC20Permit.sol', }; -async function main (paths = [ 'contracts' ]) { +async function main(paths = ['contracts']) { const files = await listFilesRecursively(paths, /\.sol$/); const updatedFiles = []; @@ -112,7 +112,7 @@ async function main (paths = [ 'contracts' ]) { } } -async function listFilesRecursively (paths, filter) { +async function listFilesRecursively(paths, filter) { const queue = paths; const files = []; @@ -133,7 +133,7 @@ async function listFilesRecursively (paths, filter) { return files; } -async function updateFile (file, update) { +async function updateFile(file, update) { const content = await fs.readFile(file, 'utf8'); const updatedContent = update(content); if (updatedContent !== content) { @@ -144,8 +144,8 @@ async function updateFile (file, update) { } } -function updateImportPaths (source) { - for (const [ oldPath, newPath ] of Object.entries(pathUpdates)) { +function updateImportPaths(source) { + for (const [oldPath, newPath] of Object.entries(pathUpdates)) { source = source.replace( path.join('@openzeppelin/contracts', oldPath), path.join('@openzeppelin/contracts', newPath), @@ -159,7 +159,7 @@ function updateImportPaths (source) { return source; } -function getUpgradeablePath (file) { +function getUpgradeablePath(file) { const { dir, name, ext } = path.parse(file); const upgradeableName = name + 'Upgradeable'; return path.format({ dir, ext, name: upgradeableName }); diff --git a/scripts/release/synchronize-versions.js b/scripts/release/synchronize-versions.js index 15915a1c8..c17ad614d 100755 --- a/scripts/release/synchronize-versions.js +++ b/scripts/release/synchronize-versions.js @@ -8,7 +8,7 @@ const cp = require('child_process'); setVersion('contracts/package.json'); -function setVersion (file) { +function setVersion(file) { const json = JSON.parse(fs.readFileSync(file)); json.version = process.env.npm_package_version; fs.writeFileSync(file, JSON.stringify(json, null, 2) + '\n'); diff --git a/scripts/release/update-changelog-release-date.js b/scripts/release/update-changelog-release-date.js index c368eb7b0..b1a4a177f 100755 --- a/scripts/release/update-changelog-release-date.js +++ b/scripts/release/update-changelog-release-date.js @@ -25,9 +25,8 @@ if (!header.test(changelog)) { process.exit(1); } -const newHeader = pkg.version.indexOf(suffix) === -1 - ? `## ${version} (${new Date().toISOString().split('T')[0]})` - : `## ${version}`; +const newHeader = + pkg.version.indexOf(suffix) === -1 ? `## ${version} (${new Date().toISOString().split('T')[0]})` : `## ${version}`; fs.writeFileSync('CHANGELOG.md', changelog.replace(header, newHeader)); diff --git a/scripts/release/update-comment.js b/scripts/release/update-comment.js index 7baf8c2b4..da2028c68 100755 --- a/scripts/release/update-comment.js +++ b/scripts/release/update-comment.js @@ -13,7 +13,7 @@ if (gitStatus.length > 0) { const { version } = require('../../package.json'); // Get latest tag according to semver. -const [ tag ] = run('git', 'tag') +const [tag] = run('git', 'tag') .split(/\r?\n/) .filter(semver.coerce) // check version can be processed .filter(v => semver.lt(semver.coerce(v), version)) // only consider older tags, ignore current prereleases diff --git a/scripts/remove-ignored-artifacts.js b/scripts/remove-ignored-artifacts.js index 2ef278899..f3e45b8d1 100644 --- a/scripts/remove-ignored-artifacts.js +++ b/scripts/remove-ignored-artifacts.js @@ -6,7 +6,7 @@ const fs = require('fs'); const path = require('path'); const match = require('micromatch'); -function readJSON (path) { +function readJSON(path) { return JSON.parse(fs.readFileSync(path)); } @@ -15,11 +15,11 @@ const pkgFiles = readJSON('package.json').files; // Get only negated patterns. const ignorePatterns = pkgFiles .filter(pat => pat.startsWith('!')) -// Remove the negation part. Makes micromatch usage more intuitive. + // Remove the negation part. Makes micromatch usage more intuitive. .map(pat => pat.slice(1)); const ignorePatternsSubtrees = ignorePatterns -// Add **/* to ignore all files contained in the directories. + // Add **/* to ignore all files contained in the directories. .concat(ignorePatterns.map(pat => path.join(pat, '**/*'))) .map(p => p.replace(/^\//, '')); diff --git a/scripts/update-docs-branch.js b/scripts/update-docs-branch.js index 82bb7e060..4e94ba6b1 100644 --- a/scripts/update-docs-branch.js +++ b/scripts/update-docs-branch.js @@ -1,7 +1,15 @@ const proc = require('child_process'); const read = cmd => proc.execSync(cmd, { encoding: 'utf8' }).trim(); -const run = cmd => { proc.execSync(cmd, { stdio: 'inherit' }); }; -const tryRead = cmd => { try { return read(cmd); } catch (e) { return undefined; } }; +const run = cmd => { + proc.execSync(cmd, { stdio: 'inherit' }); +}; +const tryRead = cmd => { + try { + return read(cmd); + } catch (e) { + return undefined; + } +}; const releaseBranchRegex = /^release-v(?(?\d+)\.(?\d+)(?:\.(?\d+))?)$/; @@ -33,7 +41,7 @@ if (!matchingDocsBranches) { if (others.length > 0) { console.error( `Found conflicting ${docsBranch} branches.\n` + - 'Either local branch is outdated or there are multiple matching remote branches.', + 'Either local branch is outdated or there are multiple matching remote branches.', ); process.exit(1); } diff --git a/test/access/AccessControl.behavior.js b/test/access/AccessControl.behavior.js index 310ac3693..a93560983 100644 --- a/test/access/AccessControl.behavior.js +++ b/test/access/AccessControl.behavior.js @@ -7,7 +7,7 @@ const DEFAULT_ADMIN_ROLE = '0x00000000000000000000000000000000000000000000000000 const ROLE = web3.utils.soliditySha3('ROLE'); const OTHER_ROLE = web3.utils.soliditySha3('OTHER_ROLE'); -function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, otherAdmin) { +function shouldBehaveLikeAccessControl(errorPrefix, admin, authorized, other, otherAdmin) { shouldSupportInterfaces(['AccessControl']); describe('default admin', function () { @@ -15,11 +15,11 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o expect(await this.accessControl.hasRole(DEFAULT_ADMIN_ROLE, admin)).to.equal(true); }); - it('other roles\'s admin is the default admin role', async function () { + it("other roles's admin is the default admin role", async function () { expect(await this.accessControl.getRoleAdmin(ROLE)).to.equal(DEFAULT_ADMIN_ROLE); }); - it('default admin role\'s admin is itself', async function () { + it("default admin role's admin is itself", async function () { expect(await this.accessControl.getRoleAdmin(DEFAULT_ADMIN_ROLE)).to.equal(DEFAULT_ADMIN_ROLE); }); }); @@ -125,7 +125,7 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o await this.accessControl.grantRole(OTHER_ROLE, otherAdmin, { from: admin }); }); - it('a role\'s admin role can be changed', async function () { + it("a role's admin role can be changed", async function () { expect(await this.accessControl.getRoleAdmin(ROLE)).to.equal(OTHER_ROLE); }); @@ -140,14 +140,14 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o expectEvent(receipt, 'RoleRevoked', { account: authorized, role: ROLE, sender: otherAdmin }); }); - it('a role\'s previous admins no longer grant roles', async function () { + it("a role's previous admins no longer grant roles", async function () { await expectRevert( this.accessControl.grantRole(ROLE, authorized, { from: admin }), `${errorPrefix}: account ${admin.toLowerCase()} is missing role ${OTHER_ROLE}`, ); }); - it('a role\'s previous admins no longer revoke roles', async function () { + it("a role's previous admins no longer revoke roles", async function () { await expectRevert( this.accessControl.revokeRole(ROLE, authorized, { from: admin }), `${errorPrefix}: account ${admin.toLowerCase()} is missing role ${OTHER_ROLE}`, @@ -164,14 +164,14 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o await this.accessControl.methods['$_checkRole(bytes32)'](ROLE, { from: authorized }); }); - it('revert if sender doesn\'t have role #1', async function () { + it("revert if sender doesn't have role #1", async function () { await expectRevert( this.accessControl.methods['$_checkRole(bytes32)'](ROLE, { from: other }), `${errorPrefix}: account ${other.toLowerCase()} is missing role ${ROLE}`, ); }); - it('revert if sender doesn\'t have role #2', async function () { + it("revert if sender doesn't have role #2", async function () { await expectRevert( this.accessControl.methods['$_checkRole(bytes32)'](OTHER_ROLE, { from: authorized }), `${errorPrefix}: account ${authorized.toLowerCase()} is missing role ${OTHER_ROLE}`, @@ -180,7 +180,7 @@ function shouldBehaveLikeAccessControl (errorPrefix, admin, authorized, other, o }); } -function shouldBehaveLikeAccessControlEnumerable (errorPrefix, admin, authorized, other, otherAdmin, otherAuthorized) { +function shouldBehaveLikeAccessControlEnumerable(errorPrefix, admin, authorized, other, otherAdmin, otherAuthorized) { shouldSupportInterfaces(['AccessControlEnumerable']); describe('enumerating', function () { diff --git a/test/access/AccessControl.test.js b/test/access/AccessControl.test.js index a462d5e54..90efad3d0 100644 --- a/test/access/AccessControl.test.js +++ b/test/access/AccessControl.test.js @@ -1,7 +1,4 @@ -const { - DEFAULT_ADMIN_ROLE, - shouldBehaveLikeAccessControl, -} = require('./AccessControl.behavior.js'); +const { DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl } = require('./AccessControl.behavior.js'); const AccessControl = artifacts.require('$AccessControl'); diff --git a/test/access/AccessControlCrossChain.test.js b/test/access/AccessControlCrossChain.test.js index 5146848ed..d5a41076b 100644 --- a/test/access/AccessControlCrossChain.test.js +++ b/test/access/AccessControlCrossChain.test.js @@ -1,15 +1,13 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { BridgeHelper } = require('../helpers/crosschain'); -const { - DEFAULT_ADMIN_ROLE, - shouldBehaveLikeAccessControl, -} = require('./AccessControl.behavior.js'); +const { DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl } = require('./AccessControl.behavior.js'); -const crossChainRoleAlias = (role) => web3.utils.leftPad( - web3.utils.toHex(web3.utils.toBN(role).xor(web3.utils.toBN(web3.utils.soliditySha3('CROSSCHAIN_ALIAS')))), - 64, -); +const crossChainRoleAlias = role => + web3.utils.leftPad( + web3.utils.toHex(web3.utils.toBN(role).xor(web3.utils.toBN(web3.utils.soliditySha3('CROSSCHAIN_ALIAS')))), + 64, + ); const AccessControlCrossChainMock = artifacts.require('$AccessControlCrossChainMock'); @@ -39,23 +37,13 @@ contract('AccessControl', function (accounts) { it('Crosschain calls not authorized to non-aliased addresses', async function () { await expectRevert( - this.bridge.call( - accounts[0], - this.accessControl, - '$_checkRole(bytes32)', - [ ROLE ], - ), + this.bridge.call(accounts[0], this.accessControl, '$_checkRole(bytes32)', [ROLE]), `AccessControl: account ${accounts[0].toLowerCase()} is missing role ${crossChainRoleAlias(ROLE)}`, ); }); it('Crosschain calls not authorized to non-aliased addresses', async function () { - await this.bridge.call( - accounts[1], - this.accessControl, - '$_checkRole(bytes32)', - [ ROLE ], - ); + await this.bridge.call(accounts[1], this.accessControl, '$_checkRole(bytes32)', [ROLE]); }); }); }); diff --git a/test/access/Ownable.test.js b/test/access/Ownable.test.js index b8ca81d28..dc308f98f 100644 --- a/test/access/Ownable.test.js +++ b/test/access/Ownable.test.js @@ -6,7 +6,7 @@ const { expect } = require('chai'); const Ownable = artifacts.require('$Ownable'); contract('Ownable', function (accounts) { - const [ owner, other ] = accounts; + const [owner, other] = accounts; beforeEach(async function () { this.ownable = await Ownable.new({ from: owner }); @@ -25,10 +25,7 @@ contract('Ownable', function (accounts) { }); it('prevents non-owners from transferring', async function () { - await expectRevert( - this.ownable.transferOwnership(other, { from: other }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.ownable.transferOwnership(other, { from: other }), 'Ownable: caller is not the owner'); }); it('guards ownership against stuck state', async function () { @@ -48,10 +45,7 @@ contract('Ownable', function (accounts) { }); it('prevents non-owners from renouncement', async function () { - await expectRevert( - this.ownable.renounceOwnership({ from: other }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.ownable.renounceOwnership({ from: other }), 'Ownable: caller is not the owner'); }); }); }); diff --git a/test/crosschain/CrossChainEnabled.test.js b/test/crosschain/CrossChainEnabled.test.js index bff955882..9e7d26308 100644 --- a/test/crosschain/CrossChainEnabled.test.js +++ b/test/crosschain/CrossChainEnabled.test.js @@ -1,7 +1,7 @@ const { BridgeHelper } = require('../helpers/crosschain'); const { expectRevertCustomError } = require('../helpers/customError'); -function randomAddress () { +function randomAddress() { return web3.utils.toChecksumAddress(web3.utils.randomHex(20)); } @@ -11,17 +11,11 @@ const CrossChainEnabledArbitrumL2Mock = artifacts.require('CrossChainEnabledArbi const CrossChainEnabledOptimismMock = artifacts.require('CrossChainEnabledOptimismMock'); const CrossChainEnabledPolygonChildMock = artifacts.require('CrossChainEnabledPolygonChildMock'); -function shouldBehaveLikeReceiver (sender = randomAddress()) { +function shouldBehaveLikeReceiver(sender = randomAddress()) { it('should reject same-chain calls', async function () { - await expectRevertCustomError( - this.receiver.crossChainRestricted(), - 'NotCrossChainCall()', - ); + await expectRevertCustomError(this.receiver.crossChainRestricted(), 'NotCrossChainCall()'); - await expectRevertCustomError( - this.receiver.crossChainOwnerRestricted(), - 'NotCrossChainCall()', - ); + await expectRevertCustomError(this.receiver.crossChainOwnerRestricted(), 'NotCrossChainCall()'); }); it('should restrict to cross-chain call from a invalid sender', async function () { @@ -32,11 +26,7 @@ function shouldBehaveLikeReceiver (sender = randomAddress()) { }); it('should grant access to cross-chain call from the owner', async function () { - await this.bridge.call( - await this.receiver.owner(), - this.receiver, - 'crossChainOwnerRestricted()', - ); + await this.bridge.call(await this.receiver.owner(), this.receiver, 'crossChainOwnerRestricted()'); }); } diff --git a/test/finance/PaymentSplitter.test.js b/test/finance/PaymentSplitter.test.js index ef74d4f69..1408c9f51 100644 --- a/test/finance/PaymentSplitter.test.js +++ b/test/finance/PaymentSplitter.test.js @@ -7,7 +7,7 @@ const PaymentSplitter = artifacts.require('PaymentSplitter'); const ERC20 = artifacts.require('$ERC20'); contract('PaymentSplitter', function (accounts) { - const [ owner, payee1, payee2, payee3, nonpayee1, payer1 ] = accounts; + const [owner, payee1, payee2, payee3, nonpayee1, payer1] = accounts; const amount = ether('1'); @@ -16,33 +16,32 @@ contract('PaymentSplitter', function (accounts) { }); it('rejects more payees than shares', async function () { - await expectRevert(PaymentSplitter.new([payee1, payee2, payee3], [20, 30]), + await expectRevert( + PaymentSplitter.new([payee1, payee2, payee3], [20, 30]), 'PaymentSplitter: payees and shares length mismatch', ); }); it('rejects more shares than payees', async function () { - await expectRevert(PaymentSplitter.new([payee1, payee2], [20, 30, 40]), + await expectRevert( + PaymentSplitter.new([payee1, payee2], [20, 30, 40]), 'PaymentSplitter: payees and shares length mismatch', ); }); it('rejects null payees', async function () { - await expectRevert(PaymentSplitter.new([payee1, ZERO_ADDRESS], [20, 30]), + await expectRevert( + PaymentSplitter.new([payee1, ZERO_ADDRESS], [20, 30]), 'PaymentSplitter: account is the zero address', ); }); it('rejects zero-valued shares', async function () { - await expectRevert(PaymentSplitter.new([payee1, payee2], [20, 0]), - 'PaymentSplitter: shares are 0', - ); + await expectRevert(PaymentSplitter.new([payee1, payee2], [20, 0]), 'PaymentSplitter: shares are 0'); }); it('rejects repeated payees', async function () { - await expectRevert(PaymentSplitter.new([payee1, payee1], [20, 30]), - 'PaymentSplitter: account already has shares', - ); + await expectRevert(PaymentSplitter.new([payee1, payee1], [20, 30]), 'PaymentSplitter: account already has shares'); }); context('once deployed', function () { @@ -60,11 +59,13 @@ contract('PaymentSplitter', function (accounts) { }); it('has payees', async function () { - await Promise.all(this.payees.map(async (payee, index) => { - expect(await this.contract.payee(index)).to.equal(payee); - expect(await this.contract.released(payee)).to.be.bignumber.equal('0'); - expect(await this.contract.releasable(payee)).to.be.bignumber.equal('0'); - })); + await Promise.all( + this.payees.map(async (payee, index) => { + expect(await this.contract.payee(index)).to.equal(payee); + expect(await this.contract.released(payee)).to.be.bignumber.equal('0'); + expect(await this.contract.releasable(payee)).to.be.bignumber.equal('0'); + }), + ); }); describe('accepts payments', function () { @@ -94,27 +95,25 @@ contract('PaymentSplitter', function (accounts) { describe('release', function () { describe('Ether', function () { it('reverts if no funds to claim', async function () { - await expectRevert(this.contract.release(payee1), - 'PaymentSplitter: account is not due payment', - ); + await expectRevert(this.contract.release(payee1), 'PaymentSplitter: account is not due payment'); }); it('reverts if non-payee want to claim', async function () { await send.ether(payer1, this.contract.address, amount); - await expectRevert(this.contract.release(nonpayee1), - 'PaymentSplitter: account has no shares', - ); + await expectRevert(this.contract.release(nonpayee1), 'PaymentSplitter: account has no shares'); }); }); describe('Token', function () { it('reverts if no funds to claim', async function () { - await expectRevert(this.contract.release(this.token.address, payee1), + await expectRevert( + this.contract.release(this.token.address, payee1), 'PaymentSplitter: account is not due payment', ); }); it('reverts if non-payee want to claim', async function () { await this.token.transfer(this.contract.address, amount, { from: owner }); - await expectRevert(this.contract.release(this.token.address, nonpayee1), + await expectRevert( + this.contract.release(this.token.address, nonpayee1), 'PaymentSplitter: account has no shares', ); }); @@ -183,31 +182,31 @@ contract('PaymentSplitter', function (accounts) { await this.token.transfer(this.contract.address, amount, { from: owner }); - expectEvent( - await this.contract.release(this.token.address, payee1), - 'ERC20PaymentReleased', - { token: this.token.address, to: payee1, amount: ether('0.20') }, - ); + expectEvent(await this.contract.release(this.token.address, payee1), 'ERC20PaymentReleased', { + token: this.token.address, + to: payee1, + amount: ether('0.20'), + }); await this.token.transfer(this.contract.address, amount, { from: owner }); - expectEvent( - await this.contract.release(this.token.address, payee1), - 'ERC20PaymentReleased', - { token: this.token.address, to: payee1, amount: ether('0.20') }, - ); + expectEvent(await this.contract.release(this.token.address, payee1), 'ERC20PaymentReleased', { + token: this.token.address, + to: payee1, + amount: ether('0.20'), + }); - expectEvent( - await this.contract.release(this.token.address, payee2), - 'ERC20PaymentReleased', - { token: this.token.address, to: payee2, amount: ether('0.20') }, - ); + expectEvent(await this.contract.release(this.token.address, payee2), 'ERC20PaymentReleased', { + token: this.token.address, + to: payee2, + amount: ether('0.20'), + }); - expectEvent( - await this.contract.release(this.token.address, payee3), - 'ERC20PaymentReleased', - { token: this.token.address, to: payee3, amount: ether('1.40') }, - ); + expectEvent(await this.contract.release(this.token.address, payee3), 'ERC20PaymentReleased', { + token: this.token.address, + to: payee3, + amount: ether('1.40'), + }); expect(await this.token.balanceOf(payee1)).to.be.bignumber.equal(ether('0.40')); expect(await this.token.balanceOf(payee2)).to.be.bignumber.equal(ether('0.20')); diff --git a/test/finance/VestingWallet.behavior.js b/test/finance/VestingWallet.behavior.js index 5ab6233ca..afd4c0495 100644 --- a/test/finance/VestingWallet.behavior.js +++ b/test/finance/VestingWallet.behavior.js @@ -2,34 +2,28 @@ const { time } = require('@nomicfoundation/hardhat-network-helpers'); const { expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -function releasedEvent (token, amount) { - return token - ? [ 'ERC20Released', { token: token.address, amount } ] - : [ 'EtherReleased', { amount } ]; +function releasedEvent(token, amount) { + return token ? ['ERC20Released', { token: token.address, amount }] : ['EtherReleased', { amount }]; } -function shouldBehaveLikeVesting (beneficiary) { +function shouldBehaveLikeVesting(beneficiary) { it('check vesting schedule', async function () { - const [ vestedAmount, releasable, ...args ] = this.token - ? [ 'vestedAmount(address,uint64)', 'releasable(address)', this.token.address ] - : [ 'vestedAmount(uint64)', 'releasable()' ]; + const [vestedAmount, releasable, ...args] = this.token + ? ['vestedAmount(address,uint64)', 'releasable(address)', this.token.address] + : ['vestedAmount(uint64)', 'releasable()']; for (const timestamp of this.schedule) { await time.increaseTo(timestamp); const vesting = this.vestingFn(timestamp); - expect(await this.mock.methods[vestedAmount](...args, timestamp)) - .to.be.bignumber.equal(vesting); + expect(await this.mock.methods[vestedAmount](...args, timestamp)).to.be.bignumber.equal(vesting); - expect(await this.mock.methods[releasable](...args)) - .to.be.bignumber.equal(vesting); + expect(await this.mock.methods[releasable](...args)).to.be.bignumber.equal(vesting); } }); it('execute vesting schedule', async function () { - const [ release, ...args ] = this.token - ? [ 'release(address)', this.token.address ] - : [ 'release()' ]; + const [release, ...args] = this.token ? ['release(address)', this.token.address] : ['release()']; let released = web3.utils.toBN(0); const before = await this.getBalance(beneficiary); @@ -37,11 +31,7 @@ function shouldBehaveLikeVesting (beneficiary) { { const receipt = await this.mock.methods[release](...args); - await expectEvent.inTransaction( - receipt.tx, - this.mock, - ...releasedEvent(this.token, '0'), - ); + await expectEvent.inTransaction(receipt.tx, this.mock, ...releasedEvent(this.token, '0')); await this.checkRelease(receipt, beneficiary, '0'); @@ -53,16 +43,11 @@ function shouldBehaveLikeVesting (beneficiary) { const vested = this.vestingFn(timestamp); const receipt = await this.mock.methods[release](...args); - await expectEvent.inTransaction( - receipt.tx, - this.mock, - ...releasedEvent(this.token, vested.sub(released)), - ); + await expectEvent.inTransaction(receipt.tx, this.mock, ...releasedEvent(this.token, vested.sub(released))); await this.checkRelease(receipt, beneficiary, vested.sub(released)); - expect(await this.getBalance(beneficiary)) - .to.be.bignumber.equal(before.add(vested)); + expect(await this.getBalance(beneficiary)).to.be.bignumber.equal(before.add(vested)); released = vested; } diff --git a/test/finance/VestingWallet.test.js b/test/finance/VestingWallet.test.js index 81a1e228a..5b90a6916 100644 --- a/test/finance/VestingWallet.test.js +++ b/test/finance/VestingWallet.test.js @@ -7,10 +7,10 @@ const ERC20 = artifacts.require('$ERC20'); const { shouldBehaveLikeVesting } = require('./VestingWallet.behavior'); -const min = (...args) => args.slice(1).reduce((x, y) => x.lt(y) ? x : y, args[0]); +const min = (...args) => args.slice(1).reduce((x, y) => (x.lt(y) ? x : y), args[0]); contract('VestingWallet', function (accounts) { - const [ sender, beneficiary ] = accounts; + const [sender, beneficiary] = accounts; const amount = web3.utils.toBN(web3.utils.toWei('100')); const duration = web3.utils.toBN(4 * 365 * 86400); // 4 years @@ -35,7 +35,9 @@ contract('VestingWallet', function (accounts) { describe('vesting schedule', function () { beforeEach(async function () { - this.schedule = Array(64).fill().map((_, i) => web3.utils.toBN(i).mul(duration).divn(60).add(this.start)); + this.schedule = Array(64) + .fill() + .map((_, i) => web3.utils.toBN(i).mul(duration).divn(60).add(this.start)); this.vestingFn = timestamp => min(amount, amount.mul(timestamp.sub(this.start)).div(duration)); }); @@ -52,13 +54,9 @@ contract('VestingWallet', function (accounts) { describe('ERC20 vesting', function () { beforeEach(async function () { this.token = await ERC20.new('Name', 'Symbol'); - this.getBalance = (account) => this.token.balanceOf(account); - this.checkRelease = (receipt, to, value) => expectEvent.inTransaction( - receipt.tx, - this.token, - 'Transfer', - { from: this.mock.address, to, value }, - ); + this.getBalance = account => this.token.balanceOf(account); + this.checkRelease = (receipt, to, value) => + expectEvent.inTransaction(receipt.tx, this.token, 'Transfer', { from: this.mock.address, to, value }); await this.token.$_mint(this.mock.address, amount); }); diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index e5dd04cf0..cc3cc17ef 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -7,9 +7,7 @@ const Enums = require('../helpers/enums'); const { EIP712Domain } = require('../helpers/eip712'); const { GovernorHelper } = require('../helpers/governance'); -const { - shouldSupportInterfaces, -} = require('../utils/introspection/SupportsInterface.behavior'); +const { shouldSupportInterfaces } = require('../utils/introspection/SupportsInterface.behavior'); const Token = artifacts.require('$ERC20Votes'); const Governor = artifacts.require('$GovernorMock'); @@ -18,7 +16,7 @@ const ERC721 = artifacts.require('$ERC721'); const ERC1155 = artifacts.require('$ERC1155'); contract('Governor', function (accounts) { - const [ owner, proposer, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; const empty = web3.utils.toChecksumAddress(web3.utils.randomHex(20)); const name = 'OZ-Governor'; @@ -53,21 +51,19 @@ contract('Governor', function (accounts) { await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - value, - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + value, + }, + ], + '', + ); }); - shouldSupportInterfaces([ - 'ERC165', - 'ERC1155Receiver', - 'Governor', - 'GovernorWithParams', - ]); + shouldSupportInterfaces(['ERC165', 'ERC1155Receiver', 'Governor', 'GovernorWithParams']); it('deployment check', async function () { expect(await this.mock.name()).to.be.equal(name); @@ -89,21 +85,17 @@ contract('Governor', function (accounts) { // Run proposal const txPropose = await this.helper.propose({ from: proposer }); - expectEvent( - txPropose, - 'ProposalCreated', - { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values, - signatures: this.proposal.signatures, - calldatas: this.proposal.data, - startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), - endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), - description: this.proposal.description, - }, - ); + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values, + signatures: this.proposal.signatures, + calldatas: this.proposal.data, + startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), + endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), + description: this.proposal.description, + }); await this.helper.waitForSnapshot(); @@ -118,51 +110,31 @@ contract('Governor', function (accounts) { }, ); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), - 'VoteCast', - { - voter: voter2, - support: Enums.VoteType.For, - weight: web3.utils.toWei('7'), - }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { + voter: voter2, + support: Enums.VoteType.For, + weight: web3.utils.toWei('7'), + }); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), - 'VoteCast', - { - voter: voter3, - support: Enums.VoteType.Against, - weight: web3.utils.toWei('5'), - }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { + voter: voter3, + support: Enums.VoteType.Against, + weight: web3.utils.toWei('5'), + }); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), - 'VoteCast', - { - voter: voter4, - support: Enums.VoteType.Abstain, - weight: web3.utils.toWei('2'), - }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { + voter: voter4, + support: Enums.VoteType.Abstain, + weight: web3.utils.toWei('2'), + }); await this.helper.waitForDeadline(); const txExecute = await this.helper.execute(); - expectEvent( - txExecute, - 'ProposalExecuted', - { proposalId: this.proposal.id }, - ); + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalled', - ); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); // After expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); @@ -176,10 +148,9 @@ contract('Governor', function (accounts) { const voterBySig = Wallet.generate(); const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const signature = async (message) => { - return fromRpcSig(ethSigUtil.signTypedMessage( - voterBySig.getPrivateKey(), - { + const signature = async message => { + return fromRpcSig( + ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data: { types: { EIP712Domain, @@ -192,8 +163,8 @@ contract('Governor', function (accounts) { primaryType: 'Ballot', message, }, - }, - )); + }), + ); }; await this.token.delegate(voterBySigAddress, { from: voter1 }); @@ -201,11 +172,10 @@ contract('Governor', function (accounts) { // Run proposal await this.helper.propose(); await this.helper.waitForSnapshot(); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.For, signature }), - 'VoteCast', - { voter: voterBySigAddress, support: Enums.VoteType.For }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For, signature }), 'VoteCast', { + voter: voterBySigAddress, + support: Enums.VoteType.For, + }); await this.helper.waitForDeadline(); await this.helper.execute(); @@ -217,12 +187,15 @@ contract('Governor', function (accounts) { }); it('send ethers', async function () { - this.proposal = this.helper.setProposal([ - { - target: empty, - value, - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: empty, + value, + }, + ], + '', + ); // Before expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(value); @@ -320,12 +293,15 @@ contract('Governor', function (accounts) { }); it('if receiver revert without reason', async function () { - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunctionRevertsNoReason().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunctionRevertsNoReason().encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -335,12 +311,15 @@ contract('Governor', function (accounts) { }); it('if receiver revert with reason', async function () { - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunctionRevertsReason().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunctionRevertsReason().encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -457,34 +436,43 @@ contract('Governor', function (accounts) { describe('proposal length', function () { it('empty', async function () { - this.helper.setProposal([ ], ''); + this.helper.setProposal([], ''); await expectRevert(this.helper.propose(), 'Governor: empty proposal'); }); it('mismatch #1', async function () { - this.helper.setProposal({ - targets: [ ], - values: [ web3.utils.toWei('0') ], - data: [ this.receiver.contract.methods.mockFunction().encodeABI() ], - }, ''); + this.helper.setProposal( + { + targets: [], + values: [web3.utils.toWei('0')], + data: [this.receiver.contract.methods.mockFunction().encodeABI()], + }, + '', + ); await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); }); it('mismatch #2', async function () { - this.helper.setProposal({ - targets: [ this.receiver.address ], - values: [ ], - data: [ this.receiver.contract.methods.mockFunction().encodeABI() ], - }, ''); + this.helper.setProposal( + { + targets: [this.receiver.address], + values: [], + data: [this.receiver.contract.methods.mockFunction().encodeABI()], + }, + '', + ); await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); }); it('mismatch #3', async function () { - this.helper.setProposal({ - targets: [ this.receiver.address ], - values: [ web3.utils.toWei('0') ], - data: [ ], - }, ''); + this.helper.setProposal( + { + targets: [this.receiver.address], + values: [web3.utils.toWei('0')], + data: [], + }, + '', + ); await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); }); }); @@ -503,56 +491,57 @@ contract('Governor', function (accounts) { }); it('can setVotingDelay through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingDelay('0').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingDelay('0').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.execute(), - 'VotingDelaySet', - { oldVotingDelay: '4', newVotingDelay: '0' }, - ); + expectEvent(await this.helper.execute(), 'VotingDelaySet', { oldVotingDelay: '4', newVotingDelay: '0' }); expect(await this.mock.votingDelay()).to.be.bignumber.equal('0'); }); it('can setVotingPeriod through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingPeriod('32').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingPeriod('32').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.execute(), - 'VotingPeriodSet', - { oldVotingPeriod: '16', newVotingPeriod: '32' }, - ); + expectEvent(await this.helper.execute(), 'VotingPeriodSet', { oldVotingPeriod: '16', newVotingPeriod: '32' }); expect(await this.mock.votingPeriod()).to.be.bignumber.equal('32'); }); it('cannot setVotingPeriod to 0 through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingPeriod('0').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingPeriod('0').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -563,23 +552,25 @@ contract('Governor', function (accounts) { }); it('can setProposalThreshold to 0 through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.setProposalThreshold('1000000000000000000').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setProposalThreshold('1000000000000000000').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.execute(), - 'ProposalThresholdSet', - { oldProposalThreshold: '0', newProposalThreshold: '1000000000000000000' }, - ); + expectEvent(await this.helper.execute(), 'ProposalThresholdSet', { + oldProposalThreshold: '0', + newProposalThreshold: '1000000000000000000', + }); expect(await this.mock.proposalThreshold()).to.be.bignumber.equal('1000000000000000000'); }); diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index 3b31f8189..83352ef85 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -3,9 +3,7 @@ const { ZERO_ADDRESS, ZERO_BYTES32 } = constants; const { expect } = require('chai'); -const { - shouldSupportInterfaces, -} = require('../utils/introspection/SupportsInterface.behavior'); +const { shouldSupportInterfaces } = require('../utils/introspection/SupportsInterface.behavior'); const TimelockController = artifacts.require('TimelockController'); const CallReceiverMock = artifacts.require('CallReceiverMock'); @@ -17,42 +15,28 @@ const MINDELAY = time.duration.days(1); const salt = '0x025e7b0be353a74631ad648c667493c0e1cd31caa4cc2d3520fdc171ea0cc726'; // a random value -function genOperation (target, value, data, predecessor, salt) { - const id = web3.utils.keccak256(web3.eth.abi.encodeParameters([ - 'address', - 'uint256', - 'bytes', - 'uint256', - 'bytes32', - ], [ - target, - value, - data, - predecessor, - salt, - ])); +function genOperation(target, value, data, predecessor, salt) { + const id = web3.utils.keccak256( + web3.eth.abi.encodeParameters( + ['address', 'uint256', 'bytes', 'uint256', 'bytes32'], + [target, value, data, predecessor, salt], + ), + ); return { id, target, value, data, predecessor, salt }; } -function genOperationBatch (targets, values, payloads, predecessor, salt) { - const id = web3.utils.keccak256(web3.eth.abi.encodeParameters([ - 'address[]', - 'uint256[]', - 'bytes[]', - 'uint256', - 'bytes32', - ], [ - targets, - values, - payloads, - predecessor, - salt, - ])); +function genOperationBatch(targets, values, payloads, predecessor, salt) { + const id = web3.utils.keccak256( + web3.eth.abi.encodeParameters( + ['address[]', 'uint256[]', 'bytes[]', 'uint256', 'bytes32'], + [targets, values, payloads, predecessor, salt], + ), + ); return { id, targets, values, payloads, predecessor, salt }; } contract('TimelockController', function (accounts) { - const [ , admin, proposer, canceller, executor, other ] = accounts; + const [, admin, proposer, canceller, executor, other] = accounts; const TIMELOCK_ADMIN_ROLE = web3.utils.soliditySha3('TIMELOCK_ADMIN_ROLE'); const PROPOSER_ROLE = web3.utils.soliditySha3('PROPOSER_ROLE'); @@ -61,12 +45,7 @@ contract('TimelockController', function (accounts) { beforeEach(async function () { // Deploy new timelock - this.mock = await TimelockController.new( - MINDELAY, - [ proposer ], - [ executor ], - admin, - ); + this.mock = await TimelockController.new(MINDELAY, [proposer], [executor], admin); expect(await this.mock.hasRole(CANCELLER_ROLE, proposer)).to.be.equal(true); await this.mock.revokeRole(CANCELLER_ROLE, proposer, { from: admin }); @@ -77,9 +56,7 @@ contract('TimelockController', function (accounts) { this.implementation2 = await Implementation2.new({ from: admin }); }); - shouldSupportInterfaces([ - 'ERC1155Receiver', - ]); + shouldSupportInterfaces(['ERC1155Receiver']); it('initial state', async function () { expect(await this.mock.getMinDelay()).to.be.bignumber.equal(MINDELAY); @@ -89,27 +66,21 @@ contract('TimelockController', function (accounts) { expect(await this.mock.EXECUTOR_ROLE()).to.be.equal(EXECUTOR_ROLE); expect(await this.mock.CANCELLER_ROLE()).to.be.equal(CANCELLER_ROLE); - expect(await Promise.all([ PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE ].map(role => - this.mock.hasRole(role, proposer), - ))).to.be.deep.equal([ true, false, false ]); + expect( + await Promise.all([PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE].map(role => this.mock.hasRole(role, proposer))), + ).to.be.deep.equal([true, false, false]); - expect(await Promise.all([ PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE ].map(role => - this.mock.hasRole(role, canceller), - ))).to.be.deep.equal([ false, true, false ]); + expect( + await Promise.all([PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE].map(role => this.mock.hasRole(role, canceller))), + ).to.be.deep.equal([false, true, false]); - expect(await Promise.all([ PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE ].map(role => - this.mock.hasRole(role, executor), - ))).to.be.deep.equal([ false, false, true ]); + expect( + await Promise.all([PROPOSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE].map(role => this.mock.hasRole(role, executor))), + ).to.be.deep.equal([false, false, true]); }); it('optional admin', async function () { - const mock = await TimelockController.new( - MINDELAY, - [ proposer ], - [ executor ], - ZERO_ADDRESS, - { from: other }, - ); + const mock = await TimelockController.new(MINDELAY, [proposer], [executor], ZERO_ADDRESS, { from: other }); expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, admin)).to.be.equal(false); expect(await mock.hasRole(TIMELOCK_ADMIN_ROLE, other)).to.be.equal(false); @@ -125,13 +96,15 @@ contract('TimelockController', function (accounts) { '0xba41db3be0a9929145cfe480bd0f1f003689104d275ae912099f925df424ef94', '0x60d9109846ab510ed75c15f979ae366a8a2ace11d34ba9788c13ac296db50e6e', ); - expect(await this.mock.hashOperation( - this.operation.target, - this.operation.value, - this.operation.data, - this.operation.predecessor, - this.operation.salt, - )).to.be.equal(this.operation.id); + expect( + await this.mock.hashOperation( + this.operation.target, + this.operation.value, + this.operation.data, + this.operation.predecessor, + this.operation.salt, + ), + ).to.be.equal(this.operation.id); }); it('hashOperationBatch', async function () { @@ -142,13 +115,15 @@ contract('TimelockController', function (accounts) { '0xce8f45069cc71d25f71ba05062de1a3974f9849b004de64a70998bca9d29c2e7', '0x8952d74c110f72bfe5accdf828c74d53a7dfb71235dfa8a1e8c75d8576b372ff', ); - expect(await this.mock.hashOperationBatch( - this.operation.targets, - this.operation.values, - this.operation.payloads, - this.operation.predecessor, - this.operation.salt, - )).to.be.equal(this.operation.id); + expect( + await this.mock.hashOperationBatch( + this.operation.targets, + this.operation.values, + this.operation.payloads, + this.operation.predecessor, + this.operation.salt, + ), + ).to.be.equal(this.operation.id); }); }); describe('simple', function () { @@ -185,8 +160,9 @@ contract('TimelockController', function (accounts) { const block = await web3.eth.getBlock(receipt.receipt.blockHash); - expect(await this.mock.getTimestamp(this.operation.id)) - .to.be.bignumber.equal(web3.utils.toBN(block.timestamp).add(MINDELAY)); + expect(await this.mock.getTimestamp(this.operation.id)).to.be.bignumber.equal( + web3.utils.toBN(block.timestamp).add(MINDELAY), + ); }); it('prevent overwriting active operation', async function () { @@ -392,8 +368,9 @@ contract('TimelockController', function (accounts) { const block = await web3.eth.getBlock(receipt.receipt.blockHash); - expect(await this.mock.getTimestamp(this.operation.id)) - .to.be.bignumber.equal(web3.utils.toBN(block.timestamp).add(MINDELAY)); + expect(await this.mock.getTimestamp(this.operation.id)).to.be.bignumber.equal( + web3.utils.toBN(block.timestamp).add(MINDELAY), + ); }); it('prevent overwriting active operation', async function () { @@ -637,16 +614,8 @@ contract('TimelockController', function (accounts) { it('partial execution', async function () { const operation = genOperationBatch( - [ - this.callreceivermock.address, - this.callreceivermock.address, - this.callreceivermock.address, - ], - [ - 0, - 0, - 0, - ], + [this.callreceivermock.address, this.callreceivermock.address, this.callreceivermock.address], + [0, 0, 0], [ this.callreceivermock.contract.methods.mockFunction().encodeABI(), this.callreceivermock.contract.methods.mockFunctionThrows().encodeABI(), @@ -724,10 +693,7 @@ contract('TimelockController', function (accounts) { describe('maintenance', function () { it('prevent unauthorized maintenance', async function () { - await expectRevert( - this.mock.updateDelay(0, { from: other }), - 'TimelockController: caller must be timelock', - ); + await expectRevert(this.mock.updateDelay(0, { from: other }), 'TimelockController: caller must be timelock'); }); it('timelock scheduled maintenance', async function () { @@ -889,14 +855,9 @@ contract('TimelockController', function (accounts) { ); await time.increase(MINDELAY); await expectRevert( - this.mock.execute( - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - { from: executor }, - ), + this.mock.execute(operation.target, operation.value, operation.data, operation.predecessor, operation.salt, { + from: executor, + }), 'TimelockController: underlying transaction reverted', ); }); @@ -921,14 +882,9 @@ contract('TimelockController', function (accounts) { ); await time.increase(MINDELAY); await expectRevert( - this.mock.execute( - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - { from: executor }, - ), + this.mock.execute(operation.target, operation.value, operation.data, operation.predecessor, operation.salt, { + from: executor, + }), 'TimelockController: underlying transaction reverted', ); }); @@ -953,14 +909,10 @@ contract('TimelockController', function (accounts) { ); await time.increase(MINDELAY); await expectRevert( - this.mock.execute( - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - { from: executor, gas: '70000' }, - ), + this.mock.execute(operation.target, operation.value, operation.data, operation.predecessor, operation.salt, { + from: executor, + gas: '70000', + }), 'TimelockController: underlying transaction reverted', ); }); @@ -1025,14 +977,9 @@ contract('TimelockController', function (accounts) { expect(await web3.eth.getBalance(this.callreceivermock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); await expectRevert( - this.mock.execute( - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - { from: executor }, - ), + this.mock.execute(operation.target, operation.value, operation.data, operation.predecessor, operation.salt, { + from: executor, + }), 'TimelockController: underlying transaction reverted', ); @@ -1064,14 +1011,9 @@ contract('TimelockController', function (accounts) { expect(await web3.eth.getBalance(this.callreceivermock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); await expectRevert( - this.mock.execute( - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - { from: executor }, - ), + this.mock.execute(operation.target, operation.value, operation.data, operation.predecessor, operation.salt, { + from: executor, + }), 'TimelockController: underlying transaction reverted', ); diff --git a/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/test/governance/compatibility/GovernorCompatibilityBravo.test.js index 1c25be36a..231d57b27 100644 --- a/test/governance/compatibility/GovernorCompatibilityBravo.test.js +++ b/test/governance/compatibility/GovernorCompatibilityBravo.test.js @@ -9,12 +9,17 @@ const Timelock = artifacts.require('CompTimelock'); const Governor = artifacts.require('$GovernorCompatibilityBravoMock'); const CallReceiver = artifacts.require('CallReceiverMock'); -function makeContractAddress (creator, nonce) { - return web3.utils.toChecksumAddress(web3.utils.sha3(RLP.encode([creator, nonce])).slice(12).substring(14)); +function makeContractAddress(creator, nonce) { + return web3.utils.toChecksumAddress( + web3.utils + .sha3(RLP.encode([creator, nonce])) + .slice(12) + .substring(14), + ); } contract('GovernorCompatibilityBravo', function (accounts) { - const [ owner, proposer, voter1, voter2, voter3, voter4, other ] = accounts; + const [owner, proposer, voter1, voter2, voter3, voter4, other] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -27,7 +32,7 @@ contract('GovernorCompatibilityBravo', function (accounts) { const value = web3.utils.toWei('1'); beforeEach(async function () { - const [ deployer ] = await web3.eth.getAccounts(); + const [deployer] = await web3.eth.getAccounts(); this.token = await Token.new(tokenName, tokenSymbol, tokenName); @@ -58,13 +63,16 @@ contract('GovernorCompatibilityBravo', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - signature: 'mockFunction()', - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + signature: 'mockFunction()', + }, + ], + '', + ); }); it('deployment check', async function () { @@ -141,31 +149,19 @@ contract('GovernorCompatibilityBravo', function (accounts) { expect(voteReceipt4.support).to.be.bignumber.equal(Enums.VoteType.Abstain); expect(voteReceipt4.votes).to.be.bignumber.equal(web3.utils.toWei('2')); - expectEvent( - txPropose, - 'ProposalCreated', - { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values, - signatures: this.proposal.signatures.map(() => ''), // this event doesn't contain the proposal detail - calldatas: this.proposal.fulldata, - startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), - endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), - description: this.proposal.description, - }, - ); - expectEvent( - txExecute, - 'ProposalExecuted', - { proposalId: this.proposal.id }, - ); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalled', - ); + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values, + signatures: this.proposal.signatures.map(() => ''), // this event doesn't contain the proposal detail + calldatas: this.proposal.fulldata, + startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), + endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), + description: this.proposal.description, + }); + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); }); it('double voting is forbidden', async function () { @@ -180,16 +176,19 @@ contract('GovernorCompatibilityBravo', function (accounts) { it('with function selector and arguments', async function () { const target = this.receiver.address; - this.helper.setProposal([ - { target, data: this.receiver.contract.methods.mockFunction().encodeABI() }, - { target, data: this.receiver.contract.methods.mockFunctionWithArgs(17, 42).encodeABI() }, - { target, signature: 'mockFunctionNonPayable()' }, - { - target, - signature: 'mockFunctionWithArgs(uint256,uint256)', - data: web3.eth.abi.encodeParameters(['uint256', 'uint256'], [18, 43]), - }, - ], ''); + this.helper.setProposal( + [ + { target, data: this.receiver.contract.methods.mockFunction().encodeABI() }, + { target, data: this.receiver.contract.methods.mockFunctionWithArgs(17, 42).encodeABI() }, + { target, signature: 'mockFunctionNonPayable()' }, + { + target, + signature: 'mockFunctionWithArgs(uint256,uint256)', + data: web3.eth.abi.encodeParameters(['uint256', 'uint256'], [18, 43]), + }, + ], + '', + ); await this.helper.propose({ from: proposer }); await this.helper.waitForSnapshot(); @@ -199,37 +198,16 @@ contract('GovernorCompatibilityBravo', function (accounts) { await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalled', - ); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalled', - ); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalledWithArgs', - { a: '17', b: '42' }, - ); - await expectEvent.inTransaction( - txExecute.tx, - this.receiver, - 'MockFunctionCalledWithArgs', - { a: '18', b: '43' }, - ); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { a: '17', b: '42' }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { a: '18', b: '43' }); }); describe('should revert', function () { describe('on propose', function () { it('if proposal does not meet proposalThreshold', async function () { - await expectRevert( - this.helper.propose({ from: other }), - 'Governor: proposer votes below proposal threshold', - ); + await expectRevert(this.helper.propose({ from: other }), 'Governor: proposer votes below proposal threshold'); }); }); diff --git a/test/governance/extensions/GovernorComp.test.js b/test/governance/extensions/GovernorComp.test.js index d32480ec1..8d48b4ddc 100644 --- a/test/governance/extensions/GovernorComp.test.js +++ b/test/governance/extensions/GovernorComp.test.js @@ -8,7 +8,7 @@ const Governor = artifacts.require('$GovernorCompMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorComp', function (accounts) { - const [ owner, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -36,13 +36,16 @@ contract('GovernorComp', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); it('deployment check', async function () { diff --git a/test/governance/extensions/GovernorERC721.test.js b/test/governance/extensions/GovernorERC721.test.js index 4c402737b..b0babbd37 100644 --- a/test/governance/extensions/GovernorERC721.test.js +++ b/test/governance/extensions/GovernorERC721.test.js @@ -8,7 +8,7 @@ const Governor = artifacts.require('$GovernorVoteMocks'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorERC721', function (accounts) { - const [ owner, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -33,7 +33,7 @@ contract('GovernorERC721', function (accounts) { await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await Promise.all([ NFT0, NFT1, NFT2, NFT3, NFT4 ].map(tokenId => this.token.$_mint(owner, tokenId))); + await Promise.all([NFT0, NFT1, NFT2, NFT3, NFT4].map(tokenId => this.token.$_mint(owner, tokenId))); await this.helper.delegate({ token: this.token, to: voter1, tokenId: NFT0 }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT1 }, { from: owner }); await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT2 }, { from: owner }); @@ -41,13 +41,16 @@ contract('GovernorERC721', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, tokenId: NFT4 }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); it('deployment check', async function () { @@ -62,29 +65,29 @@ contract('GovernorERC721', function (accounts) { await this.helper.propose(); await this.helper.waitForSnapshot(); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'VoteCast', - { voter: voter1, support: Enums.VoteType.For, weight: '1' }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), 'VoteCast', { + voter: voter1, + support: Enums.VoteType.For, + weight: '1', + }); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), - 'VoteCast', - { voter: voter2, support: Enums.VoteType.For, weight: '2' }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { + voter: voter2, + support: Enums.VoteType.For, + weight: '2', + }); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), - 'VoteCast', - { voter: voter3, support: Enums.VoteType.Against, weight: '1' }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { + voter: voter3, + support: Enums.VoteType.Against, + weight: '1', + }); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), - 'VoteCast', - { voter: voter4, support: Enums.VoteType.Abstain, weight: '1' }, - ); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { + voter: voter4, + support: Enums.VoteType.Abstain, + weight: '1', + }); await this.helper.waitForDeadline(); await this.helper.execute(); diff --git a/test/governance/extensions/GovernorPreventLateQuorum.test.js b/test/governance/extensions/GovernorPreventLateQuorum.test.js index b179e26f7..ffec8ace6 100644 --- a/test/governance/extensions/GovernorPreventLateQuorum.test.js +++ b/test/governance/extensions/GovernorPreventLateQuorum.test.js @@ -8,7 +8,7 @@ const Governor = artifacts.require('$GovernorPreventLateQuorumMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorPreventLateQuorum', function (accounts) { - const [ owner, proposer, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -46,13 +46,16 @@ contract('GovernorPreventLateQuorum', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); it('deployment check', async function () { @@ -91,21 +94,17 @@ contract('GovernorPreventLateQuorum', function (accounts) { expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(endBlock); - expectEvent( - txPropose, - 'ProposalCreated', - { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values.map(value => new BN(value)), - signatures: this.proposal.signatures, - calldatas: this.proposal.data, - startBlock, - endBlock, - description: this.proposal.description, - }, - ); + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values.map(value => new BN(value)), + signatures: this.proposal.signatures, + calldatas: this.proposal.data, + startBlock, + endBlock, + description: this.proposal.description, + }); }); it('Delay is extended to prevent last minute take-over', async function () { @@ -138,39 +137,34 @@ contract('GovernorPreventLateQuorum', function (accounts) { expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Defeated); // check extension event - expectEvent( - txVote, - 'ProposalExtended', - { proposalId: this.proposal.id, extendedDeadline }, - ); + expectEvent(txVote, 'ProposalExtended', { proposalId: this.proposal.id, extendedDeadline }); }); describe('onlyGovernance updates', function () { it('setLateQuorumVoteExtension is protected', async function () { - await expectRevert( - this.mock.setLateQuorumVoteExtension(0), - 'Governor: onlyGovernance', - ); + await expectRevert(this.mock.setLateQuorumVoteExtension(0), 'Governor: onlyGovernance'); }); it('can setLateQuorumVoteExtension through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.setLateQuorumVoteExtension('0').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setLateQuorumVoteExtension('0').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.execute(), - 'LateQuorumVoteExtensionSet', - { oldVoteExtension: lateQuorumVoteExtension, newVoteExtension: '0' }, - ); + expectEvent(await this.helper.execute(), 'LateQuorumVoteExtensionSet', { + oldVoteExtension: lateQuorumVoteExtension, + newVoteExtension: '0', + }); expect(await this.mock.lateQuorumVoteExtension()).to.be.bignumber.equal('0'); }); diff --git a/test/governance/extensions/GovernorTimelockCompound.test.js b/test/governance/extensions/GovernorTimelockCompound.test.js index 3e8e10b10..334659e07 100644 --- a/test/governance/extensions/GovernorTimelockCompound.test.js +++ b/test/governance/extensions/GovernorTimelockCompound.test.js @@ -4,21 +4,24 @@ const RLP = require('rlp'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const { - shouldSupportInterfaces, -} = require('../../utils/introspection/SupportsInterface.behavior'); +const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('CompTimelock'); const Governor = artifacts.require('$GovernorTimelockCompoundMock'); const CallReceiver = artifacts.require('CallReceiverMock'); -function makeContractAddress (creator, nonce) { - return web3.utils.toChecksumAddress(web3.utils.sha3(RLP.encode([creator, nonce])).slice(12).substring(14)); +function makeContractAddress(creator, nonce) { + return web3.utils.toChecksumAddress( + web3.utils + .sha3(RLP.encode([creator, nonce])) + .slice(12) + .substring(14), + ); } contract('GovernorTimelockCompound', function (accounts) { - const [ owner, voter1, voter2, voter3, voter4, other ] = accounts; + const [owner, voter1, voter2, voter3, voter4, other] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -30,7 +33,7 @@ contract('GovernorTimelockCompound', function (accounts) { const value = web3.utils.toWei('1'); beforeEach(async function () { - const [ deployer ] = await web3.eth.getAccounts(); + const [deployer] = await web3.eth.getAccounts(); this.token = await Token.new(tokenName, tokenSymbol, tokenName); @@ -39,15 +42,7 @@ contract('GovernorTimelockCompound', function (accounts) { const predictGovernor = makeContractAddress(deployer, nonce + 1); this.timelock = await Timelock.new(predictGovernor, 2 * 86400); - this.mock = await Governor.new( - name, - votingDelay, - votingPeriod, - 0, - this.timelock.address, - this.token.address, - 0, - ); + this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.timelock.address, this.token.address, 0); this.receiver = await CallReceiver.new(); this.helper = new GovernorHelper(this.mock); @@ -61,23 +56,21 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); - shouldSupportInterfaces([ - 'ERC165', - 'Governor', - 'GovernorWithParams', - 'GovernorTimelock', - ]); + shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); - it('doesn\'t accept ether transfers', async function () { + it("doesn't accept ether transfers", async function () { await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); }); @@ -129,20 +122,14 @@ contract('GovernorTimelockCompound', function (accounts) { target: this.token.address, data: this.token.contract.methods.approve(this.receiver.address, constants.MAX_UINT256).encodeABI(), }; - this.helper.setProposal([ action, action ], ''); + this.helper.setProposal([action, action], ''); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - await expectRevert( - this.helper.queue(), - 'GovernorTimelockCompound: identical proposal action already queued', - ); - await expectRevert( - this.helper.execute(), - 'GovernorTimelockCompound: proposal not yet queued', - ); + await expectRevert(this.helper.queue(), 'GovernorTimelockCompound: identical proposal action already queued'); + await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); }); }); @@ -155,10 +142,7 @@ contract('GovernorTimelockCompound', function (accounts) { expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); - await expectRevert( - this.helper.execute(), - 'GovernorTimelockCompound: proposal not yet queued', - ); + await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); }); it('if too early', async function () { @@ -172,7 +156,7 @@ contract('GovernorTimelockCompound', function (accounts) { await expectRevert( this.helper.execute(), - 'Timelock::executeTransaction: Transaction hasn\'t surpassed time lock', + "Timelock::executeTransaction: Transaction hasn't surpassed time lock", ); }); @@ -186,10 +170,7 @@ contract('GovernorTimelockCompound', function (accounts) { expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Expired); - await expectRevert( - this.helper.execute(), - 'Governor: proposal not successful', - ); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); }); it('if already executed', async function () { @@ -200,10 +181,7 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.queue(); await this.helper.waitForEta(); await this.helper.execute(); - await expectRevert( - this.helper.execute(), - 'Governor: proposal not successful', - ); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); }); }); }); @@ -215,11 +193,7 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.cancel(), - 'ProposalCanceled', - { proposalId: this.proposal.id }, - ); + expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); @@ -232,11 +206,7 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.waitForDeadline(); await this.helper.queue(); - expectEvent( - await this.helper.cancel(), - 'ProposalCanceled', - { proposalId: this.proposal.id }, - ); + expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); @@ -251,26 +221,23 @@ contract('GovernorTimelockCompound', function (accounts) { it('is protected', async function () { await expectRevert( - this.mock.relay( - this.token.address, - 0, - this.token.contract.methods.transfer(other, 1).encodeABI(), - ), + this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), 'Governor: onlyGovernance', ); }); it('can be executed through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.relay( - this.token.address, - 0, - this.token.contract.methods.transfer(other, 1).encodeABI(), - ).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods + .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) + .encodeABI(), + }, + ], + '', + ); expect(await this.token.balanceOf(this.mock.address), 1); expect(await this.token.balanceOf(other), 0); @@ -286,12 +253,11 @@ contract('GovernorTimelockCompound', function (accounts) { expect(await this.token.balanceOf(this.mock.address), 0); expect(await this.token.balanceOf(other), 1); - expectEvent.inTransaction( - txExecute.tx, - this.token, - 'Transfer', - { from: this.mock.address, to: other, value: '1' }, - ); + expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + from: this.mock.address, + to: other, + value: '1', + }); }); }); @@ -301,23 +267,23 @@ contract('GovernorTimelockCompound', function (accounts) { }); it('is protected', async function () { - await expectRevert( - this.mock.updateTimelock(this.newTimelock.address), - 'Governor: onlyGovernance', - ); + await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); }); it('can be executed through governance to', async function () { - this.helper.setProposal([ - { - target: this.timelock.address, - data: this.timelock.contract.methods.setPendingAdmin(owner).encodeABI(), - }, - { - target: this.mock.address, - data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.timelock.address, + data: this.timelock.contract.methods.setPendingAdmin(owner).encodeABI(), + }, + { + target: this.mock.address, + data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -327,11 +293,10 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - expectEvent( - txExecute, - 'TimelockChange', - { oldTimelock: this.timelock.address, newTimelock: this.newTimelock.address }, - ); + expectEvent(txExecute, 'TimelockChange', { + oldTimelock: this.timelock.address, + newTimelock: this.newTimelock.address, + }); expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); }); @@ -339,12 +304,15 @@ contract('GovernorTimelockCompound', function (accounts) { it('can transfer timelock to new governor', async function () { const newGovernor = await Governor.new(name, 8, 32, 0, this.timelock.address, this.token.address, 0); - this.helper.setProposal([ - { - target: this.timelock.address, - data: this.timelock.contract.methods.setPendingAdmin(newGovernor.address).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.timelock.address, + data: this.timelock.contract.methods.setPendingAdmin(newGovernor.address).encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -354,12 +322,9 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - await expectEvent.inTransaction( - txExecute.tx, - this.timelock, - 'NewPendingAdmin', - { newPendingAdmin: newGovernor.address }, - ); + await expectEvent.inTransaction(txExecute.tx, this.timelock, 'NewPendingAdmin', { + newPendingAdmin: newGovernor.address, + }); await newGovernor.__acceptAdmin(); expect(await this.timelock.admin()).to.be.bignumber.equal(newGovernor.address); diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 167734e9b..2e8c75888 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -3,9 +3,7 @@ const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const { - shouldSupportInterfaces, -} = require('../../utils/introspection/SupportsInterface.behavior'); +const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('TimelockController'); @@ -13,7 +11,7 @@ const Governor = artifacts.require('$GovernorTimelockControlMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorTimelockControl', function (accounts) { - const [ owner, voter1, voter2, voter3, voter4, other ] = accounts; + const [owner, voter1, voter2, voter3, voter4, other] = accounts; const TIMELOCK_ADMIN_ROLE = web3.utils.soliditySha3('TIMELOCK_ADMIN_ROLE'); const PROPOSER_ROLE = web3.utils.soliditySha3('PROPOSER_ROLE'); @@ -30,19 +28,11 @@ contract('GovernorTimelockControl', function (accounts) { const value = web3.utils.toWei('1'); beforeEach(async function () { - const [ deployer ] = await web3.eth.getAccounts(); + const [deployer] = await web3.eth.getAccounts(); this.token = await Token.new(tokenName, tokenSymbol, tokenName); this.timelock = await Timelock.new(3600, [], [], deployer); - this.mock = await Governor.new( - name, - votingDelay, - votingPeriod, - 0, - this.timelock.address, - this.token.address, - 0, - ); + this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.timelock.address, this.token.address, 0); this.receiver = await CallReceiver.new(); this.helper = new GovernorHelper(this.mock); @@ -69,13 +59,16 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); this.proposal.timelockid = await this.timelock.hashOperationBatch( ...this.proposal.shortProposal.slice(0, 3), '0x0', @@ -83,14 +76,9 @@ contract('GovernorTimelockControl', function (accounts) { ); }); - shouldSupportInterfaces([ - 'ERC165', - 'Governor', - 'GovernorWithParams', - 'GovernorTimelock', - ]); + shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); - it('doesn\'t accept ether transfers', async function () { + it("doesn't accept ether transfers", async function () { await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); }); @@ -197,11 +185,7 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.cancel(), - 'ProposalCanceled', - { proposalId: this.proposal.id }, - ); + expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); @@ -214,11 +198,7 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.waitForDeadline(); await this.helper.queue(); - expectEvent( - await this.helper.cancel(), - 'ProposalCanceled', - { proposalId: this.proposal.id }, - ); + expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); @@ -233,11 +213,9 @@ contract('GovernorTimelockControl', function (accounts) { expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); - expectEvent( - await this.timelock.cancel(this.proposal.timelockid, { from: owner }), - 'Cancelled', - { id: this.proposal.timelockid }, - ); + expectEvent(await this.timelock.cancel(this.proposal.timelockid, { from: owner }), 'Cancelled', { + id: this.proposal.timelockid, + }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); }); @@ -251,26 +229,23 @@ contract('GovernorTimelockControl', function (accounts) { it('is protected', async function () { await expectRevert( - this.mock.relay( - this.token.address, - 0, - this.token.contract.methods.transfer(other, 1).encodeABI(), - ), + this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), 'Governor: onlyGovernance', ); }); it('can be executed through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.relay( - this.token.address, - 0, - this.token.contract.methods.transfer(other, 1).encodeABI(), - ).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods + .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) + .encodeABI(), + }, + ], + '', + ); expect(await this.token.balanceOf(this.mock.address), 1); expect(await this.token.balanceOf(other), 0); @@ -286,29 +261,27 @@ contract('GovernorTimelockControl', function (accounts) { expect(await this.token.balanceOf(this.mock.address), 0); expect(await this.token.balanceOf(other), 1); - expectEvent.inTransaction( - txExecute.tx, - this.token, - 'Transfer', - { from: this.mock.address, to: other, value: '1' }, - ); + expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + from: this.mock.address, + to: other, + value: '1', + }); }); it('is payable and can transfer eth to EOA', async function () { const t2g = web3.utils.toBN(128); // timelock to governor const g2o = web3.utils.toBN(100); // governor to eoa (other) - this.helper.setProposal([ - { - target: this.mock.address, - value: t2g, - data: this.mock.contract.methods.relay( - other, - g2o, - '0x', - ).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + value: t2g, + data: this.mock.contract.methods.relay(other, g2o, '0x').encodeABI(), + }, + ], + '', + ); expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); const timelockBalance = await web3.eth.getBalance(this.timelock.address).then(web3.utils.toBN); @@ -356,28 +329,23 @@ contract('GovernorTimelockControl', function (accounts) { describe('updateTimelock', function () { beforeEach(async function () { - this.newTimelock = await Timelock.new( - 3600, - [ this.mock.address ], - [ this.mock.address ], - constants.ZERO_ADDRESS, - ); + this.newTimelock = await Timelock.new(3600, [this.mock.address], [this.mock.address], constants.ZERO_ADDRESS); }); it('is protected', async function () { - await expectRevert( - this.mock.updateTimelock(this.newTimelock.address), - 'Governor: onlyGovernance', - ); + await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); }); it('can be executed through governance to', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); @@ -387,11 +355,10 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - expectEvent( - txExecute, - 'TimelockChange', - { oldTimelock: this.timelock.address, newTimelock: this.newTimelock.address }, - ); + expectEvent(txExecute, 'TimelockChange', { + oldTimelock: this.timelock.address, + newTimelock: this.newTimelock.address, + }); expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); }); @@ -399,12 +366,15 @@ contract('GovernorTimelockControl', function (accounts) { }); it('clear queue of pending governor calls', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.nonGovernanceFunction().encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.nonGovernanceFunction().encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); diff --git a/test/governance/extensions/GovernorVotesQuorumFraction.test.js b/test/governance/extensions/GovernorVotesQuorumFraction.test.js index 763f03068..84d36f926 100644 --- a/test/governance/extensions/GovernorVotesQuorumFraction.test.js +++ b/test/governance/extensions/GovernorVotesQuorumFraction.test.js @@ -8,7 +8,7 @@ const Governor = artifacts.require('$GovernorMock'); const CallReceiver = artifacts.require('CallReceiverMock'); contract('GovernorVotesQuorumFraction', function (accounts) { - const [ owner, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; // const version = '1'; @@ -24,14 +24,7 @@ contract('GovernorVotesQuorumFraction', function (accounts) { beforeEach(async function () { this.owner = owner; this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new( - name, - votingDelay, - votingPeriod, - 0, - this.token.address, - ratio, - ); + this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.token.address, ratio); this.receiver = await CallReceiver.new(); this.helper = new GovernorHelper(this.mock); @@ -45,13 +38,16 @@ contract('GovernorVotesQuorumFraction', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); it('deployment check', async function () { @@ -62,8 +58,9 @@ contract('GovernorVotesQuorumFraction', function (accounts) { expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(ratio); expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))) - .to.be.bignumber.equal(tokenSupply.mul(ratio).divn(100)); + expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( + tokenSupply.mul(ratio).divn(100), + ); }); it('quroum reached', async function () { @@ -84,61 +81,62 @@ contract('GovernorVotesQuorumFraction', function (accounts) { describe('onlyGovernance updates', function () { it('updateQuorumNumerator is protected', async function () { - await expectRevert( - this.mock.updateQuorumNumerator(newRatio), - 'Governor: onlyGovernance', - ); + await expectRevert(this.mock.updateQuorumNumerator(newRatio), 'Governor: onlyGovernance'); }); it('can updateQuorumNumerator through governance', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.updateQuorumNumerator(newRatio).encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateQuorumNumerator(newRatio).encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent( - await this.helper.execute(), - 'QuorumNumeratorUpdated', - { oldQuorumNumerator: ratio, newQuorumNumerator: newRatio }, - ); + expectEvent(await this.helper.execute(), 'QuorumNumeratorUpdated', { + oldQuorumNumerator: ratio, + newQuorumNumerator: newRatio, + }); expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(newRatio); expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); // it takes one block for the new quorum to take effect - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))) - .to.be.bignumber.equal(tokenSupply.mul(ratio).divn(100)); + expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( + tokenSupply.mul(ratio).divn(100), + ); await time.advanceBlock(); - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))) - .to.be.bignumber.equal(tokenSupply.mul(newRatio).divn(100)); + expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( + tokenSupply.mul(newRatio).divn(100), + ); }); it('cannot updateQuorumNumerator over the maximum', async function () { - this.helper.setProposal([ - { - target: this.mock.address, - data: this.mock.contract.methods.updateQuorumNumerator('101').encodeABI(), - }, - ], ''); + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateQuorumNumerator('101').encodeABI(), + }, + ], + '', + ); await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - await expectRevert( - this.helper.execute(), - 'GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator', - ); + await expectRevert(this.helper.execute(), 'GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator'); }); }); }); diff --git a/test/governance/extensions/GovernorWithParams.test.js b/test/governance/extensions/GovernorWithParams.test.js index 981fe0715..26e948544 100644 --- a/test/governance/extensions/GovernorWithParams.test.js +++ b/test/governance/extensions/GovernorWithParams.test.js @@ -16,13 +16,10 @@ const rawParams = { strParam: 'These are my params', }; -const encodedParams = web3.eth.abi.encodeParameters( - [ 'uint256', 'string' ], - Object.values(rawParams), -); +const encodedParams = web3.eth.abi.encodeParameters(['uint256', 'string'], Object.values(rawParams)); contract('GovernorWithParams', function (accounts) { - const [ owner, proposer, voter1, voter2, voter3, voter4 ] = accounts; + const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; const version = '1'; @@ -50,13 +47,16 @@ contract('GovernorWithParams', function (accounts) { await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); // default proposal - this.proposal = this.helper.setProposal([ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], ''); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); it('deployment check', async function () { @@ -89,11 +89,14 @@ contract('GovernorWithParams', function (accounts) { const weight = new BN(web3.utils.toWei('7')).sub(rawParams.uintParam); - const tx = await this.helper.vote({ - support: Enums.VoteType.For, - reason: 'no particular reason', - params: encodedParams, - }, { from: voter2 }); + const tx = await this.helper.vote( + { + support: Enums.VoteType.For, + reason: 'no particular reason', + params: encodedParams, + }, + { from: voter2 }, + ); expectEvent(tx, 'CountParams', { ...rawParams }); expectEvent(tx, 'VoteCastWithParams', { @@ -113,10 +116,9 @@ contract('GovernorWithParams', function (accounts) { const voterBySig = Wallet.generate(); const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const signature = async (message) => { - return fromRpcSig(ethSigUtil.signTypedMessage( - voterBySig.getPrivateKey(), - { + const signature = async message => { + return fromRpcSig( + ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data: { types: { EIP712Domain, @@ -131,8 +133,8 @@ contract('GovernorWithParams', function (accounts) { primaryType: 'ExtendedBallot', message, }, - }, - )); + }), + ); }; await this.token.delegate(voterBySigAddress, { from: voter2 }); diff --git a/test/governance/utils/Votes.behavior.js b/test/governance/utils/Votes.behavior.js index fc3af64dd..5062a9c97 100644 --- a/test/governance/utils/Votes.behavior.js +++ b/test/governance/utils/Votes.behavior.js @@ -16,16 +16,14 @@ const Delegation = [ const version = '1'; -function shouldBehaveLikeVotes () { +function shouldBehaveLikeVotes() { describe('run votes workflow', function () { it('initial nonce is 0', async function () { expect(await this.votes.nonces(this.account1)).to.be.bignumber.equal('0'); }); it('domain separator', async function () { - expect( - await this.votes.DOMAIN_SEPARATOR(), - ).to.equal( + expect(await this.votes.DOMAIN_SEPARATOR()).to.equal( await domainSeparator({ name: this.name, version, @@ -54,14 +52,16 @@ function shouldBehaveLikeVotes () { }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.votes.address, this.name, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); expect(await this.votes.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -86,14 +86,16 @@ function shouldBehaveLikeVotes () { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.votes.address, this.name, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await this.votes.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -104,14 +106,16 @@ function shouldBehaveLikeVotes () { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.votes.address, this.name, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); const receipt = await this.votes.delegateBySig(this.account1Delegatee, nonce, MAX_UINT256, v, r, s); const { args } = receipt.logs.find(({ event }) => event === 'DelegateChanged'); @@ -121,14 +125,16 @@ function shouldBehaveLikeVotes () { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.votes.address, this.name, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await expectRevert( this.votes.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'Votes: invalid nonce', @@ -137,14 +143,16 @@ function shouldBehaveLikeVotes () { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.votes.address, this.name, { + delegatee: delegatorAddress, + nonce, + expiry, + }), + ), + ); await expectRevert( this.votes.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), @@ -239,10 +247,7 @@ function shouldBehaveLikeVotes () { }); it('reverts if block number >= current block', async function () { - await expectRevert( - this.votes.getPastTotalSupply(5e10), - 'block not yet mined', - ); + await expectRevert(this.votes.getPastTotalSupply(5e10), 'block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { @@ -311,10 +316,7 @@ function shouldBehaveLikeVotes () { describe('getPastVotes', function () { it('reverts if block number >= current block', async function () { - await expectRevert( - this.votes.getPastVotes(this.account2, 5e10), - 'block not yet mined', - ); + await expectRevert(this.votes.getPastVotes(this.account2, 5e10), 'block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { diff --git a/test/governance/utils/Votes.test.js b/test/governance/utils/Votes.test.js index e9b50b0a3..7cf998b2d 100644 --- a/test/governance/utils/Votes.test.js +++ b/test/governance/utils/Votes.test.js @@ -4,14 +4,12 @@ const { expect } = require('chai'); const { getChainId } = require('../../helpers/chainid'); -const { - shouldBehaveLikeVotes, -} = require('./Votes.behavior'); +const { shouldBehaveLikeVotes } = require('./Votes.behavior'); const Votes = artifacts.require('$VotesMock'); contract('Votes', function (accounts) { - const [ account1, account2, account3 ] = accounts; + const [account1, account2, account3] = accounts; beforeEach(async function () { this.name = 'My Vote'; this.votes = await Votes.new(this.name, '1'); @@ -29,10 +27,7 @@ contract('Votes', function (accounts) { }); it('reverts if block number >= current block', async function () { - await expectRevert( - this.votes.getPastTotalSupply(this.tx3.receipt.blockNumber + 1), - 'Votes: block not yet mined', - ); + await expectRevert(this.votes.getPastTotalSupply(this.tx3.receipt.blockNumber + 1), 'Votes: block not yet mined'); }); it('delegates', async function () { diff --git a/test/helpers/chainid.js b/test/helpers/chainid.js index f67b91bda..58757eb80 100644 --- a/test/helpers/chainid.js +++ b/test/helpers/chainid.js @@ -1,6 +1,6 @@ const hre = require('hardhat'); -async function getChainId () { +async function getChainId() { const chainIdHex = await hre.network.provider.send('eth_chainId', []); return new hre.web3.utils.BN(chainIdHex, 'hex'); } diff --git a/test/helpers/create2.js b/test/helpers/create2.js index 3e57764c8..afe07dae3 100644 --- a/test/helpers/create2.js +++ b/test/helpers/create2.js @@ -1,10 +1,9 @@ -function computeCreate2Address (saltHex, bytecode, deployer) { - return web3.utils.toChecksumAddress(`0x${web3.utils.sha3(`0x${[ - 'ff', - deployer, - saltHex, - web3.utils.soliditySha3(bytecode), - ].map(x => x.replace(/0x/, '')).join('')}`).slice(-40)}`); +function computeCreate2Address(saltHex, bytecode, deployer) { + return web3.utils.toChecksumAddress( + `0x${web3.utils + .sha3(`0x${['ff', deployer, saltHex, web3.utils.soliditySha3(bytecode)].map(x => x.replace(/0x/, '')).join('')}`) + .slice(-40)}`, + ); } module.exports = { diff --git a/test/helpers/crosschain.js b/test/helpers/crosschain.js index d4d25d1a1..9e6ff9610 100644 --- a/test/helpers/crosschain.js +++ b/test/helpers/crosschain.js @@ -7,54 +7,52 @@ const BridgeOptimismMock = artifacts.require('BridgeOptimismMock'); const BridgePolygonChildMock = artifacts.require('BridgePolygonChildMock'); class BridgeHelper { - static async deploy (type) { + static async deploy(type) { return new BridgeHelper(await deployBridge(type)); } - constructor (bridge) { + constructor(bridge) { this.bridge = bridge; this.address = bridge.address; } - call (from, target, selector = undefined, args = []) { + call(from, target, selector = undefined, args = []) { return this.bridge.relayAs( target.address || target, - selector - ? target.contract.methods[selector](...args).encodeABI() - : '0x', + selector ? target.contract.methods[selector](...args).encodeABI() : '0x', from, ); } } -async function deployBridge (type = 'Arbitrum-L2') { +async function deployBridge(type = 'Arbitrum-L2') { switch (type) { - case 'AMB': - return BridgeAMBMock.new(); + case 'AMB': + return BridgeAMBMock.new(); - case 'Arbitrum-L1': - return BridgeArbitrumL1Mock.new(); + case 'Arbitrum-L1': + return BridgeArbitrumL1Mock.new(); - case 'Arbitrum-L2': { - const instance = await BridgeArbitrumL2Mock.new(); - const code = await web3.eth.getCode(instance.address); - await promisify(web3.currentProvider.send.bind(web3.currentProvider))({ - jsonrpc: '2.0', - method: 'hardhat_setCode', - params: [ '0x0000000000000000000000000000000000000064', code ], - id: new Date().getTime(), - }); - return BridgeArbitrumL2Mock.at('0x0000000000000000000000000000000000000064'); - } + case 'Arbitrum-L2': { + const instance = await BridgeArbitrumL2Mock.new(); + const code = await web3.eth.getCode(instance.address); + await promisify(web3.currentProvider.send.bind(web3.currentProvider))({ + jsonrpc: '2.0', + method: 'hardhat_setCode', + params: ['0x0000000000000000000000000000000000000064', code], + id: new Date().getTime(), + }); + return BridgeArbitrumL2Mock.at('0x0000000000000000000000000000000000000064'); + } - case 'Optimism': - return BridgeOptimismMock.new(); + case 'Optimism': + return BridgeOptimismMock.new(); - case 'Polygon-Child': - return BridgePolygonChildMock.new(); + case 'Polygon-Child': + return BridgePolygonChildMock.new(); - default: - throw new Error(`CrossChain: ${type} is not supported`); + default: + throw new Error(`CrossChain: ${type} is not supported`); } } diff --git a/test/helpers/customError.js b/test/helpers/customError.js index 8fea43426..3cfcd7277 100644 --- a/test/helpers/customError.js +++ b/test/helpers/customError.js @@ -3,10 +3,10 @@ const { config } = require('hardhat'); const optimizationsEnabled = config.solidity.compilers.some(c => c.settings.optimizer.enabled); /** Revert handler that supports custom errors. */ -async function expectRevertCustomError (promise, reason) { +async function expectRevertCustomError(promise, reason) { try { await promise; - expect.fail('Expected promise to throw but it didn\'t'); + expect.fail("Expected promise to throw but it didn't"); } catch (revert) { if (reason) { if (optimizationsEnabled) { @@ -17,7 +17,7 @@ async function expectRevertCustomError (promise, reason) { } } } -}; +} module.exports = { expectRevertCustomError, diff --git a/test/helpers/eip712.js b/test/helpers/eip712.js index 26e2218bb..9851df662 100644 --- a/test/helpers/eip712.js +++ b/test/helpers/eip712.js @@ -16,15 +16,15 @@ const Permit = [ { name: 'deadline', type: 'uint256' }, ]; -function bufferToHexString (buffer) { +function bufferToHexString(buffer) { return '0x' + buffer.toString('hex'); } -function hexStringToBuffer (hexstr) { +function hexStringToBuffer(hexstr) { return Buffer.from(hexstr.replace(/^0x/, ''), 'hex'); } -async function domainSeparator ({ name, version, chainId, verifyingContract }) { +async function domainSeparator({ name, version, chainId, verifyingContract }) { return bufferToHexString( ethSigUtil.TypedDataUtils.hashStruct( 'EIP712Domain', @@ -34,12 +34,10 @@ async function domainSeparator ({ name, version, chainId, verifyingContract }) { ); } -async function hashTypedData (domain, structHash) { - return domainSeparator(domain).then(separator => bufferToHexString(keccak256(Buffer.concat([ - '0x1901', - separator, - structHash, - ].map(str => hexStringToBuffer(str)))))); +async function hashTypedData(domain, structHash) { + return domainSeparator(domain).then(separator => + bufferToHexString(keccak256(Buffer.concat(['0x1901', separator, structHash].map(str => hexStringToBuffer(str))))), + ); } module.exports = { diff --git a/test/helpers/enums.js b/test/helpers/enums.js index 26825de33..ced6c3858 100644 --- a/test/helpers/enums.js +++ b/test/helpers/enums.js @@ -1,29 +1,12 @@ const { BN } = require('@openzeppelin/test-helpers'); -function Enum (...options) { - return Object.fromEntries(options.map((key, i) => [ key, new BN(i) ])); +function Enum(...options) { + return Object.fromEntries(options.map((key, i) => [key, new BN(i)])); } module.exports = { Enum, - ProposalState: Enum( - 'Pending', - 'Active', - 'Canceled', - 'Defeated', - 'Succeeded', - 'Queued', - 'Expired', - 'Executed', - ), - VoteType: Enum( - 'Against', - 'For', - 'Abstain', - ), - Rounding: Enum( - 'Down', - 'Up', - 'Zero', - ), + ProposalState: Enum('Pending', 'Active', 'Canceled', 'Defeated', 'Succeeded', 'Queued', 'Expired', 'Executed'), + VoteType: Enum('Against', 'For', 'Abstain'), + Rounding: Enum('Down', 'Up', 'Zero'), }; diff --git a/test/helpers/erc1967.js b/test/helpers/erc1967.js index aab0e2288..9abbcc8b9 100644 --- a/test/helpers/erc1967.js +++ b/test/helpers/erc1967.js @@ -2,11 +2,11 @@ const ImplementationLabel = 'eip1967.proxy.implementation'; const AdminLabel = 'eip1967.proxy.admin'; const BeaconLabel = 'eip1967.proxy.beacon'; -function labelToSlot (label) { +function labelToSlot(label) { return '0x' + web3.utils.toBN(web3.utils.keccak256(label)).subn(1).toString(16); } -function getSlot (address, slot) { +function getSlot(address, slot) { return web3.eth.getStorageAt( web3.utils.isAddress(address) ? address : address.address, web3.utils.isHex(slot) ? slot : labelToSlot(slot), diff --git a/test/helpers/governance.js b/test/helpers/governance.js index 66a479b52..ff341aa12 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -1,37 +1,38 @@ const { time } = require('@openzeppelin/test-helpers'); -function zip (...args) { +function zip(...args) { return Array(Math.max(...args.map(array => array.length))) .fill() .map((_, i) => args.map(array => array[i])); } -function concatHex (...args) { +function concatHex(...args) { return web3.utils.bytesToHex([].concat(...args.map(h => web3.utils.hexToBytes(h || '0x')))); } -function concatOpts (args, opts = null) { +function concatOpts(args, opts = null) { return opts ? args.concat(opts) : args; } class GovernorHelper { - constructor (governor) { + constructor(governor) { this.governor = governor; } - delegate (delegation = {}, opts = null) { + delegate(delegation = {}, opts = null) { return Promise.all([ delegation.token.delegate(delegation.to, { from: delegation.to }), - delegation.value && - delegation.token.transfer(...concatOpts([ delegation.to, delegation.value ]), opts), + delegation.value && delegation.token.transfer(...concatOpts([delegation.to, delegation.value]), opts), delegation.tokenId && - delegation.token.ownerOf(delegation.tokenId).then(owner => - delegation.token.transferFrom(...concatOpts([ owner, delegation.to, delegation.tokenId ], opts)), - ), + delegation.token + .ownerOf(delegation.tokenId) + .then(owner => + delegation.token.transferFrom(...concatOpts([owner, delegation.to, delegation.tokenId], opts)), + ), ]); } - propose (opts = null) { + propose(opts = null) { const proposal = this.currentProposal; return this.governor.methods[ @@ -41,104 +42,90 @@ class GovernorHelper { ](...concatOpts(proposal.fullProposal, opts)); } - queue (opts = null) { + queue(opts = null) { const proposal = this.currentProposal; return proposal.useCompatibilityInterface - ? this.governor.methods['queue(uint256)'](...concatOpts( - [ proposal.id ], - opts, - )) - : this.governor.methods['queue(address[],uint256[],bytes[],bytes32)'](...concatOpts( - proposal.shortProposal, - opts, - )); + ? this.governor.methods['queue(uint256)'](...concatOpts([proposal.id], opts)) + : this.governor.methods['queue(address[],uint256[],bytes[],bytes32)']( + ...concatOpts(proposal.shortProposal, opts), + ); } - execute (opts = null) { + execute(opts = null) { const proposal = this.currentProposal; return proposal.useCompatibilityInterface - ? this.governor.methods['execute(uint256)'](...concatOpts( - [ proposal.id ], - opts, - )) - : this.governor.methods['execute(address[],uint256[],bytes[],bytes32)'](...concatOpts( - proposal.shortProposal, - opts, - )); + ? this.governor.methods['execute(uint256)'](...concatOpts([proposal.id], opts)) + : this.governor.methods['execute(address[],uint256[],bytes[],bytes32)']( + ...concatOpts(proposal.shortProposal, opts), + ); } - cancel (opts = null) { + cancel(opts = null) { const proposal = this.currentProposal; return proposal.useCompatibilityInterface - ? this.governor.methods['cancel(uint256)'](...concatOpts( - [ proposal.id ], - opts, - )) - : this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)'](...concatOpts( - proposal.shortProposal, - opts, - )); + ? this.governor.methods['cancel(uint256)'](...concatOpts([proposal.id], opts)) + : this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)']( + ...concatOpts(proposal.shortProposal, opts), + ); } - vote (vote = {}, opts = null) { + vote(vote = {}, opts = null) { const proposal = this.currentProposal; return vote.signature - // if signature, and either params or reason → - ? vote.params || vote.reason - ? vote.signature({ - proposalId: proposal.id, - support: vote.support, - reason: vote.reason || '', - params: vote.params || '', - }).then(({ v, r, s }) => this.governor.castVoteWithReasonAndParamsBySig(...concatOpts( - [ proposal.id, vote.support, vote.reason || '', vote.params || '', v, r, s ], - opts, - ))) - : vote.signature({ - proposalId: proposal.id, - support: vote.support, - }).then(({ v, r, s }) => this.governor.castVoteBySig(...concatOpts( - [ proposal.id, vote.support, v, r, s ], - opts, - ))) + ? // if signature, and either params or reason → + vote.params || vote.reason + ? vote + .signature({ + proposalId: proposal.id, + support: vote.support, + reason: vote.reason || '', + params: vote.params || '', + }) + .then(({ v, r, s }) => + this.governor.castVoteWithReasonAndParamsBySig( + ...concatOpts([proposal.id, vote.support, vote.reason || '', vote.params || '', v, r, s], opts), + ), + ) + : vote + .signature({ + proposalId: proposal.id, + support: vote.support, + }) + .then(({ v, r, s }) => + this.governor.castVoteBySig(...concatOpts([proposal.id, vote.support, v, r, s], opts)), + ) : vote.params - // otherwise if params - ? this.governor.castVoteWithReasonAndParams(...concatOpts( - [ proposal.id, vote.support, vote.reason || '', vote.params ], - opts, - )) - : vote.reason - // otherwise if reason - ? this.governor.castVoteWithReason(...concatOpts( - [ proposal.id, vote.support, vote.reason ], - opts, - )) - : this.governor.castVote(...concatOpts( - [ proposal.id, vote.support ], - opts, - )); + ? // otherwise if params + this.governor.castVoteWithReasonAndParams( + ...concatOpts([proposal.id, vote.support, vote.reason || '', vote.params], opts), + ) + : vote.reason + ? // otherwise if reason + this.governor.castVoteWithReason(...concatOpts([proposal.id, vote.support, vote.reason], opts)) + : this.governor.castVote(...concatOpts([proposal.id, vote.support], opts)); } - waitForSnapshot (offset = 0) { + waitForSnapshot(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalSnapshot(proposal.id) + return this.governor + .proposalSnapshot(proposal.id) .then(blockNumber => time.advanceBlockTo(blockNumber.addn(offset))); } - waitForDeadline (offset = 0) { + waitForDeadline(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalDeadline(proposal.id) + return this.governor + .proposalDeadline(proposal.id) .then(blockNumber => time.advanceBlockTo(blockNumber.addn(offset))); } - waitForEta (offset = 0) { + waitForEta(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalEta(proposal.id) - .then(timestamp => time.increaseTo(timestamp.addn(offset))); + return this.governor.proposalEta(proposal.id).then(timestamp => time.increaseTo(timestamp.addn(offset))); } /** @@ -146,7 +133,7 @@ class GovernorHelper { * 1) an array of objects [{ target, value, data, signature? }] * 2) an object of arrays { targets: [], values: [], data: [], signatures?: [] } */ - setProposal (actions, description) { + setProposal(actions, description) { let targets, values, signatures, data, useCompatibilityInterface; if (Array.isArray(actions)) { @@ -160,33 +147,25 @@ class GovernorHelper { ({ targets, values, signatures = [], data } = actions); } - const fulldata = zip(signatures.map(s => s && web3.eth.abi.encodeFunctionSignature(s)), data) - .map(hexs => concatHex(...hexs)); + const fulldata = zip( + signatures.map(s => s && web3.eth.abi.encodeFunctionSignature(s)), + data, + ).map(hexs => concatHex(...hexs)); const descriptionHash = web3.utils.keccak256(description); // condensed version for queueing end executing - const shortProposal = [ - targets, - values, - fulldata, - descriptionHash, - ]; + const shortProposal = [targets, values, fulldata, descriptionHash]; // full version for proposing - const fullProposal = [ - targets, - values, - ...(useCompatibilityInterface ? [ signatures ] : []), - data, - description, - ]; + const fullProposal = [targets, values, ...(useCompatibilityInterface ? [signatures] : []), data, description]; // proposal id - const id = web3.utils.toBN(web3.utils.keccak256(web3.eth.abi.encodeParameters( - [ 'address[]', 'uint256[]', 'bytes[]', 'bytes32' ], - shortProposal, - ))); + const id = web3.utils.toBN( + web3.utils.keccak256( + web3.eth.abi.encodeParameters(['address[]', 'uint256[]', 'bytes[]', 'bytes32'], shortProposal), + ), + ); this.currentProposal = { id, diff --git a/test/helpers/sign.js b/test/helpers/sign.js index 4c14d1f1d..417ef591d 100644 --- a/test/helpers/sign.js +++ b/test/helpers/sign.js @@ -1,4 +1,4 @@ -function toEthSignedMessageHash (messageHex) { +function toEthSignedMessageHash(messageHex) { const messageBuffer = Buffer.from(messageHex.substring(2), 'hex'); const prefix = Buffer.from(`\u0019Ethereum Signed Message:\n${messageBuffer.length}`); return web3.utils.sha3(Buffer.concat([prefix, messageBuffer])); @@ -13,33 +13,33 @@ function toEthSignedMessageHash (messageHex) { * @param methodName string * @param methodArgs any[] */ -const getSignFor = (contract, signer) => (redeemer, methodName, methodArgs = []) => { - const parts = [ - contract.address, - redeemer, - ]; +const getSignFor = + (contract, signer) => + (redeemer, methodName, methodArgs = []) => { + const parts = [contract.address, redeemer]; - const REAL_SIGNATURE_SIZE = 2 * 65; // 65 bytes in hexadecimal string length - const PADDED_SIGNATURE_SIZE = 2 * 96; // 96 bytes in hexadecimal string length - const DUMMY_SIGNATURE = `0x${web3.utils.padLeft('', REAL_SIGNATURE_SIZE)}`; + const REAL_SIGNATURE_SIZE = 2 * 65; // 65 bytes in hexadecimal string length + const PADDED_SIGNATURE_SIZE = 2 * 96; // 96 bytes in hexadecimal string length + const DUMMY_SIGNATURE = `0x${web3.utils.padLeft('', REAL_SIGNATURE_SIZE)}`; - // if we have a method, add it to the parts that we're signing - if (methodName) { - if (methodArgs.length > 0) { - parts.push( - contract.contract.methods[methodName](...methodArgs.concat([DUMMY_SIGNATURE])).encodeABI() - .slice(0, -1 * PADDED_SIGNATURE_SIZE), - ); - } else { - const abi = contract.abi.find(abi => abi.name === methodName); - parts.push(abi.signature); + // if we have a method, add it to the parts that we're signing + if (methodName) { + if (methodArgs.length > 0) { + parts.push( + contract.contract.methods[methodName](...methodArgs.concat([DUMMY_SIGNATURE])) + .encodeABI() + .slice(0, -1 * PADDED_SIGNATURE_SIZE), + ); + } else { + const abi = contract.abi.find(abi => abi.name === methodName); + parts.push(abi.signature); + } } - } - // return the signature of the "Ethereum Signed Message" hash of the hash of `parts` - const messageHex = web3.utils.soliditySha3(...parts); - return web3.eth.sign(messageHex, signer); -}; + // return the signature of the "Ethereum Signed Message" hash of the hash of `parts` + const messageHex = web3.utils.soliditySha3(...parts); + return web3.eth.sign(messageHex, signer); + }; module.exports = { toEthSignedMessageHash, diff --git a/test/helpers/txpool.js b/test/helpers/txpool.js index 895246b72..ecdba5462 100644 --- a/test/helpers/txpool.js +++ b/test/helpers/txpool.js @@ -3,20 +3,18 @@ const { promisify } = require('util'); const queue = promisify(setImmediate); -async function countPendingTransactions () { - return parseInt( - await network.provider.send('eth_getBlockTransactionCountByNumber', ['pending']), - ); +async function countPendingTransactions() { + return parseInt(await network.provider.send('eth_getBlockTransactionCountByNumber', ['pending'])); } -async function batchInBlock (txs) { +async function batchInBlock(txs) { try { // disable auto-mining await network.provider.send('evm_setAutomine', [false]); // send all transactions const promises = txs.map(fn => fn()); // wait for node to have all pending transactions - while (txs.length > await countPendingTransactions()) { + while (txs.length > (await countPendingTransactions())) { await queue(); } // mine one block diff --git a/test/metatx/MinimalForwarder.test.js b/test/metatx/MinimalForwarder.test.js index 15778505e..24de1719d 100644 --- a/test/metatx/MinimalForwarder.test.js +++ b/test/metatx/MinimalForwarder.test.js @@ -47,24 +47,21 @@ contract('MinimalForwarder', function (accounts) { nonce: Number(await this.forwarder.getNonce(this.sender)), data: '0x', }; - this.sign = () => ethSigUtil.signTypedMessage( - this.wallet.getPrivateKey(), - { + this.sign = () => + ethSigUtil.signTypedMessage(this.wallet.getPrivateKey(), { data: { types: this.types, domain: this.domain, primaryType: 'ForwardRequest', message: this.req, }, - }, - ); + }); }); context('verify', function () { context('valid signature', function () { beforeEach(async function () { - expect(await this.forwarder.getNonce(this.req.from)) - .to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); + expect(await this.forwarder.getNonce(this.req.from)).to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); }); it('success', async function () { @@ -72,37 +69,34 @@ contract('MinimalForwarder', function (accounts) { }); afterEach(async function () { - expect(await this.forwarder.getNonce(this.req.from)) - .to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); + expect(await this.forwarder.getNonce(this.req.from)).to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); }); }); context('invalid signature', function () { it('tampered from', async function () { - expect(await this.forwarder.verify({ ...this.req, from: accounts[0] }, this.sign())) - .to.be.equal(false); + expect(await this.forwarder.verify({ ...this.req, from: accounts[0] }, this.sign())).to.be.equal(false); }); it('tampered to', async function () { - expect(await this.forwarder.verify({ ...this.req, to: accounts[0] }, this.sign())) - .to.be.equal(false); + expect(await this.forwarder.verify({ ...this.req, to: accounts[0] }, this.sign())).to.be.equal(false); }); it('tampered value', async function () { - expect(await this.forwarder.verify({ ...this.req, value: web3.utils.toWei('1') }, this.sign())) - .to.be.equal(false); + expect(await this.forwarder.verify({ ...this.req, value: web3.utils.toWei('1') }, this.sign())).to.be.equal( + false, + ); }); it('tampered nonce', async function () { - expect(await this.forwarder.verify({ ...this.req, nonce: this.req.nonce + 1 }, this.sign())) - .to.be.equal(false); + expect(await this.forwarder.verify({ ...this.req, nonce: this.req.nonce + 1 }, this.sign())).to.be.equal( + false, + ); }); it('tampered data', async function () { - expect(await this.forwarder.verify({ ...this.req, data: '0x1742' }, this.sign())) - .to.be.equal(false); + expect(await this.forwarder.verify({ ...this.req, data: '0x1742' }, this.sign())).to.be.equal(false); }); it('tampered signature', async function () { const tamperedsign = web3.utils.hexToBytes(this.sign()); tamperedsign[42] ^= 0xff; - expect(await this.forwarder.verify(this.req, web3.utils.bytesToHex(tamperedsign))) - .to.be.equal(false); + expect(await this.forwarder.verify(this.req, web3.utils.bytesToHex(tamperedsign))).to.be.equal(false); }); }); }); @@ -110,8 +104,7 @@ contract('MinimalForwarder', function (accounts) { context('execute', function () { context('valid signature', function () { beforeEach(async function () { - expect(await this.forwarder.getNonce(this.req.from)) - .to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); + expect(await this.forwarder.getNonce(this.req.from)).to.be.bignumber.equal(web3.utils.toBN(this.req.nonce)); }); it('success', async function () { @@ -119,8 +112,9 @@ contract('MinimalForwarder', function (accounts) { }); afterEach(async function () { - expect(await this.forwarder.getNonce(this.req.from)) - .to.be.bignumber.equal(web3.utils.toBN(this.req.nonce + 1)); + expect(await this.forwarder.getNonce(this.req.from)).to.be.bignumber.equal( + web3.utils.toBN(this.req.nonce + 1), + ); }); }); @@ -172,9 +166,7 @@ contract('MinimalForwarder', function (accounts) { this.req.data = receiver.contract.methods.mockFunctionOutOfGas().encodeABI(); this.req.gas = 1000000; - await expectRevert.assertion( - this.forwarder.execute(this.req, this.sign(), { gas: gasAvailable }), - ); + await expectRevert.assertion(this.forwarder.execute(this.req, this.sign(), { gas: gasAvailable })); const { transactions } = await web3.eth.getBlock('latest'); const { gasUsed } = await web3.eth.getTransactionReceipt(transactions[0]); diff --git a/test/migrate-imports.test.js b/test/migrate-imports.test.js index 639767c25..7ec9a97ab 100644 --- a/test/migrate-imports.test.js +++ b/test/migrate-imports.test.js @@ -1,5 +1,8 @@ const path = require('path'); -const { promises: fs, constants: { F_OK } } = require('fs'); +const { + promises: fs, + constants: { F_OK }, +} = require('fs'); const { expect } = require('chai'); const { pathUpdates, updateImportPaths, getUpgradeablePath } = require('../scripts/migrate-imports.js'); diff --git a/test/proxy/Clones.behaviour.js b/test/proxy/Clones.behaviour.js index 81c5ee35f..b5fd3c51b 100644 --- a/test/proxy/Clones.behaviour.js +++ b/test/proxy/Clones.behaviour.js @@ -4,7 +4,7 @@ const { expect } = require('chai'); const DummyImplementation = artifacts.require('DummyImplementation'); -module.exports = function shouldBehaveLikeClone (createClone) { +module.exports = function shouldBehaveLikeClone(createClone) { before('deploy implementation', async function () { this.implementation = web3.utils.toChecksumAddress((await DummyImplementation.new()).address); }); @@ -27,9 +27,7 @@ module.exports = function shouldBehaveLikeClone (createClone) { describe('when not sending balance', function () { beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData) - ).address; + this.proxy = (await createClone(this.implementation, initializeData)).address; }); assertProxyInitialization({ @@ -42,9 +40,7 @@ module.exports = function shouldBehaveLikeClone (createClone) { const value = 10e5; it('reverts', async function () { - await expectRevert.unspecified( - createClone(this.implementation, initializeData, { value }), - ); + await expectRevert.unspecified(createClone(this.implementation, initializeData, { value })); }); }); }); @@ -55,9 +51,7 @@ module.exports = function shouldBehaveLikeClone (createClone) { describe('when not sending balance', function () { beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData) - ).address; + this.proxy = (await createClone(this.implementation, initializeData)).address; }); assertProxyInitialization({ @@ -70,9 +64,7 @@ module.exports = function shouldBehaveLikeClone (createClone) { const value = 10e5; beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData, { value }) - ).address; + this.proxy = (await createClone(this.implementation, initializeData, { value })).address; }); assertProxyInitialization({ @@ -86,14 +78,13 @@ module.exports = function shouldBehaveLikeClone (createClone) { describe('initialization with parameters', function () { describe('non payable', function () { const expectedInitializedValue = 10; - const initializeData = new DummyImplementation('').contract - .methods.initializeNonPayableWithValue(expectedInitializedValue).encodeABI(); + const initializeData = new DummyImplementation('').contract.methods + .initializeNonPayableWithValue(expectedInitializedValue) + .encodeABI(); describe('when not sending balance', function () { beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData) - ).address; + this.proxy = (await createClone(this.implementation, initializeData)).address; }); assertProxyInitialization({ @@ -106,23 +97,20 @@ module.exports = function shouldBehaveLikeClone (createClone) { const value = 10e5; it('reverts', async function () { - await expectRevert.unspecified( - createClone(this.implementation, initializeData, { value }), - ); + await expectRevert.unspecified(createClone(this.implementation, initializeData, { value })); }); }); }); describe('payable', function () { const expectedInitializedValue = 42; - const initializeData = new DummyImplementation('').contract - .methods.initializePayableWithValue(expectedInitializedValue).encodeABI(); + const initializeData = new DummyImplementation('').contract.methods + .initializePayableWithValue(expectedInitializedValue) + .encodeABI(); describe('when not sending balance', function () { beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData) - ).address; + this.proxy = (await createClone(this.implementation, initializeData)).address; }); assertProxyInitialization({ @@ -135,9 +123,7 @@ module.exports = function shouldBehaveLikeClone (createClone) { const value = 10e5; beforeEach('creating proxy', async function () { - this.proxy = ( - await createClone(this.implementation, initializeData, { value }) - ).address; + this.proxy = (await createClone(this.implementation, initializeData, { value })).address; }); assertProxyInitialization({ diff --git a/test/proxy/Clones.test.js b/test/proxy/Clones.test.js index 09f719cec..947b2ed95 100644 --- a/test/proxy/Clones.test.js +++ b/test/proxy/Clones.test.js @@ -7,7 +7,7 @@ const shouldBehaveLikeClone = require('./Clones.behaviour'); const Clones = artifacts.require('$Clones'); contract('Clones', function (accounts) { - const [ deployer ] = accounts; + const [deployer] = accounts; describe('clone', function () { shouldBehaveLikeClone(async (implementation, initData, opts = {}) => { @@ -34,15 +34,9 @@ contract('Clones', function (accounts) { const salt = web3.utils.randomHex(32); const factory = await Clones.new(); // deploy once - expectEvent( - await factory.$cloneDeterministic(implementation, salt), - 'return$cloneDeterministic', - ); + expectEvent(await factory.$cloneDeterministic(implementation, salt), 'return$cloneDeterministic'); // deploy twice - await expectRevert( - factory.$cloneDeterministic(implementation, salt), - 'ERC1167: create2 failed', - ); + await expectRevert(factory.$cloneDeterministic(implementation, salt), 'ERC1167: create2 failed'); }); it('address prediction', async function () { @@ -57,17 +51,11 @@ contract('Clones', function (accounts) { '5af43d82803e903d91602b57fd5bf3', ].join(''); - expect(computeCreate2Address( - salt, - creationCode, - factory.address, - )).to.be.equal(predicted); + expect(computeCreate2Address(salt, creationCode, factory.address)).to.be.equal(predicted); - expectEvent( - await factory.$cloneDeterministic(implementation, salt), - 'return$cloneDeterministic', - { instance: predicted }, - ); + expectEvent(await factory.$cloneDeterministic(implementation, salt), 'return$cloneDeterministic', { + instance: predicted, + }); }); }); }); diff --git a/test/proxy/Proxy.behaviour.js b/test/proxy/Proxy.behaviour.js index 435792f23..0867b93c9 100644 --- a/test/proxy/Proxy.behaviour.js +++ b/test/proxy/Proxy.behaviour.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const DummyImplementation = artifacts.require('DummyImplementation'); -module.exports = function shouldBehaveLikeProxy (createProxy, proxyAdminAddress, proxyCreator) { +module.exports = function shouldBehaveLikeProxy(createProxy, proxyAdminAddress, proxyCreator) { it('cannot be initialized with a non-contract address', async function () { const nonContractAddress = proxyCreator; const initializeData = Buffer.from(''); @@ -141,8 +141,9 @@ module.exports = function shouldBehaveLikeProxy (createProxy, proxyAdminAddress, describe('initialization with parameters', function () { describe('non payable', function () { const expectedInitializedValue = 10; - const initializeData = new DummyImplementation('').contract - .methods.initializeNonPayableWithValue(expectedInitializedValue).encodeABI(); + const initializeData = new DummyImplementation('').contract.methods + .initializeNonPayableWithValue(expectedInitializedValue) + .encodeABI(); describe('when not sending balance', function () { beforeEach('creating proxy', async function () { @@ -172,8 +173,9 @@ module.exports = function shouldBehaveLikeProxy (createProxy, proxyAdminAddress, describe('payable', function () { const expectedInitializedValue = 42; - const initializeData = new DummyImplementation('').contract - .methods.initializePayableWithValue(expectedInitializedValue).encodeABI(); + const initializeData = new DummyImplementation('').contract.methods + .initializePayableWithValue(expectedInitializedValue) + .encodeABI(); describe('when not sending balance', function () { beforeEach('creating proxy', async function () { @@ -210,8 +212,7 @@ module.exports = function shouldBehaveLikeProxy (createProxy, proxyAdminAddress, }); describe('reverting initialization', function () { - const initializeData = new DummyImplementation('').contract - .methods.reverts().encodeABI(); + const initializeData = new DummyImplementation('').contract.methods.reverts().encodeABI(); it('reverts', async function () { await expectRevert( diff --git a/test/proxy/beacon/BeaconProxy.test.js b/test/proxy/beacon/BeaconProxy.test.js index 0a4a8d0cf..968f00be8 100644 --- a/test/proxy/beacon/BeaconProxy.test.js +++ b/test/proxy/beacon/BeaconProxy.test.js @@ -15,25 +15,17 @@ contract('BeaconProxy', function (accounts) { describe('bad beacon is not accepted', async function () { it('non-contract beacon', async function () { - await expectRevert( - BeaconProxy.new(anotherAccount, '0x'), - 'ERC1967: new beacon is not a contract', - ); + await expectRevert(BeaconProxy.new(anotherAccount, '0x'), 'ERC1967: new beacon is not a contract'); }); it('non-compliant beacon', async function () { const beacon = await BadBeaconNoImpl.new(); - await expectRevert.unspecified( - BeaconProxy.new(beacon.address, '0x'), - ); + await expectRevert.unspecified(BeaconProxy.new(beacon.address, '0x')); }); it('non-contract implementation', async function () { const beacon = await BadBeaconNotContract.new(); - await expectRevert( - BeaconProxy.new(beacon.address, '0x'), - 'ERC1967: beacon implementation is not a contract', - ); + await expectRevert(BeaconProxy.new(beacon.address, '0x'), 'ERC1967: beacon implementation is not a contract'); }); }); @@ -69,18 +61,14 @@ contract('BeaconProxy', function (accounts) { it('non-payable initialization', async function () { const value = '55'; - const data = this.implementationV0.contract.methods - .initializeNonPayableWithValue(value) - .encodeABI(); + const data = this.implementationV0.contract.methods.initializeNonPayableWithValue(value).encodeABI(); this.proxy = await BeaconProxy.new(this.beacon.address, data); await this.assertInitialized({ value, balance: '0' }); }); it('payable initialization', async function () { const value = '55'; - const data = this.implementationV0.contract.methods - .initializePayableWithValue(value) - .encodeABI(); + const data = this.implementationV0.contract.methods.initializePayableWithValue(value).encodeABI(); const balance = '100'; this.proxy = await BeaconProxy.new(this.beacon.address, data, { value: balance }); await this.assertInitialized({ value, balance }); @@ -88,10 +76,7 @@ contract('BeaconProxy', function (accounts) { it('reverting initialization', async function () { const data = this.implementationV0.contract.methods.reverts().encodeABI(); - await expectRevert( - BeaconProxy.new(this.beacon.address, data), - 'DummyImplementation reverted', - ); + await expectRevert(BeaconProxy.new(this.beacon.address, data), 'DummyImplementation reverted'); }); }); @@ -99,9 +84,7 @@ contract('BeaconProxy', function (accounts) { const beacon = await UpgradeableBeacon.new(this.implementationV0.address); const value = '10'; - const data = this.implementationV0.contract.methods - .initializeNonPayableWithValue(value) - .encodeABI(); + const data = this.implementationV0.contract.methods.initializeNonPayableWithValue(value).encodeABI(); const proxy = await BeaconProxy.new(beacon.address, data); const dummy = new DummyImplementation(proxy.address); diff --git a/test/proxy/beacon/UpgradeableBeacon.test.js b/test/proxy/beacon/UpgradeableBeacon.test.js index 0c49906d6..d65f3e0a5 100644 --- a/test/proxy/beacon/UpgradeableBeacon.test.js +++ b/test/proxy/beacon/UpgradeableBeacon.test.js @@ -9,10 +9,7 @@ contract('UpgradeableBeacon', function (accounts) { const [owner, other] = accounts; it('cannot be created with non-contract implementation', async function () { - await expectRevert( - UpgradeableBeacon.new(accounts[0]), - 'UpgradeableBeacon: implementation is not a contract', - ); + await expectRevert(UpgradeableBeacon.new(accounts[0]), 'UpgradeableBeacon: implementation is not a contract'); }); context('once deployed', async function () { @@ -41,10 +38,7 @@ contract('UpgradeableBeacon', function (accounts) { it('cannot be upgraded by other account', async function () { const v2 = await Implementation2.new(); - await expectRevert( - this.beacon.upgradeTo(v2.address, { from: other }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.beacon.upgradeTo(v2.address, { from: other }), 'Ownable: caller is not the owner'); }); }); }); diff --git a/test/proxy/transparent/ProxyAdmin.test.js b/test/proxy/transparent/ProxyAdmin.test.js index 07adba6ad..811dc5671 100644 --- a/test/proxy/transparent/ProxyAdmin.test.js +++ b/test/proxy/transparent/ProxyAdmin.test.js @@ -90,9 +90,9 @@ contract('ProxyAdmin', function (accounts) { it('fails to upgrade', async function () { const callData = new ImplV1('').contract.methods.initializeNonPayableWithValue(1337).encodeABI(); await expectRevert( - this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, - { from: anotherAccount }, - ), + this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, { + from: anotherAccount, + }), 'caller is not the owner', ); }); @@ -103,9 +103,9 @@ contract('ProxyAdmin', function (accounts) { it('fails to upgrade', async function () { const callData = '0x12345678'; await expectRevert.unspecified( - this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, - { from: proxyAdminOwner }, - ), + this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, { + from: proxyAdminOwner, + }), ); }); }); @@ -113,9 +113,9 @@ contract('ProxyAdmin', function (accounts) { context('with valid callData', function () { it('upgrades implementation', async function () { const callData = new ImplV1('').contract.methods.initializeNonPayableWithValue(1337).encodeABI(); - await this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, - { from: proxyAdminOwner }, - ); + await this.proxyAdmin.upgradeAndCall(this.proxy.address, this.implementationV2.address, callData, { + from: proxyAdminOwner, + }); const implementationAddress = await this.proxyAdmin.getProxyImplementation(this.proxy.address); expect(implementationAddress).to.be.equal(this.implementationV2.address); }); diff --git a/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js b/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js index 33fef6f41..da8f21bee 100644 --- a/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js +++ b/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js @@ -16,7 +16,7 @@ const InitializableMock = artifacts.require('InitializableMock'); const DummyImplementation = artifacts.require('DummyImplementation'); const ClashingImplementation = artifacts.require('ClashingImplementation'); -module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createProxy, accounts) { +module.exports = function shouldBehaveLikeTransparentUpgradeableProxy(createProxy, accounts) { const [proxyAdminAddress, proxyAdminOwner, anotherAccount] = accounts; before(async function () { @@ -60,12 +60,9 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro }); it('emits an event', async function () { - expectEvent( - await this.proxy.upgradeTo(this.implementationV1, { from }), - 'Upgraded', { - implementation: this.implementationV1, - }, - ); + expectEvent(await this.proxy.upgradeTo(this.implementationV1, { from }), 'Upgraded', { + implementation: this.implementationV1, + }); }); }); @@ -83,9 +80,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro const from = anotherAccount; it('reverts', async function () { - await expectRevert.unspecified( - this.proxy.upgradeTo(this.implementationV1, { from }), - ); + await expectRevert.unspecified(this.proxy.upgradeTo(this.implementationV1, { from })); }); }); }); @@ -178,7 +173,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro expectEvent(this.receipt, 'Upgraded', { implementation: this.behaviorV1.address }); }); - it('calls the \'initialize\' function and sends given value to the proxy', async function () { + it("calls the 'initialize' function and sends given value to the proxy", async function () { const migratable = new MigratableMockV1(this.proxyAddress); const x = await migratable.x(); @@ -194,8 +189,10 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro beforeEach(async function () { this.behaviorV2 = await MigratableMockV2.new(); this.balancePreviousV2 = new BN(await web3.eth.getBalance(this.proxyAddress)); - this.receipt = - await this.proxy.upgradeToAndCall(this.behaviorV2.address, v2MigrationData, { from, value }); + this.receipt = await this.proxy.upgradeToAndCall(this.behaviorV2.address, v2MigrationData, { + from, + value, + }); }); it('upgrades to the requested version and emits an event', async function () { @@ -204,7 +201,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro expectEvent(this.receipt, 'Upgraded', { implementation: this.behaviorV2.address }); }); - it('calls the \'migrate\' function and sends given value to the proxy', async function () { + it("calls the 'migrate' function and sends given value to the proxy", async function () { const migratable = new MigratableMockV2(this.proxyAddress); const x = await migratable.x(); @@ -223,8 +220,10 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro beforeEach(async function () { this.behaviorV3 = await MigratableMockV3.new(); this.balancePreviousV3 = new BN(await web3.eth.getBalance(this.proxyAddress)); - this.receipt = - await this.proxy.upgradeToAndCall(this.behaviorV3.address, v3MigrationData, { from, value }); + this.receipt = await this.proxy.upgradeToAndCall(this.behaviorV3.address, v3MigrationData, { + from, + value, + }); }); it('upgrades to the requested version and emits an event', async function () { @@ -233,7 +232,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro expectEvent(this.receipt, 'Upgraded', { implementation: this.behaviorV3.address }); }); - it('calls the \'migrate\' function and sends given value to the proxy', async function () { + it("calls the 'migrate' function and sends given value to the proxy", async function () { const migratable = new MigratableMockV3(this.proxyAddress); const x = await migratable.x(); @@ -256,9 +255,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro it('reverts', async function () { const behaviorV1 = await MigratableMockV1.new(); const v1MigrationData = new MigratableMockV1('').contract.methods.initialize(42).encodeABI(); - await expectRevert.unspecified( - this.proxy.upgradeToAndCall(behaviorV1.address, v1MigrationData, { from }), - ); + await expectRevert.unspecified(this.proxy.upgradeToAndCall(behaviorV1.address, v1MigrationData, { from })); }); }); }); @@ -419,9 +416,7 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy (createPro await proxy.upgradeTo(instance2.address, { from: proxyAdminAddress }); const data = '0x'; - await expectRevert.unspecified( - web3.eth.sendTransaction({ to: proxy.address, from: anotherAccount, data }), - ); + await expectRevert.unspecified(web3.eth.sendTransaction({ to: proxy.address, from: anotherAccount, data })); const proxyInstance2 = new Implementation2(proxy.address); const res = await proxyInstance2.getValue(); diff --git a/test/proxy/utils/UUPSUpgradeable.test.js b/test/proxy/utils/UUPSUpgradeable.test.js index 20324e67b..b0c1b3f6f 100644 --- a/test/proxy/utils/UUPSUpgradeable.test.js +++ b/test/proxy/utils/UUPSUpgradeable.test.js @@ -65,14 +65,14 @@ contract('UUPSUpgradeable', function () { it('can upgrade from legacy implementations', async function () { const legacyImpl = await UUPSUpgradeableLegacyMock.new(); - const legacyInstance = await ERC1967Proxy.new(legacyImpl.address, '0x') - .then(({ address }) => UUPSUpgradeableLegacyMock.at(address)); + const legacyInstance = await ERC1967Proxy.new(legacyImpl.address, '0x').then(({ address }) => + UUPSUpgradeableLegacyMock.at(address), + ); const receipt = await legacyInstance.upgradeTo(this.implInitial.address); - const UpgradedEvents = receipt.logs.filter(({ address, event }) => - address === legacyInstance.address && - event === 'Upgraded', + const UpgradedEvents = receipt.logs.filter( + ({ address, event }) => address === legacyInstance.address && event === 'Upgraded', ); expect(UpgradedEvents.length).to.be.equal(1); diff --git a/test/security/Pausable.test.js b/test/security/Pausable.test.js index 86701bcfd..5cca11e47 100644 --- a/test/security/Pausable.test.js +++ b/test/security/Pausable.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const PausableMock = artifacts.require('PausableMock'); contract('Pausable', function (accounts) { - const [ pauser ] = accounts; + const [pauser] = accounts; beforeEach(async function () { this.pausable = await PausableMock.new(); @@ -24,15 +24,13 @@ contract('Pausable', function (accounts) { }); it('cannot take drastic measure in non-pause', async function () { - await expectRevert(this.pausable.drasticMeasure(), - 'Pausable: not paused', - ); + await expectRevert(this.pausable.drasticMeasure(), 'Pausable: not paused'); expect(await this.pausable.drasticMeasureTaken()).to.equal(false); }); context('when paused', function () { beforeEach(async function () { - (this.receipt = await this.pausable.pause({ from: pauser })); + this.receipt = await this.pausable.pause({ from: pauser }); }); it('emits a Paused event', function () { @@ -60,7 +58,7 @@ contract('Pausable', function (accounts) { context('when unpaused', function () { beforeEach(async function () { - (this.receipt = await this.pausable.unpause({ from: pauser })); + this.receipt = await this.pausable.unpause({ from: pauser }); }); it('emits an Unpaused event', function () { @@ -74,9 +72,7 @@ contract('Pausable', function (accounts) { }); it('should prevent drastic measure', async function () { - await expectRevert(this.pausable.drasticMeasure(), - 'Pausable: not paused', - ); + await expectRevert(this.pausable.drasticMeasure(), 'Pausable: not paused'); }); it('reverts when re-unpausing', async function () { diff --git a/test/security/PullPayment.test.js b/test/security/PullPayment.test.js index 1552ed994..5bf72bbe6 100644 --- a/test/security/PullPayment.test.js +++ b/test/security/PullPayment.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const PullPaymentMock = artifacts.require('PullPaymentMock'); contract('PullPayment', function (accounts) { - const [ payer, payee1, payee2 ] = accounts; + const [payer, payee1, payee2] = accounts; const amount = ether('17'); diff --git a/test/security/ReentrancyGuard.test.js b/test/security/ReentrancyGuard.test.js index 172a29b1f..1a80bc860 100644 --- a/test/security/ReentrancyGuard.test.js +++ b/test/security/ReentrancyGuard.test.js @@ -19,8 +19,7 @@ contract('ReentrancyGuard', function () { it('does not allow remote callback', async function () { const attacker = await ReentrancyAttack.new(); - await expectRevert( - this.reentrancyMock.countAndCall(attacker.address), 'ReentrancyAttack: failed call'); + await expectRevert(this.reentrancyMock.countAndCall(attacker.address), 'ReentrancyAttack: failed call'); }); it('_reentrancyGuardEntered should be true when guarded', async function () { @@ -35,14 +34,10 @@ contract('ReentrancyGuard', function () { // I put them here as documentation, and to monitor any changes // in the side-effects. it('does not allow local recursion', async function () { - await expectRevert( - this.reentrancyMock.countLocalRecursive(10), 'ReentrancyGuard: reentrant call', - ); + await expectRevert(this.reentrancyMock.countLocalRecursive(10), 'ReentrancyGuard: reentrant call'); }); it('does not allow indirect local recursion', async function () { - await expectRevert( - this.reentrancyMock.countThisRecursive(10), 'ReentrancyMock: failed call', - ); + await expectRevert(this.reentrancyMock.countThisRecursive(10), 'ReentrancyMock: failed call'); }); }); diff --git a/test/token/ERC1155/ERC1155.behavior.js b/test/token/ERC1155/ERC1155.behavior.js index 37afea0aa..96d448a9e 100644 --- a/test/token/ERC1155/ERC1155.behavior.js +++ b/test/token/ERC1155/ERC1155.behavior.js @@ -7,7 +7,7 @@ const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsI const ERC1155ReceiverMock = artifacts.require('ERC1155ReceiverMock'); -function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, multiTokenHolder, recipient, proxy]) { +function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, multiTokenHolder, recipient, proxy]) { const firstTokenId = new BN(1); const secondTokenId = new BN(2); const unknownTokenId = new BN(3); @@ -27,22 +27,13 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, ); }); - context('when accounts don\'t own tokens', function () { + context("when accounts don't own tokens", function () { it('returns zero for given addresses', async function () { - expect(await this.token.balanceOf( - firstTokenHolder, - firstTokenId, - )).to.be.bignumber.equal('0'); + expect(await this.token.balanceOf(firstTokenHolder, firstTokenId)).to.be.bignumber.equal('0'); - expect(await this.token.balanceOf( - secondTokenHolder, - secondTokenId, - )).to.be.bignumber.equal('0'); + expect(await this.token.balanceOf(secondTokenHolder, secondTokenId)).to.be.bignumber.equal('0'); - expect(await this.token.balanceOf( - firstTokenHolder, - unknownTokenId, - )).to.be.bignumber.equal('0'); + expect(await this.token.balanceOf(firstTokenHolder, unknownTokenId)).to.be.bignumber.equal('0'); }); }); @@ -51,38 +42,23 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, await this.token.$_mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.$_mint( - secondTokenHolder, - secondTokenId, - secondAmount, - '0x', - { - from: minter, - }, - ); + await this.token.$_mint(secondTokenHolder, secondTokenId, secondAmount, '0x', { + from: minter, + }); }); it('returns the amount of tokens owned by the given addresses', async function () { - expect(await this.token.balanceOf( - firstTokenHolder, - firstTokenId, - )).to.be.bignumber.equal(firstAmount); + expect(await this.token.balanceOf(firstTokenHolder, firstTokenId)).to.be.bignumber.equal(firstAmount); - expect(await this.token.balanceOf( - secondTokenHolder, - secondTokenId, - )).to.be.bignumber.equal(secondAmount); + expect(await this.token.balanceOf(secondTokenHolder, secondTokenId)).to.be.bignumber.equal(secondAmount); - expect(await this.token.balanceOf( - firstTokenHolder, - unknownTokenId, - )).to.be.bignumber.equal('0'); + expect(await this.token.balanceOf(firstTokenHolder, unknownTokenId)).to.be.bignumber.equal('0'); }); }); }); describe('balanceOfBatch', function () { - it('reverts when input arrays don\'t match up', async function () { + it("reverts when input arrays don't match up", async function () { await expectRevert( this.token.balanceOfBatch( [firstTokenHolder, secondTokenHolder, firstTokenHolder, secondTokenHolder], @@ -110,7 +86,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, ); }); - context('when accounts don\'t own tokens', function () { + context("when accounts don't own tokens", function () { it('returns zeros for each account', async function () { const result = await this.token.balanceOfBatch( [firstTokenHolder, secondTokenHolder, firstTokenHolder], @@ -128,15 +104,9 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, await this.token.$_mint(firstTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.$_mint( - secondTokenHolder, - secondTokenId, - secondAmount, - '0x', - { - from: minter, - }, - ); + await this.token.$_mint(secondTokenHolder, secondTokenId, secondAmount, '0x', { + from: minter, + }); }); it('returns amounts owned by each account in order passed', async function () { @@ -167,7 +137,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, describe('setApprovalForAll', function () { let receipt; beforeEach(async function () { - (receipt = await this.token.setApprovalForAll(proxy, true, { from: multiTokenHolder })); + receipt = await this.token.setApprovalForAll(proxy, true, { from: multiTokenHolder }); }); it('sets approval status which can be queried via isApprovedForAll', async function () { @@ -196,46 +166,30 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, await this.token.$_mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.$_mint( - multiTokenHolder, - secondTokenId, - secondAmount, - '0x', - { - from: minter, - }, - ); + await this.token.$_mint(multiTokenHolder, secondTokenId, secondAmount, '0x', { + from: minter, + }); }); it('reverts when transferring more than balance', async function () { await expectRevert( - this.token.safeTransferFrom( - multiTokenHolder, - recipient, - firstTokenId, - firstAmount.addn(1), - '0x', - { from: multiTokenHolder }, - ), + this.token.safeTransferFrom(multiTokenHolder, recipient, firstTokenId, firstAmount.addn(1), '0x', { + from: multiTokenHolder, + }), 'ERC1155: insufficient balance for transfer', ); }); it('reverts when transferring to zero address', async function () { await expectRevert( - this.token.safeTransferFrom( - multiTokenHolder, - ZERO_ADDRESS, - firstTokenId, - firstAmount, - '0x', - { from: multiTokenHolder }, - ), + this.token.safeTransferFrom(multiTokenHolder, ZERO_ADDRESS, firstTokenId, firstAmount, '0x', { + from: multiTokenHolder, + }), 'ERC1155: transfer to the zero address', ); }); - function transferWasSuccessful ({ operator, from, id, value }) { + function transferWasSuccessful({ operator, from, id, value }) { it('debits transferred balance from sender', async function () { const newBalance = await this.token.balanceOf(from, id); expect(newBalance).to.be.a.bignumber.equal('0'); @@ -260,10 +214,16 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when called by the multiTokenHolder', async function () { beforeEach(async function () { this.toWhom = recipient; - (this.transferLogs = - await this.token.safeTransferFrom(multiTokenHolder, recipient, firstTokenId, firstAmount, '0x', { + this.transferLogs = await this.token.safeTransferFrom( + multiTokenHolder, + recipient, + firstTokenId, + firstAmount, + '0x', + { from: multiTokenHolder, - })); + }, + ); }); transferWasSuccessful.call(this, { @@ -302,10 +262,16 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, beforeEach(async function () { this.toWhom = recipient; await this.token.setApprovalForAll(proxy, true, { from: multiTokenHolder }); - (this.transferLogs = - await this.token.safeTransferFrom(multiTokenHolder, recipient, firstTokenId, firstAmount, '0x', { + this.transferLogs = await this.token.safeTransferFrom( + multiTokenHolder, + recipient, + firstTokenId, + firstAmount, + '0x', + { from: proxy, - })); + }, + ); }); transferWasSuccessful.call(this, { @@ -315,7 +281,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, value: firstAmount, }); - it('preserves operator\'s balances not involved in the transfer', async function () { + it("preserves operator's balances not involved in the transfer", async function () { const balance1 = await this.token.balanceOf(proxy, firstTokenId); expect(balance1).to.be.a.bignumber.equal('0'); @@ -328,8 +294,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when sending to a valid receiver', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, false, - RECEIVER_BATCH_MAGIC_VALUE, false, + RECEIVER_SINGLE_MAGIC_VALUE, + false, + RECEIVER_BATCH_MAGIC_VALUE, + false, ); }); @@ -344,7 +312,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, '0x', { from: multiTokenHolder }, ); - (this.transferLogs = this.transferReceipt); + this.transferLogs = this.transferReceipt; }); transferWasSuccessful.call(this, { @@ -377,7 +345,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, data, { from: multiTokenHolder }, ); - (this.transferLogs = this.transferReceipt); + this.transferLogs = this.transferReceipt; }); transferWasSuccessful.call(this, { @@ -401,10 +369,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('to a receiver contract returning unexpected value', function () { beforeEach(async function () { - this.receiver = await ERC1155ReceiverMock.new( - '0x00c0ffee', false, - RECEIVER_BATCH_MAGIC_VALUE, false, - ); + this.receiver = await ERC1155ReceiverMock.new('0x00c0ffee', false, RECEIVER_BATCH_MAGIC_VALUE, false); }); it('reverts', async function () { @@ -420,8 +385,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('to a receiver contract that reverts', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, true, - RECEIVER_BATCH_MAGIC_VALUE, false, + RECEIVER_SINGLE_MAGIC_VALUE, + true, + RECEIVER_BATCH_MAGIC_VALUE, + false, ); }); @@ -452,46 +419,46 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, await this.token.$_mint(multiTokenHolder, firstTokenId, firstAmount, '0x', { from: minter, }); - await this.token.$_mint( - multiTokenHolder, - secondTokenId, - secondAmount, - '0x', - { - from: minter, - }, - ); + await this.token.$_mint(multiTokenHolder, secondTokenId, secondAmount, '0x', { + from: minter, + }); }); it('reverts when transferring amount more than any of balances', async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, + multiTokenHolder, + recipient, [firstTokenId, secondTokenId], [firstAmount, secondAmount.addn(1)], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155: insufficient balance for transfer', ); }); - it('reverts when ids array length doesn\'t match amounts array length', async function () { + it("reverts when ids array length doesn't match amounts array length", async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, + multiTokenHolder, + recipient, [firstTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155: ids and amounts length mismatch', ); await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, + multiTokenHolder, + recipient, [firstTokenId, secondTokenId], [firstAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155: ids and amounts length mismatch', ); @@ -500,16 +467,18 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, it('reverts when transferring to zero address', async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, ZERO_ADDRESS, + multiTokenHolder, + ZERO_ADDRESS, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155: transfer to the zero address', ); }); - function batchTransferWasSuccessful ({ operator, from, ids, values }) { + function batchTransferWasSuccessful({ operator, from, ids, values }) { it('debits transferred balances from sender', async function () { const newBalances = await this.token.balanceOfBatch(new Array(ids.length).fill(from), ids); for (const newBalance of newBalances) { @@ -538,13 +507,14 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when called by the multiTokenHolder', async function () { beforeEach(async function () { this.toWhom = recipient; - (this.transferLogs = - await this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, - [firstTokenId, secondTokenId], - [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, - )); + this.transferLogs = await this.token.safeBatchTransferFrom( + multiTokenHolder, + recipient, + [firstTokenId, secondTokenId], + [firstAmount, secondAmount], + '0x', + { from: multiTokenHolder }, + ); }); batchTransferWasSuccessful.call(this, { @@ -564,10 +534,12 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, it('reverts', async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, + multiTokenHolder, + recipient, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: proxy }, + '0x', + { from: proxy }, ), 'ERC1155: caller is not token owner or approved', ); @@ -578,13 +550,14 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, beforeEach(async function () { this.toWhom = recipient; await this.token.setApprovalForAll(proxy, true, { from: multiTokenHolder }); - (this.transferLogs = - await this.token.safeBatchTransferFrom( - multiTokenHolder, recipient, - [firstTokenId, secondTokenId], - [firstAmount, secondAmount], - '0x', { from: proxy }, - )); + this.transferLogs = await this.token.safeBatchTransferFrom( + multiTokenHolder, + recipient, + [firstTokenId, secondTokenId], + [firstAmount, secondAmount], + '0x', + { from: proxy }, + ); }); batchTransferWasSuccessful.call(this, { @@ -594,7 +567,7 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, values: [firstAmount, secondAmount], }); - it('preserves operator\'s balances not involved in the transfer', async function () { + it("preserves operator's balances not involved in the transfer", async function () { const balance1 = await this.token.balanceOf(proxy, firstTokenId); expect(balance1).to.be.a.bignumber.equal('0'); const balance2 = await this.token.balanceOf(proxy, secondTokenId); @@ -606,8 +579,10 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('when sending to a valid receiver', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, false, - RECEIVER_BATCH_MAGIC_VALUE, false, + RECEIVER_SINGLE_MAGIC_VALUE, + false, + RECEIVER_BATCH_MAGIC_VALUE, + false, ); }); @@ -615,12 +590,14 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, beforeEach(async function () { this.toWhom = this.receiver.address; this.transferReceipt = await this.token.safeBatchTransferFrom( - multiTokenHolder, this.receiver.address, + multiTokenHolder, + this.receiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ); - (this.transferLogs = this.transferReceipt); + this.transferLogs = this.transferReceipt; }); batchTransferWasSuccessful.call(this, { @@ -646,12 +623,14 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, beforeEach(async function () { this.toWhom = this.receiver.address; this.transferReceipt = await this.token.safeBatchTransferFrom( - multiTokenHolder, this.receiver.address, + multiTokenHolder, + this.receiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - data, { from: multiTokenHolder }, + data, + { from: multiTokenHolder }, ); - (this.transferLogs = this.transferReceipt); + this.transferLogs = this.transferReceipt; }); batchTransferWasSuccessful.call(this, { @@ -676,18 +655,22 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('to a receiver contract returning unexpected value', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, false, - RECEIVER_SINGLE_MAGIC_VALUE, false, + RECEIVER_SINGLE_MAGIC_VALUE, + false, + RECEIVER_SINGLE_MAGIC_VALUE, + false, ); }); it('reverts', async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, this.receiver.address, + multiTokenHolder, + this.receiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155: ERC1155Receiver rejected tokens', ); @@ -697,18 +680,22 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('to a receiver contract that reverts', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, false, - RECEIVER_BATCH_MAGIC_VALUE, true, + RECEIVER_SINGLE_MAGIC_VALUE, + false, + RECEIVER_BATCH_MAGIC_VALUE, + true, ); }); it('reverts', async function () { await expectRevert( this.token.safeBatchTransferFrom( - multiTokenHolder, this.receiver.address, + multiTokenHolder, + this.receiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), 'ERC1155ReceiverMock: reverting on batch receive', ); @@ -718,18 +705,22 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, context('to a receiver contract that reverts only on single transfers', function () { beforeEach(async function () { this.receiver = await ERC1155ReceiverMock.new( - RECEIVER_SINGLE_MAGIC_VALUE, true, - RECEIVER_BATCH_MAGIC_VALUE, false, + RECEIVER_SINGLE_MAGIC_VALUE, + true, + RECEIVER_BATCH_MAGIC_VALUE, + false, ); this.toWhom = this.receiver.address; this.transferReceipt = await this.token.safeBatchTransferFrom( - multiTokenHolder, this.receiver.address, + multiTokenHolder, + this.receiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ); - (this.transferLogs = this.transferReceipt); + this.transferLogs = this.transferReceipt; }); batchTransferWasSuccessful.call(this, { @@ -755,10 +746,12 @@ function shouldBehaveLikeERC1155 ([minter, firstTokenHolder, secondTokenHolder, const invalidReceiver = this.token; await expectRevert.unspecified( this.token.safeBatchTransferFrom( - multiTokenHolder, invalidReceiver.address, + multiTokenHolder, + invalidReceiver.address, [firstTokenId, secondTokenId], [firstAmount, secondAmount], - '0x', { from: multiTokenHolder }, + '0x', + { from: multiTokenHolder }, ), ); }); diff --git a/test/token/ERC1155/ERC1155.test.js b/test/token/ERC1155/ERC1155.test.js index 4e295d59e..ff432d37c 100644 --- a/test/token/ERC1155/ERC1155.test.js +++ b/test/token/ERC1155/ERC1155.test.js @@ -38,7 +38,7 @@ contract('ERC1155', function (accounts) { context('with minted tokens', function () { beforeEach(async function () { - (this.receipt = await this.token.$_mint(tokenHolder, tokenId, mintAmount, data, { from: operator })); + this.receipt = await this.token.$_mint(tokenHolder, tokenId, mintAmount, data, { from: operator }); }); it('emits a TransferSingle event', function () { @@ -79,13 +79,9 @@ contract('ERC1155', function (accounts) { context('with minted batch of tokens', function () { beforeEach(async function () { - (this.receipt = await this.token.$_mintBatch( - tokenBatchHolder, - tokenBatchIds, - mintAmounts, - data, - { from: operator }, - )); + this.receipt = await this.token.$_mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts, data, { + from: operator, + }); }); it('emits a TransferBatch event', function () { @@ -110,28 +106,16 @@ contract('ERC1155', function (accounts) { }); describe('_burn', function () { - it('reverts when burning the zero account\'s tokens', async function () { - await expectRevert( - this.token.$_burn(ZERO_ADDRESS, tokenId, mintAmount), - 'ERC1155: burn from the zero address', - ); + it("reverts when burning the zero account's tokens", async function () { + await expectRevert(this.token.$_burn(ZERO_ADDRESS, tokenId, mintAmount), 'ERC1155: burn from the zero address'); }); it('reverts when burning a non-existent token id', async function () { - await expectRevert( - this.token.$_burn(tokenHolder, tokenId, mintAmount), - 'ERC1155: burn amount exceeds balance', - ); + await expectRevert(this.token.$_burn(tokenHolder, tokenId, mintAmount), 'ERC1155: burn amount exceeds balance'); }); it('reverts when burning more than available tokens', async function () { - await this.token.$_mint( - tokenHolder, - tokenId, - mintAmount, - data, - { from: operator }, - ); + await this.token.$_mint(tokenHolder, tokenId, mintAmount, data, { from: operator }); await expectRevert( this.token.$_burn(tokenHolder, tokenId, mintAmount.addn(1)), @@ -142,12 +126,7 @@ contract('ERC1155', function (accounts) { context('with minted-then-burnt tokens', function () { beforeEach(async function () { await this.token.$_mint(tokenHolder, tokenId, mintAmount, data); - (this.receipt = await this.token.$_burn( - tokenHolder, - tokenId, - burnAmount, - { from: operator }, - )); + this.receipt = await this.token.$_burn(tokenHolder, tokenId, burnAmount, { from: operator }); }); it('emits a TransferSingle event', function () { @@ -161,16 +140,13 @@ contract('ERC1155', function (accounts) { }); it('accounts for both minting and burning', async function () { - expect(await this.token.balanceOf( - tokenHolder, - tokenId, - )).to.be.bignumber.equal(mintAmount.sub(burnAmount)); + expect(await this.token.balanceOf(tokenHolder, tokenId)).to.be.bignumber.equal(mintAmount.sub(burnAmount)); }); }); }); describe('_burnBatch', function () { - it('reverts when burning the zero account\'s tokens', async function () { + it("reverts when burning the zero account's tokens", async function () { await expectRevert( this.token.$_burnBatch(ZERO_ADDRESS, tokenBatchIds, burnAmounts), 'ERC1155: burn from the zero address', @@ -199,12 +175,7 @@ contract('ERC1155', function (accounts) { context('with minted-then-burnt tokens', function () { beforeEach(async function () { await this.token.$_mintBatch(tokenBatchHolder, tokenBatchIds, mintAmounts, data); - (this.receipt = await this.token.$_burnBatch( - tokenBatchHolder, - tokenBatchIds, - burnAmounts, - { from: operator }, - )); + this.receipt = await this.token.$_burnBatch(tokenBatchHolder, tokenBatchIds, burnAmounts, { from: operator }); }); it('emits a TransferBatch event', function () { diff --git a/test/token/ERC1155/extensions/ERC1155Burnable.test.js b/test/token/ERC1155/extensions/ERC1155Burnable.test.js index 2c854e2e8..f80d9935a 100644 --- a/test/token/ERC1155/extensions/ERC1155Burnable.test.js +++ b/test/token/ERC1155/extensions/ERC1155Burnable.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC1155Burnable = artifacts.require('$ERC1155Burnable'); contract('ERC1155Burnable', function (accounts) { - const [ holder, operator, other ] = accounts; + const [holder, operator, other] = accounts; const uri = 'https://token.com'; @@ -26,14 +26,14 @@ contract('ERC1155Burnable', function (accounts) { expect(await this.token.balanceOf(holder, tokenIds[0])).to.be.bignumber.equal('1'); }); - it('approved operators can burn the holder\'s tokens', async function () { + it("approved operators can burn the holder's tokens", async function () { await this.token.setApprovalForAll(operator, true, { from: holder }); await this.token.burn(holder, tokenIds[0], amounts[0].subn(1), { from: operator }); expect(await this.token.balanceOf(holder, tokenIds[0])).to.be.bignumber.equal('1'); }); - it('unapproved accounts cannot burn the holder\'s tokens', async function () { + it("unapproved accounts cannot burn the holder's tokens", async function () { await expectRevert( this.token.burn(holder, tokenIds[0], amounts[0].subn(1), { from: other }), 'ERC1155: caller is not token owner or approved', @@ -43,23 +43,23 @@ contract('ERC1155Burnable', function (accounts) { describe('burnBatch', function () { it('holder can burn their tokens', async function () { - await this.token.burnBatch(holder, tokenIds, [ amounts[0].subn(1), amounts[1].subn(2) ], { from: holder }); + await this.token.burnBatch(holder, tokenIds, [amounts[0].subn(1), amounts[1].subn(2)], { from: holder }); expect(await this.token.balanceOf(holder, tokenIds[0])).to.be.bignumber.equal('1'); expect(await this.token.balanceOf(holder, tokenIds[1])).to.be.bignumber.equal('2'); }); - it('approved operators can burn the holder\'s tokens', async function () { + it("approved operators can burn the holder's tokens", async function () { await this.token.setApprovalForAll(operator, true, { from: holder }); - await this.token.burnBatch(holder, tokenIds, [ amounts[0].subn(1), amounts[1].subn(2) ], { from: operator }); + await this.token.burnBatch(holder, tokenIds, [amounts[0].subn(1), amounts[1].subn(2)], { from: operator }); expect(await this.token.balanceOf(holder, tokenIds[0])).to.be.bignumber.equal('1'); expect(await this.token.balanceOf(holder, tokenIds[1])).to.be.bignumber.equal('2'); }); - it('unapproved accounts cannot burn the holder\'s tokens', async function () { + it("unapproved accounts cannot burn the holder's tokens", async function () { await expectRevert( - this.token.burnBatch(holder, tokenIds, [ amounts[0].subn(1), amounts[1].subn(2) ], { from: other }), + this.token.burnBatch(holder, tokenIds, [amounts[0].subn(1), amounts[1].subn(2)], { from: other }), 'ERC1155: caller is not token owner or approved', ); }); diff --git a/test/token/ERC1155/extensions/ERC1155Pausable.test.js b/test/token/ERC1155/extensions/ERC1155Pausable.test.js index e7ace3c2c..f4d5cedec 100644 --- a/test/token/ERC1155/extensions/ERC1155Pausable.test.js +++ b/test/token/ERC1155/extensions/ERC1155Pausable.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC1155Pausable = artifacts.require('$ERC1155Pausable'); contract('ERC1155Pausable', function (accounts) { - const [ holder, operator, receiver, other ] = accounts; + const [holder, operator, receiver, other] = accounts; const uri = 'https://token.com'; @@ -50,9 +50,9 @@ contract('ERC1155Pausable', function (accounts) { it('reverts when trying to safeBatchTransferFrom from operator', async function () { await expectRevert( - this.token.safeBatchTransferFrom( - holder, receiver, [firstTokenId], [firstTokenAmount], '0x', { from: operator }, - ), + this.token.safeBatchTransferFrom(holder, receiver, [firstTokenId], [firstTokenAmount], '0x', { + from: operator, + }), 'ERC1155Pausable: token transfer while paused', ); }); diff --git a/test/token/ERC1155/extensions/ERC1155Supply.test.js b/test/token/ERC1155/extensions/ERC1155Supply.test.js index 0eb4952ab..721d5a782 100644 --- a/test/token/ERC1155/extensions/ERC1155Supply.test.js +++ b/test/token/ERC1155/extensions/ERC1155Supply.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC1155Supply = artifacts.require('$ERC1155Supply'); contract('ERC1155Supply', function (accounts) { - const [ holder ] = accounts; + const [holder] = accounts; const uri = 'https://token.com'; @@ -48,8 +48,8 @@ contract('ERC1155Supply', function (accounts) { beforeEach(async function () { await this.token.$_mintBatch( holder, - [ firstTokenId, secondTokenId ], - [ firstTokenAmount, secondTokenAmount ], + [firstTokenId, secondTokenId], + [firstTokenAmount, secondTokenAmount], '0x', ); }); @@ -86,15 +86,11 @@ contract('ERC1155Supply', function (accounts) { beforeEach(async function () { await this.token.$_mintBatch( holder, - [ firstTokenId, secondTokenId ], - [ firstTokenAmount, secondTokenAmount ], + [firstTokenId, secondTokenId], + [firstTokenAmount, secondTokenAmount], '0x', ); - await this.token.$_burnBatch( - holder, - [ firstTokenId, secondTokenId ], - [ firstTokenAmount, secondTokenAmount ], - ); + await this.token.$_burnBatch(holder, [firstTokenId, secondTokenId], [firstTokenAmount, secondTokenAmount]); }); it('exist', async function () { diff --git a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js index a12a5c972..95d9c18f7 100644 --- a/test/token/ERC1155/extensions/ERC1155URIStorage.test.js +++ b/test/token/ERC1155/extensions/ERC1155URIStorage.test.js @@ -6,7 +6,7 @@ const { artifacts } = require('hardhat'); const ERC1155URIStorage = artifacts.require('$ERC1155URIStorage'); contract(['ERC1155URIStorage'], function (accounts) { - const [ holder ] = accounts; + const [holder] = accounts; const erc1155Uri = 'https://token.com/nfts/'; const baseUri = 'https://token.com/'; diff --git a/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js b/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js index a8d83d123..12d2594d6 100644 --- a/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js +++ b/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js @@ -7,7 +7,7 @@ const { expect } = require('chai'); const ERC1155PresetMinterPauser = artifacts.require('ERC1155PresetMinterPauser'); contract('ERC1155PresetMinterPauser', function (accounts) { - const [ deployer, other ] = accounts; + const [deployer, other] = accounts; const firstTokenId = new BN('845'); const firstTokenIdAmount = new BN('5000'); @@ -50,9 +50,13 @@ contract('ERC1155PresetMinterPauser', function (accounts) { describe('minting', function () { it('deployer can mint tokens', async function () { const receipt = await this.token.mint(other, firstTokenId, firstTokenIdAmount, '0x', { from: deployer }); - expectEvent(receipt, 'TransferSingle', - { operator: deployer, from: ZERO_ADDRESS, to: other, value: firstTokenIdAmount, id: firstTokenId }, - ); + expectEvent(receipt, 'TransferSingle', { + operator: deployer, + from: ZERO_ADDRESS, + to: other, + value: firstTokenIdAmount, + id: firstTokenId, + }); expect(await this.token.balanceOf(other, firstTokenId)).to.be.bignumber.equal(firstTokenIdAmount); }); @@ -68,21 +72,23 @@ contract('ERC1155PresetMinterPauser', function (accounts) { describe('batched minting', function () { it('deployer can batch mint tokens', async function () { const receipt = await this.token.mintBatch( - other, [firstTokenId, secondTokenId], [firstTokenIdAmount, secondTokenIdAmount], '0x', { from: deployer }, + other, + [firstTokenId, secondTokenId], + [firstTokenIdAmount, secondTokenIdAmount], + '0x', + { from: deployer }, ); - expectEvent(receipt, 'TransferBatch', - { operator: deployer, from: ZERO_ADDRESS, to: other }, - ); + expectEvent(receipt, 'TransferBatch', { operator: deployer, from: ZERO_ADDRESS, to: other }); expect(await this.token.balanceOf(other, firstTokenId)).to.be.bignumber.equal(firstTokenIdAmount); }); it('other accounts cannot batch mint tokens', async function () { await expectRevert( - this.token.mintBatch( - other, [firstTokenId, secondTokenId], [firstTokenIdAmount, secondTokenIdAmount], '0x', { from: other }, - ), + this.token.mintBatch(other, [firstTokenId, secondTokenId], [firstTokenIdAmount, secondTokenIdAmount], '0x', { + from: other, + }), 'ERC1155PresetMinterPauser: must have minter role to mint', ); }); @@ -136,9 +142,13 @@ contract('ERC1155PresetMinterPauser', function (accounts) { await this.token.mint(other, firstTokenId, firstTokenIdAmount, '0x', { from: deployer }); const receipt = await this.token.burn(other, firstTokenId, firstTokenIdAmount.subn(1), { from: other }); - expectEvent(receipt, 'TransferSingle', - { operator: other, from: other, to: ZERO_ADDRESS, value: firstTokenIdAmount.subn(1), id: firstTokenId }, - ); + expectEvent(receipt, 'TransferSingle', { + operator: other, + from: other, + to: ZERO_ADDRESS, + value: firstTokenIdAmount.subn(1), + id: firstTokenId, + }); expect(await this.token.balanceOf(other, firstTokenId)).to.be.bignumber.equal('1'); }); diff --git a/test/token/ERC1155/utils/ERC1155Holder.test.js b/test/token/ERC1155/utils/ERC1155Holder.test.js index 736925bd6..864e89b50 100644 --- a/test/token/ERC1155/utils/ERC1155Holder.test.js +++ b/test/token/ERC1155/utils/ERC1155Holder.test.js @@ -32,8 +32,9 @@ contract('ERC1155Holder', function (accounts) { { from: creator }, ); - expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[0])) - .to.be.bignumber.equal(multiTokenAmounts[0]); + expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[0])).to.be.bignumber.equal( + multiTokenAmounts[0], + ); for (let i = 1; i < multiTokenIds.length; i++) { expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[i])).to.be.bignumber.equal(new BN(0)); @@ -43,7 +44,7 @@ contract('ERC1155Holder', function (accounts) { it('receives ERC1155 tokens from a multiple IDs', async function () { for (let i = 0; i < multiTokenIds.length; i++) { expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[i])).to.be.bignumber.equal(new BN(0)); - }; + } await this.multiToken.safeBatchTransferFrom( creator, @@ -55,8 +56,9 @@ contract('ERC1155Holder', function (accounts) { ); for (let i = 0; i < multiTokenIds.length; i++) { - expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[i])) - .to.be.bignumber.equal(multiTokenAmounts[i]); + expect(await this.multiToken.balanceOf(this.holder.address, multiTokenIds[i])).to.be.bignumber.equal( + multiTokenAmounts[i], + ); } }); }); diff --git a/test/token/ERC20/ERC20.behavior.js b/test/token/ERC20/ERC20.behavior.js index 8bc54762a..41e47f065 100644 --- a/test/token/ERC20/ERC20.behavior.js +++ b/test/token/ERC20/ERC20.behavior.js @@ -2,7 +2,7 @@ const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test const { expect } = require('chai'); const { ZERO_ADDRESS, MAX_UINT256 } = constants; -function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recipient, anotherAccount) { +function shouldBehaveLikeERC20(errorPrefix, initialSupply, initialHolder, recipient, anotherAccount) { describe('total supply', function () { it('returns the total amount of tokens', async function () { expect(await this.token.totalSupply()).to.be.bignumber.equal(initialSupply); @@ -24,11 +24,9 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip }); describe('transfer', function () { - shouldBehaveLikeERC20Transfer(errorPrefix, initialHolder, recipient, initialSupply, - function (from, to, value) { - return this.token.transfer(to, value, { from }); - }, - ); + shouldBehaveLikeERC20Transfer(errorPrefix, initialHolder, recipient, initialSupply, function (from, to, value) { + return this.token.transfer(to, value, { from }); + }); }); describe('transfer from', function () { @@ -63,19 +61,19 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip }); it('emits a transfer event', async function () { - expectEvent( - await this.token.transferFrom(tokenOwner, to, amount, { from: spender }), - 'Transfer', - { from: tokenOwner, to: to, value: amount }, - ); + expectEvent(await this.token.transferFrom(tokenOwner, to, amount, { from: spender }), 'Transfer', { + from: tokenOwner, + to: to, + value: amount, + }); }); it('emits an approval event', async function () { - expectEvent( - await this.token.transferFrom(tokenOwner, to, amount, { from: spender }), - 'Approval', - { owner: tokenOwner, spender: spender, value: await this.token.allowance(tokenOwner, spender) }, - ); + expectEvent(await this.token.transferFrom(tokenOwner, to, amount, { from: spender }), 'Approval', { + owner: tokenOwner, + spender: spender, + value: await this.token.allowance(tokenOwner, spender), + }); }); }); @@ -141,10 +139,7 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip }); it('does not emit an approval event', async function () { - expectEvent.notEmitted( - await this.token.transferFrom(tokenOwner, to, 1, { from: spender }), - 'Approval', - ); + expectEvent.notEmitted(await this.token.transferFrom(tokenOwner, to, 1, { from: spender }), 'Approval'); }); }); }); @@ -158,8 +153,9 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip }); it('reverts', async function () { - await expectRevert(this.token.transferFrom( - tokenOwner, to, amount, { from: spender }), `${errorPrefix}: transfer to the zero address`, + await expectRevert( + this.token.transferFrom(tokenOwner, to, amount, { from: spender }), + `${errorPrefix}: transfer to the zero address`, ); }); }); @@ -171,16 +167,17 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip const to = recipient; it('reverts', async function () { - await expectRevert( - this.token.transferFrom(tokenOwner, to, amount, { from: spender }), - 'from the zero address', - ); + await expectRevert(this.token.transferFrom(tokenOwner, to, amount, { from: spender }), 'from the zero address'); }); }); }); describe('approve', function () { - shouldBehaveLikeERC20Approve(errorPrefix, initialHolder, recipient, initialSupply, + shouldBehaveLikeERC20Approve( + errorPrefix, + initialHolder, + recipient, + initialSupply, function (owner, spender, amount) { return this.token.approve(spender, amount, { from: owner }); }, @@ -188,15 +185,13 @@ function shouldBehaveLikeERC20 (errorPrefix, initialSupply, initialHolder, recip }); } -function shouldBehaveLikeERC20Transfer (errorPrefix, from, to, balance, transfer) { +function shouldBehaveLikeERC20Transfer(errorPrefix, from, to, balance, transfer) { describe('when the recipient is not the zero address', function () { describe('when the sender does not have enough balance', function () { const amount = balance.addn(1); it('reverts', async function () { - await expectRevert(transfer.call(this, from, to, amount), - `${errorPrefix}: transfer amount exceeds balance`, - ); + await expectRevert(transfer.call(this, from, to, amount), `${errorPrefix}: transfer amount exceeds balance`); }); }); @@ -212,11 +207,7 @@ function shouldBehaveLikeERC20Transfer (errorPrefix, from, to, balance, transfer }); it('emits a transfer event', async function () { - expectEvent( - await transfer.call(this, from, to, amount), - 'Transfer', - { from, to, value: amount }, - ); + expectEvent(await transfer.call(this, from, to, amount), 'Transfer', { from, to, value: amount }); }); }); @@ -232,35 +223,32 @@ function shouldBehaveLikeERC20Transfer (errorPrefix, from, to, balance, transfer }); it('emits a transfer event', async function () { - expectEvent( - await transfer.call(this, from, to, amount), - 'Transfer', - { from, to, value: amount }, - ); + expectEvent(await transfer.call(this, from, to, amount), 'Transfer', { from, to, value: amount }); }); }); }); describe('when the recipient is the zero address', function () { it('reverts', async function () { - await expectRevert(transfer.call(this, from, ZERO_ADDRESS, balance), + await expectRevert( + transfer.call(this, from, ZERO_ADDRESS, balance), `${errorPrefix}: transfer to the zero address`, ); }); }); } -function shouldBehaveLikeERC20Approve (errorPrefix, owner, spender, supply, approve) { +function shouldBehaveLikeERC20Approve(errorPrefix, owner, spender, supply, approve) { describe('when the spender is not the zero address', function () { describe('when the sender has enough balance', function () { const amount = supply; it('emits an approval event', async function () { - expectEvent( - await approve.call(this, owner, spender, amount), - 'Approval', - { owner: owner, spender: spender, value: amount }, - ); + expectEvent(await approve.call(this, owner, spender, amount), 'Approval', { + owner: owner, + spender: spender, + value: amount, + }); }); describe('when there was no approved amount before', function () { @@ -288,11 +276,11 @@ function shouldBehaveLikeERC20Approve (errorPrefix, owner, spender, supply, appr const amount = supply.addn(1); it('emits an approval event', async function () { - expectEvent( - await approve.call(this, owner, spender, amount), - 'Approval', - { owner: owner, spender: spender, value: amount }, - ); + expectEvent(await approve.call(this, owner, spender, amount), 'Approval', { + owner: owner, + spender: spender, + value: amount, + }); }); describe('when there was no approved amount before', function () { @@ -319,7 +307,8 @@ function shouldBehaveLikeERC20Approve (errorPrefix, owner, spender, supply, appr describe('when the spender is the zero address', function () { it('reverts', async function () { - await expectRevert(approve.call(this, owner, ZERO_ADDRESS, supply), + await expectRevert( + approve.call(this, owner, ZERO_ADDRESS, supply), `${errorPrefix}: approve to the zero address`, ); }); diff --git a/test/token/ERC20/ERC20.test.js b/test/token/ERC20/ERC20.test.js index 10d86e4b4..6971eede9 100644 --- a/test/token/ERC20/ERC20.test.js +++ b/test/token/ERC20/ERC20.test.js @@ -12,7 +12,7 @@ const ERC20 = artifacts.require('$ERC20'); const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); contract('ERC20', function (accounts) { - const [ initialHolder, recipient, anotherAccount ] = accounts; + const [initialHolder, recipient, anotherAccount] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -51,11 +51,12 @@ contract('ERC20', function (accounts) { describe('when the spender is not the zero address', function () { const spender = recipient; - function shouldDecreaseApproval (amount) { + function shouldDecreaseApproval(amount) { describe('when there was no approved amount before', function () { it('reverts', async function () { - await expectRevert(this.token.decreaseAllowance( - spender, amount, { from: initialHolder }), 'ERC20: decreased allowance below zero', + await expectRevert( + this.token.decreaseAllowance(spender, amount, { from: initialHolder }), + 'ERC20: decreased allowance below zero', ); }); }); @@ -113,8 +114,9 @@ contract('ERC20', function (accounts) { const spender = ZERO_ADDRESS; it('reverts', async function () { - await expectRevert(this.token.decreaseAllowance( - spender, amount, { from: initialHolder }), 'ERC20: decreased allowance below zero', + await expectRevert( + this.token.decreaseAllowance(spender, amount, { from: initialHolder }), + 'ERC20: decreased allowance below zero', ); }); }); @@ -128,11 +130,11 @@ contract('ERC20', function (accounts) { describe('when the sender has enough balance', function () { it('emits an approval event', async function () { - expectEvent( - await this.token.increaseAllowance(spender, amount, { from: initialHolder }), - 'Approval', - { owner: initialHolder, spender: spender, value: amount }, - ); + expectEvent(await this.token.increaseAllowance(spender, amount, { from: initialHolder }), 'Approval', { + owner: initialHolder, + spender: spender, + value: amount, + }); }); describe('when there was no approved amount before', function () { @@ -160,11 +162,11 @@ contract('ERC20', function (accounts) { const amount = initialSupply.addn(1); it('emits an approval event', async function () { - expectEvent( - await this.token.increaseAllowance(spender, amount, { from: initialHolder }), - 'Approval', - { owner: initialHolder, spender: spender, value: amount }, - ); + expectEvent(await this.token.increaseAllowance(spender, amount, { from: initialHolder }), 'Approval', { + owner: initialHolder, + spender: spender, + value: amount, + }); }); describe('when there was no approved amount before', function () { @@ -194,7 +196,8 @@ contract('ERC20', function (accounts) { it('reverts', async function () { await expectRevert( - this.token.increaseAllowance(spender, amount, { from: initialHolder }), 'ERC20: approve to the zero address', + this.token.increaseAllowance(spender, amount, { from: initialHolder }), + 'ERC20: approve to the zero address', ); }); }); @@ -203,9 +206,7 @@ contract('ERC20', function (accounts) { describe('_mint', function () { const amount = new BN(50); it('rejects a null account', async function () { - await expectRevert( - this.token.$_mint(ZERO_ADDRESS, amount), 'ERC20: mint to the zero address', - ); + await expectRevert(this.token.$_mint(ZERO_ADDRESS, amount), 'ERC20: mint to the zero address'); }); describe('for a non zero account', function () { @@ -223,11 +224,7 @@ contract('ERC20', function (accounts) { }); it('emits Transfer event', async function () { - const event = expectEvent( - this.receipt, - 'Transfer', - { from: ZERO_ADDRESS, to: recipient }, - ); + const event = expectEvent(this.receipt, 'Transfer', { from: ZERO_ADDRESS, to: recipient }); expect(event.args.value).to.be.bignumber.equal(amount); }); @@ -236,14 +233,14 @@ contract('ERC20', function (accounts) { describe('_burn', function () { it('rejects a null account', async function () { - await expectRevert(this.token.$_burn(ZERO_ADDRESS, new BN(1)), - 'ERC20: burn from the zero address'); + await expectRevert(this.token.$_burn(ZERO_ADDRESS, new BN(1)), 'ERC20: burn from the zero address'); }); describe('for a non zero account', function () { it('rejects burning more than balance', async function () { - await expectRevert(this.token.$_burn( - initialHolder, initialSupply.addn(1)), 'ERC20: burn amount exceeds balance', + await expectRevert( + this.token.$_burn(initialHolder, initialSupply.addn(1)), + 'ERC20: burn amount exceeds balance', ); }); @@ -264,11 +261,7 @@ contract('ERC20', function (accounts) { }); it('emits Transfer event', async function () { - const event = expectEvent( - this.receipt, - 'Transfer', - { from: initialHolder, to: ZERO_ADDRESS }, - ); + const event = expectEvent(this.receipt, 'Transfer', { from: initialHolder, to: ZERO_ADDRESS }); expect(event.args.value).to.be.bignumber.equal(amount); }); @@ -287,7 +280,8 @@ contract('ERC20', function (accounts) { describe('when the sender is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.$_transfer(ZERO_ADDRESS, recipient, initialSupply), + await expectRevert( + this.token.$_transfer(ZERO_ADDRESS, recipient, initialSupply), 'ERC20: transfer from the zero address', ); }); @@ -301,7 +295,8 @@ contract('ERC20', function (accounts) { describe('when the owner is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.$_approve(ZERO_ADDRESS, recipient, initialSupply), + await expectRevert( + this.token.$_approve(ZERO_ADDRESS, recipient, initialSupply), 'ERC20: approve from the zero address', ); }); diff --git a/test/token/ERC20/extensions/ERC20Burnable.behavior.js b/test/token/ERC20/extensions/ERC20Burnable.behavior.js index a931bf60d..2edabc4bf 100644 --- a/test/token/ERC20/extensions/ERC20Burnable.behavior.js +++ b/test/token/ERC20/extensions/ERC20Burnable.behavior.js @@ -3,7 +3,7 @@ const { ZERO_ADDRESS } = constants; const { expect } = require('chai'); -function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { +function shouldBehaveLikeERC20Burnable(owner, initialBalance, [burner]) { describe('burn', function () { describe('when the given amount is not greater than balance of the sender', function () { context('for a zero amount', function () { @@ -14,9 +14,9 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { shouldBurn(new BN(100)); }); - function shouldBurn (amount) { + function shouldBurn(amount) { beforeEach(async function () { - (this.receipt = await this.token.burn(amount, { from: owner })); + this.receipt = await this.token.burn(amount, { from: owner }); }); it('burns the requested amount', async function () { @@ -37,9 +37,7 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { const amount = initialBalance.addn(1); it('reverts', async function () { - await expectRevert(this.token.burn(amount, { from: owner }), - 'ERC20: burn amount exceeds balance', - ); + await expectRevert(this.token.burn(amount, { from: owner }), 'ERC20: burn amount exceeds balance'); }); }); }); @@ -54,7 +52,7 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { shouldBurnFrom(new BN(100)); }); - function shouldBurnFrom (amount) { + function shouldBurnFrom(amount) { const originalAllowance = amount.muln(3); beforeEach(async function () { @@ -85,9 +83,7 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { it('reverts', async function () { await this.token.approve(burner, amount, { from: owner }); - await expectRevert(this.token.burnFrom(owner, amount, { from: burner }), - 'ERC20: burn amount exceeds balance', - ); + await expectRevert(this.token.burnFrom(owner, amount, { from: burner }), 'ERC20: burn amount exceeds balance'); }); }); @@ -96,7 +92,8 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { it('reverts', async function () { await this.token.approve(burner, allowance, { from: owner }); - await expectRevert(this.token.burnFrom(owner, allowance.addn(1), { from: burner }), + await expectRevert( + this.token.burnFrom(owner, allowance.addn(1), { from: burner }), 'ERC20: insufficient allowance', ); }); diff --git a/test/token/ERC20/extensions/ERC20Burnable.test.js b/test/token/ERC20/extensions/ERC20Burnable.test.js index 45264b774..00acc81ed 100644 --- a/test/token/ERC20/extensions/ERC20Burnable.test.js +++ b/test/token/ERC20/extensions/ERC20Burnable.test.js @@ -4,7 +4,7 @@ const { shouldBehaveLikeERC20Burnable } = require('./ERC20Burnable.behavior'); const ERC20Burnable = artifacts.require('$ERC20Burnable'); contract('ERC20Burnable', function (accounts) { - const [ owner, ...otherAccounts ] = accounts; + const [owner, ...otherAccounts] = accounts; const initialBalance = new BN(1000); diff --git a/test/token/ERC20/extensions/ERC20Capped.behavior.js b/test/token/ERC20/extensions/ERC20Capped.behavior.js index fe8c3a4ff..97bad1db1 100644 --- a/test/token/ERC20/extensions/ERC20Capped.behavior.js +++ b/test/token/ERC20/extensions/ERC20Capped.behavior.js @@ -2,7 +2,7 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -function shouldBehaveLikeERC20Capped (accounts, cap) { +function shouldBehaveLikeERC20Capped(accounts, cap) { describe('capped token', function () { const user = accounts[0]; diff --git a/test/token/ERC20/extensions/ERC20FlashMint.test.js b/test/token/ERC20/extensions/ERC20FlashMint.test.js index 86326f95d..76d66ff7a 100644 --- a/test/token/ERC20/extensions/ERC20FlashMint.test.js +++ b/test/token/ERC20/extensions/ERC20FlashMint.test.js @@ -52,10 +52,25 @@ contract('ERC20FlashMint', function (accounts) { const receiver = await ERC3156FlashBorrowerMock.new(true, true); const { tx } = await this.token.flashLoan(receiver.address, this.token.address, loanAmount, '0x'); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: ZERO_ADDRESS, to: receiver.address, value: loanAmount }); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: receiver.address, to: ZERO_ADDRESS, value: loanAmount }); - await expectEvent.inTransaction(tx, receiver, 'BalanceOf', { token: this.token.address, account: receiver.address, value: loanAmount }); - await expectEvent.inTransaction(tx, receiver, 'TotalSupply', { token: this.token.address, value: initialSupply.add(loanAmount) }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: ZERO_ADDRESS, + to: receiver.address, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: receiver.address, + to: ZERO_ADDRESS, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, receiver, 'BalanceOf', { + token: this.token.address, + account: receiver.address, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, receiver, 'TotalSupply', { + token: this.token.address, + value: initialSupply.add(loanAmount), + }); expect(await this.token.totalSupply()).to.be.bignumber.equal(initialSupply); expect(await this.token.balanceOf(receiver.address)).to.be.bignumber.equal('0'); @@ -101,7 +116,11 @@ contract('ERC20FlashMint', function (accounts) { beforeEach('init receiver balance & set flash fee', async function () { this.receiver = await ERC3156FlashBorrowerMock.new(true, true); const receipt = await this.token.$_mint(this.receiver.address, receiverInitialBalance); - await expectEvent(receipt, 'Transfer', { from: ZERO_ADDRESS, to: this.receiver.address, value: receiverInitialBalance }); + await expectEvent(receipt, 'Transfer', { + from: ZERO_ADDRESS, + to: this.receiver.address, + value: receiverInitialBalance, + }); expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal(receiverInitialBalance); await this.token.setFlashFee(flashFee); @@ -110,13 +129,32 @@ contract('ERC20FlashMint', function (accounts) { it('default flash fee receiver', async function () { const { tx } = await this.token.flashLoan(this.receiver.address, this.token.address, loanAmount, '0x'); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: ZERO_ADDRESS, to: this.receiver.address, value: loanAmount }); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.receiver.address, to: ZERO_ADDRESS, value: loanAmount.add(flashFee) }); - await expectEvent.inTransaction(tx, this.receiver, 'BalanceOf', { token: this.token.address, account: this.receiver.address, value: receiverInitialBalance.add(loanAmount) }); - await expectEvent.inTransaction(tx, this.receiver, 'TotalSupply', { token: this.token.address, value: initialSupply.add(receiverInitialBalance).add(loanAmount) }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: ZERO_ADDRESS, + to: this.receiver.address, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.receiver.address, + to: ZERO_ADDRESS, + value: loanAmount.add(flashFee), + }); + await expectEvent.inTransaction(tx, this.receiver, 'BalanceOf', { + token: this.token.address, + account: this.receiver.address, + value: receiverInitialBalance.add(loanAmount), + }); + await expectEvent.inTransaction(tx, this.receiver, 'TotalSupply', { + token: this.token.address, + value: initialSupply.add(receiverInitialBalance).add(loanAmount), + }); - expect(await this.token.totalSupply()).to.be.bignumber.equal(initialSupply.add(receiverInitialBalance).sub(flashFee)); - expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal(receiverInitialBalance.sub(flashFee)); + expect(await this.token.totalSupply()).to.be.bignumber.equal( + initialSupply.add(receiverInitialBalance).sub(flashFee), + ); + expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal( + receiverInitialBalance.sub(flashFee), + ); expect(await this.token.balanceOf(await this.token.$_flashFeeReceiver())).to.be.bignumber.equal('0'); expect(await this.token.allowance(this.receiver.address, this.token.address)).to.be.bignumber.equal('0'); }); @@ -129,14 +167,35 @@ contract('ERC20FlashMint', function (accounts) { expect(await this.token.balanceOf(flashFeeReceiverAddress)).to.be.bignumber.equal('0'); const { tx } = await this.token.flashLoan(this.receiver.address, this.token.address, loanAmount, '0x'); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: ZERO_ADDRESS, to: this.receiver.address, value: loanAmount }); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.receiver.address, to: ZERO_ADDRESS, value: loanAmount }); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.receiver.address, to: flashFeeReceiverAddress, value: flashFee }); - await expectEvent.inTransaction(tx, this.receiver, 'BalanceOf', { token: this.token.address, account: this.receiver.address, value: receiverInitialBalance.add(loanAmount) }); - await expectEvent.inTransaction(tx, this.receiver, 'TotalSupply', { token: this.token.address, value: initialSupply.add(receiverInitialBalance).add(loanAmount) }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: ZERO_ADDRESS, + to: this.receiver.address, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.receiver.address, + to: ZERO_ADDRESS, + value: loanAmount, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.receiver.address, + to: flashFeeReceiverAddress, + value: flashFee, + }); + await expectEvent.inTransaction(tx, this.receiver, 'BalanceOf', { + token: this.token.address, + account: this.receiver.address, + value: receiverInitialBalance.add(loanAmount), + }); + await expectEvent.inTransaction(tx, this.receiver, 'TotalSupply', { + token: this.token.address, + value: initialSupply.add(receiverInitialBalance).add(loanAmount), + }); expect(await this.token.totalSupply()).to.be.bignumber.equal(initialSupply.add(receiverInitialBalance)); - expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal(receiverInitialBalance.sub(flashFee)); + expect(await this.token.balanceOf(this.receiver.address)).to.be.bignumber.equal( + receiverInitialBalance.sub(flashFee), + ); expect(await this.token.balanceOf(flashFeeReceiverAddress)).to.be.bignumber.equal(flashFee); expect(await this.token.allowance(this.receiver.address, flashFeeReceiverAddress)).to.be.bignumber.equal('0'); }); diff --git a/test/token/ERC20/extensions/ERC20Pausable.test.js b/test/token/ERC20/extensions/ERC20Pausable.test.js index 03c630451..ead442b99 100644 --- a/test/token/ERC20/extensions/ERC20Pausable.test.js +++ b/test/token/ERC20/extensions/ERC20Pausable.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC20Pausable = artifacts.require('$ERC20Pausable'); contract('ERC20Pausable', function (accounts) { - const [ holder, recipient, anotherAccount ] = accounts; + const [holder, recipient, anotherAccount] = accounts; const initialSupply = new BN(100); @@ -39,7 +39,8 @@ contract('ERC20Pausable', function (accounts) { it('reverts when trying to transfer when paused', async function () { await this.token.$_pause(); - await expectRevert(this.token.transfer(recipient, initialSupply, { from: holder }), + await expectRevert( + this.token.transfer(recipient, initialSupply, { from: holder }), 'ERC20Pausable: token transfer while paused', ); }); @@ -72,8 +73,9 @@ contract('ERC20Pausable', function (accounts) { it('reverts when trying to transfer from when paused', async function () { await this.token.$_pause(); - await expectRevert(this.token.transferFrom( - holder, recipient, allowance, { from: anotherAccount }), 'ERC20Pausable: token transfer while paused', + await expectRevert( + this.token.transferFrom(holder, recipient, allowance, { from: anotherAccount }), + 'ERC20Pausable: token transfer while paused', ); }); }); @@ -99,9 +101,7 @@ contract('ERC20Pausable', function (accounts) { it('reverts when trying to mint when paused', async function () { await this.token.$_pause(); - await expectRevert(this.token.$_mint(recipient, amount), - 'ERC20Pausable: token transfer while paused', - ); + await expectRevert(this.token.$_mint(recipient, amount), 'ERC20Pausable: token transfer while paused'); }); }); @@ -126,9 +126,7 @@ contract('ERC20Pausable', function (accounts) { it('reverts when trying to burn when paused', async function () { await this.token.$_pause(); - await expectRevert(this.token.$_burn(holder, amount), - 'ERC20Pausable: token transfer while paused', - ); + await expectRevert(this.token.$_burn(holder, amount), 'ERC20Pausable: token transfer while paused'); }); }); }); diff --git a/test/token/ERC20/extensions/ERC20Snapshot.test.js b/test/token/ERC20/extensions/ERC20Snapshot.test.js index 6f7646d77..fb0bb31d3 100644 --- a/test/token/ERC20/extensions/ERC20Snapshot.test.js +++ b/test/token/ERC20/extensions/ERC20Snapshot.test.js @@ -4,7 +4,7 @@ const ERC20Snapshot = artifacts.require('$ERC20Snapshot'); const { expect } = require('chai'); contract('ERC20Snapshot', function (accounts) { - const [ initialHolder, recipient, other ] = accounts; + const [initialHolder, recipient, other] = accounts; const initialSupply = new BN(100); @@ -123,8 +123,9 @@ contract('ERC20Snapshot', function (accounts) { context('with no balance changes after the snapshot', function () { it('returns the current balance for all accounts', async function () { - expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)) - .to.be.bignumber.equal(initialSupply); + expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)).to.be.bignumber.equal( + initialSupply, + ); expect(await this.token.balanceOfAt(recipient, this.initialSnapshotId)).to.be.bignumber.equal('0'); expect(await this.token.balanceOfAt(other, this.initialSnapshotId)).to.be.bignumber.equal('0'); }); @@ -138,8 +139,9 @@ contract('ERC20Snapshot', function (accounts) { }); it('returns the balances before the changes', async function () { - expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)) - .to.be.bignumber.equal(initialSupply); + expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)).to.be.bignumber.equal( + initialSupply, + ); expect(await this.token.balanceOfAt(recipient, this.initialSnapshotId)).to.be.bignumber.equal('0'); expect(await this.token.balanceOfAt(other, this.initialSnapshotId)).to.be.bignumber.equal('0'); }); @@ -153,8 +155,9 @@ contract('ERC20Snapshot', function (accounts) { }); it('snapshots return the balances before and after the changes', async function () { - expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)) - .to.be.bignumber.equal(initialSupply); + expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)).to.be.bignumber.equal( + initialSupply, + ); expect(await this.token.balanceOfAt(recipient, this.initialSnapshotId)).to.be.bignumber.equal('0'); expect(await this.token.balanceOfAt(other, this.initialSnapshotId)).to.be.bignumber.equal('0'); @@ -181,8 +184,9 @@ contract('ERC20Snapshot', function (accounts) { }); it('all posterior snapshots return the supply after the changes', async function () { - expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)) - .to.be.bignumber.equal(initialSupply); + expect(await this.token.balanceOfAt(initialHolder, this.initialSnapshotId)).to.be.bignumber.equal( + initialSupply, + ); expect(await this.token.balanceOfAt(recipient, this.initialSnapshotId)).to.be.bignumber.equal('0'); expect(await this.token.balanceOfAt(other, this.initialSnapshotId)).to.be.bignumber.equal('0'); @@ -193,9 +197,7 @@ contract('ERC20Snapshot', function (accounts) { expect(await this.token.balanceOfAt(recipient, id)).to.be.bignumber.equal( await this.token.balanceOf(recipient), ); - expect(await this.token.balanceOfAt(other, id)).to.be.bignumber.equal( - await this.token.balanceOf(other), - ); + expect(await this.token.balanceOfAt(other, id)).to.be.bignumber.equal(await this.token.balanceOf(other)); } }); }); diff --git a/test/token/ERC20/extensions/ERC20Votes.test.js b/test/token/ERC20/extensions/ERC20Votes.test.js index 18d3011cd..a340e71a7 100644 --- a/test/token/ERC20/extensions/ERC20Votes.test.js +++ b/test/token/ERC20/extensions/ERC20Votes.test.js @@ -21,7 +21,7 @@ const Delegation = [ ]; contract('ERC20Votes', function (accounts) { - const [ holder, recipient, holderDelegatee, other1, other2 ] = accounts; + const [holder, recipient, holderDelegatee, other1, other2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -38,19 +38,14 @@ contract('ERC20Votes', function (accounts) { }); it('domain separator', async function () { - expect( - await this.token.DOMAIN_SEPARATOR(), - ).to.equal( + expect(await this.token.DOMAIN_SEPARATOR()).to.equal( await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); it('minting restriction', async function () { const amount = new BN('2').pow(new BN('224')); - await expectRevert( - this.token.$_mint(holder, amount), - 'ERC20Votes: total supply risks overflowing votes', - ); + await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); }); it('recent checkpoints', async function () { @@ -112,26 +107,30 @@ contract('ERC20Votes', function (accounts) { const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); const nonce = 0; - const buildData = (chainId, verifyingContract, message) => ({ data: { - primaryType: 'Delegation', - types: { EIP712Domain, Delegation }, - domain: { name, version, chainId, verifyingContract }, - message, - }}); + const buildData = (chainId, verifyingContract, message) => ({ + data: { + primaryType: 'Delegation', + types: { EIP712Domain, Delegation }, + domain: { name, version, chainId, verifyingContract }, + message, + }, + }); beforeEach(async function () { await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -156,14 +155,16 @@ contract('ERC20Votes', function (accounts) { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -174,14 +175,16 @@ contract('ERC20Votes', function (accounts) { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); @@ -191,14 +194,16 @@ contract('ERC20Votes', function (accounts) { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'ERC20Votes: invalid nonce', @@ -207,14 +212,16 @@ contract('ERC20Votes', function (accounts) { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry, + }), + ), + ); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), @@ -281,10 +288,18 @@ contract('ERC20Votes', function (accounts) { const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: holder, previousBalance: supply, newBalance: supply.subn(1) }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.holderVotes = supply.subn(1); this.recipientVotes = '0'; @@ -298,7 +313,11 @@ contract('ERC20Votes', function (accounts) { expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.holderVotes = '0'; this.recipientVotes = '1'; @@ -310,11 +329,19 @@ contract('ERC20Votes', function (accounts) { const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: holder, previousBalance: supply, newBalance: supply.subn(1) }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.holderVotes = supply.subn(1); this.recipientVotes = '1'; @@ -361,10 +388,10 @@ contract('ERC20Votes', function (accounts) { const t4 = await this.token.transfer(recipient, 20, { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([ t1.receipt.blockNumber.toString(), '100' ]); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ t2.receipt.blockNumber.toString(), '90' ]); - expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ t3.receipt.blockNumber.toString(), '80' ]); - expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([ t4.receipt.blockNumber.toString(), '100' ]); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '100']); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.receipt.blockNumber.toString(), '90']); + expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.receipt.blockNumber.toString(), '80']); + expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); await time.advanceBlock(); expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('100'); @@ -377,28 +404,25 @@ contract('ERC20Votes', function (accounts) { await this.token.transfer(recipient, '100', { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - const [ t1, t2, t3 ] = await batchInBlock([ + const [t1, t2, t3] = await batchInBlock([ () => this.token.delegate(other1, { from: recipient, gas: 100000 }), () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), ]); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([ t1.receipt.blockNumber.toString(), '80' ]); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '80']); // expectReve(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check // expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check const t4 = await this.token.transfer(recipient, 20, { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ t4.receipt.blockNumber.toString(), '100' ]); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); }); }); describe('getPastVotes', function () { it('reverts if block number >= current block', async function () { - await expectRevert( - this.token.getPastVotes(other1, 5e10), - 'ERC20Votes: block not yet mined', - ); + await expectRevert(this.token.getPastVotes(other1, 5e10), 'ERC20Votes: block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { @@ -410,8 +434,12 @@ contract('ERC20Votes', function (accounts) { await time.advanceBlock(); await time.advanceBlock(); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('returns zero if < first checkpoint block', async function () { @@ -421,7 +449,9 @@ contract('ERC20Votes', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('generally returns the voting balance at the appropriate checkpoint', async function () { @@ -439,14 +469,30 @@ contract('ERC20Votes', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); }); }); @@ -457,10 +503,7 @@ contract('ERC20Votes', function (accounts) { }); it('reverts if block number >= current block', async function () { - await expectRevert( - this.token.getPastTotalSupply(5e10), - 'ERC20Votes: block not yet mined', - ); + await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { @@ -484,7 +527,9 @@ contract('ERC20Votes', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('generally returns the voting balance at the appropriate checkpoint', async function () { @@ -502,14 +547,30 @@ contract('ERC20Votes', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); }); }); diff --git a/test/token/ERC20/extensions/ERC20VotesComp.test.js b/test/token/ERC20/extensions/ERC20VotesComp.test.js index 5efaa5561..6a7c00013 100644 --- a/test/token/ERC20/extensions/ERC20VotesComp.test.js +++ b/test/token/ERC20/extensions/ERC20VotesComp.test.js @@ -21,7 +21,7 @@ const Delegation = [ ]; contract('ERC20VotesComp', function (accounts) { - const [ holder, recipient, holderDelegatee, other1, other2 ] = accounts; + const [holder, recipient, holderDelegatee, other1, other2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -38,19 +38,14 @@ contract('ERC20VotesComp', function (accounts) { }); it('domain separator', async function () { - expect( - await this.token.DOMAIN_SEPARATOR(), - ).to.equal( + expect(await this.token.DOMAIN_SEPARATOR()).to.equal( await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); it('minting restriction', async function () { const amount = new BN('2').pow(new BN('96')); - await expectRevert( - this.token.$_mint(holder, amount), - 'ERC20Votes: total supply risks overflowing votes', - ); + await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); }); describe('set delegation', function () { @@ -99,26 +94,30 @@ contract('ERC20VotesComp', function (accounts) { const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); const nonce = 0; - const buildData = (chainId, verifyingContract, message) => ({ data: { - primaryType: 'Delegation', - types: { EIP712Domain, Delegation }, - domain: { name, version, chainId, verifyingContract }, - message, - }}); + const buildData = (chainId, verifyingContract, message) => ({ + data: { + primaryType: 'Delegation', + types: { EIP712Domain, Delegation }, + domain: { name, version, chainId, verifyingContract }, + message, + }, + }); beforeEach(async function () { await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -143,14 +142,16 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -161,14 +162,16 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); @@ -178,14 +181,16 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }), + ), + ); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'ERC20Votes: invalid nonce', @@ -194,14 +199,16 @@ contract('ERC20VotesComp', function (accounts) { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig(ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - )); + const { v, r, s } = fromRpcSig( + ethSigUtil.signTypedMessage( + delegator.getPrivateKey(), + buildData(this.chainId, this.token.address, { + delegatee: delegatorAddress, + nonce, + expiry, + }), + ), + ); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), @@ -268,7 +275,11 @@ contract('ERC20VotesComp', function (accounts) { const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: holder, previousBalance: supply, newBalance: supply.subn(1) }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); this.holderVotes = supply.subn(1); this.recipientVotes = '0'; @@ -291,7 +302,11 @@ contract('ERC20VotesComp', function (accounts) { const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: holder, previousBalance: supply, newBalance: supply.subn(1) }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); this.holderVotes = supply.subn(1); @@ -339,10 +354,10 @@ contract('ERC20VotesComp', function (accounts) { const t4 = await this.token.transfer(recipient, 20, { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([ t1.receipt.blockNumber.toString(), '100' ]); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ t2.receipt.blockNumber.toString(), '90' ]); - expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ t3.receipt.blockNumber.toString(), '80' ]); - expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([ t4.receipt.blockNumber.toString(), '100' ]); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '100']); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.receipt.blockNumber.toString(), '90']); + expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.receipt.blockNumber.toString(), '80']); + expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); await time.advanceBlock(); expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('100'); @@ -355,28 +370,25 @@ contract('ERC20VotesComp', function (accounts) { await this.token.transfer(recipient, '100', { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - const [ t1, t2, t3 ] = await batchInBlock([ + const [t1, t2, t3] = await batchInBlock([ () => this.token.delegate(other1, { from: recipient, gas: 100000 }), () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), ]); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([ t1.receipt.blockNumber.toString(), '80' ]); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '80']); // expectReve(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check // expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check const t4 = await this.token.transfer(recipient, 20, { from: holder }); expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ t4.receipt.blockNumber.toString(), '100' ]); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); }); }); describe('getPriorVotes', function () { it('reverts if block number >= current block', async function () { - await expectRevert( - this.token.getPriorVotes(other1, 5e10), - 'ERC20Votes: block not yet mined', - ); + await expectRevert(this.token.getPriorVotes(other1, 5e10), 'ERC20Votes: block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { @@ -388,8 +400,12 @@ contract('ERC20VotesComp', function (accounts) { await time.advanceBlock(); await time.advanceBlock(); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('returns zero if < first checkpoint block', async function () { @@ -399,7 +415,9 @@ contract('ERC20VotesComp', function (accounts) { await time.advanceBlock(); expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('generally returns the voting balance at the appropriate checkpoint', async function () { @@ -417,14 +435,30 @@ contract('ERC20VotesComp', function (accounts) { await time.advanceBlock(); expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); }); }); @@ -435,10 +469,7 @@ contract('ERC20VotesComp', function (accounts) { }); it('reverts if block number >= current block', async function () { - await expectRevert( - this.token.getPastTotalSupply(5e10), - 'ERC20Votes: block not yet mined', - ); + await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: block not yet mined'); }); it('returns 0 if there are no checkpoints', async function () { @@ -462,7 +493,9 @@ contract('ERC20VotesComp', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); it('generally returns the voting balance at the appropriate checkpoint', async function () { @@ -480,14 +513,30 @@ contract('ERC20VotesComp', function (accounts) { await time.advanceBlock(); expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999990'); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal('9999999999999999999999980'); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal('10000000000000000000000000'); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); }); }); }); diff --git a/test/token/ERC20/extensions/ERC20Wrapper.test.js b/test/token/ERC20/extensions/ERC20Wrapper.test.js index a82164cdf..cfb47bfa2 100644 --- a/test/token/ERC20/extensions/ERC20Wrapper.test.js +++ b/test/token/ERC20/extensions/ERC20Wrapper.test.js @@ -9,7 +9,7 @@ const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); const ERC20Wrapper = artifacts.require('$ERC20Wrapper'); contract('ERC20', function (accounts) { - const [ initialHolder, recipient, anotherAccount ] = accounts; + const [initialHolder, recipient, anotherAccount] = accounts; const name = 'My Token'; const symbol = 'MTKN'; diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index d095fb9d9..f85ffd56d 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -5,11 +5,11 @@ const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); const ERC4626 = artifacts.require('$ERC4626'); const ERC4626Decimals = artifacts.require('$ERC4626DecimalsMock'); -const parseToken = (token) => (new BN(token)).mul(new BN('1000000000000')); -const parseShare = (share) => (new BN(share)).mul(new BN('1000000000000000000')); +const parseToken = token => new BN(token).mul(new BN('1000000000000')); +const parseShare = share => new BN(share).mul(new BN('1000000000000000000')); contract('ERC4626', function (accounts) { - const [ holder, recipient, spender, other, user1, user2 ] = accounts; + const [holder, recipient, spender, other, user1, user2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -31,7 +31,7 @@ contract('ERC4626', function (accounts) { }); it('inherit decimals if from asset', async function () { - for (const decimals of [ 0, 9, 12, 18, 36 ].map(web3.utils.toBN)) { + for (const decimals of [0, 9, 12, 18, 36].map(web3.utils.toBN)) { const token = await ERC20Decimals.new('', '', decimals); const vault = await ERC4626.new('', '', token.address); expect(await vault.decimals()).to.be.bignumber.equal(decimals); diff --git a/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/test/token/ERC20/extensions/draft-ERC20Permit.test.js index 0c6b0982d..eb6737826 100644 --- a/test/token/ERC20/extensions/draft-ERC20Permit.test.js +++ b/test/token/ERC20/extensions/draft-ERC20Permit.test.js @@ -14,7 +14,7 @@ const { EIP712Domain, Permit, domainSeparator } = require('../../../helpers/eip7 const { getChainId } = require('../../../helpers/chainid'); contract('ERC20Permit', function (accounts) { - const [ initialHolder, spender ] = accounts; + const [initialHolder, spender] = accounts; const name = 'My Token'; const symbol = 'MTKN'; @@ -34,9 +34,7 @@ contract('ERC20Permit', function (accounts) { }); it('domain separator', async function () { - expect( - await this.token.DOMAIN_SEPARATOR(), - ).to.equal( + expect(await this.token.DOMAIN_SEPARATOR()).to.equal( await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), ); }); @@ -99,10 +97,7 @@ contract('ERC20Permit', function (accounts) { const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data }); const { v, r, s } = fromRpcSig(signature); - await expectRevert( - this.token.permit(owner, spender, value, deadline, v, r, s), - 'ERC20Permit: expired deadline', - ); + await expectRevert(this.token.permit(owner, spender, value, deadline, v, r, s), 'ERC20Permit: expired deadline'); }); }); }); diff --git a/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js b/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js index c143790f4..ad9ff29c5 100644 --- a/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js +++ b/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js @@ -6,7 +6,7 @@ const { expect } = require('chai'); const ERC20PresetMinterPauser = artifacts.require('ERC20PresetMinterPauser'); contract('ERC20PresetMinterPauser', function (accounts) { - const [ deployer, other ] = accounts; + const [deployer, other] = accounts; const name = 'MinterPauserToken'; const symbol = 'DRT'; @@ -84,10 +84,7 @@ contract('ERC20PresetMinterPauser', function (accounts) { }); it('other accounts cannot pause', async function () { - await expectRevert( - this.token.pause({ from: other }), - 'ERC20PresetMinterPauser: must have pauser role to pause', - ); + await expectRevert(this.token.pause({ from: other }), 'ERC20PresetMinterPauser: must have pauser role to pause'); }); it('other accounts cannot unpause', async function () { diff --git a/test/token/ERC20/utils/SafeERC20.test.js b/test/token/ERC20/utils/SafeERC20.test.js index dab116131..878989cb1 100644 --- a/test/token/ERC20/utils/SafeERC20.test.js +++ b/test/token/ERC20/utils/SafeERC20.test.js @@ -14,7 +14,7 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; contract('SafeERC20', function (accounts) { - const [ hasNoCode ] = accounts; + const [hasNoCode] = accounts; before(async function () { this.mock = await SafeERC20.new(); @@ -52,7 +52,7 @@ contract('SafeERC20', function (accounts) { shouldOnlyRevertOnErrors(); }); - describe('with token that doesn\'t revert on invalid permit', function () { + describe("with token that doesn't revert on invalid permit", function () { const wallet = Wallet.generate(); const owner = wallet.getAddressString(); const spender = hasNoCode; @@ -169,12 +169,9 @@ contract('SafeERC20', function (accounts) { }); }); -function shouldRevertOnAllCalls (reason) { +function shouldRevertOnAllCalls(reason) { it('reverts on transfer', async function () { - await expectRevert( - this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0), - reason, - ); + await expectRevert(this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0), reason); }); it('reverts on transferFrom', async function () { @@ -185,10 +182,7 @@ function shouldRevertOnAllCalls (reason) { }); it('reverts on approve', async function () { - await expectRevert( - this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0), - reason, - ); + await expectRevert(this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0), reason); }); it('reverts on increaseAllowance', async function () { @@ -202,12 +196,12 @@ function shouldRevertOnAllCalls (reason) { }); } -function shouldOnlyRevertOnErrors () { - it('doesn\'t revert on transfer', async function () { +function shouldOnlyRevertOnErrors() { + it("doesn't revert on transfer", async function () { await this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0); }); - it('doesn\'t revert on transferFrom', async function () { + it("doesn't revert on transferFrom", async function () { await this.mock.$safeTransferFrom(this.token.address, this.mock.address, constants.ZERO_ADDRESS, 0); }); @@ -217,15 +211,15 @@ function shouldOnlyRevertOnErrors () { await this.token.setAllowance(this.mock.address, 0); }); - it('doesn\'t revert when approving a non-zero allowance', async function () { + it("doesn't revert when approving a non-zero allowance", async function () { await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 100); }); - it('doesn\'t revert when approving a zero allowance', async function () { + it("doesn't revert when approving a zero allowance", async function () { await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); }); - it('doesn\'t revert when increasing the allowance', async function () { + it("doesn't revert when increasing the allowance", async function () { await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); }); @@ -249,15 +243,15 @@ function shouldOnlyRevertOnErrors () { ); }); - it('doesn\'t revert when approving a zero allowance', async function () { + it("doesn't revert when approving a zero allowance", async function () { await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); }); - it('doesn\'t revert when increasing the allowance', async function () { + it("doesn't revert when increasing the allowance", async function () { await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); }); - it('doesn\'t revert when decreasing the allowance to a positive value', async function () { + it("doesn't revert when decreasing the allowance to a positive value", async function () { await this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 50); }); diff --git a/test/token/ERC20/utils/TokenTimelock.test.js b/test/token/ERC20/utils/TokenTimelock.test.js index 4e0dc0a84..22e8071eb 100644 --- a/test/token/ERC20/utils/TokenTimelock.test.js +++ b/test/token/ERC20/utils/TokenTimelock.test.js @@ -6,7 +6,7 @@ const ERC20 = artifacts.require('$ERC20'); const TokenTimelock = artifacts.require('TokenTimelock'); contract('TokenTimelock', function (accounts) { - const [ beneficiary ] = accounts; + const [beneficiary] = accounts; const name = 'My Token'; const symbol = 'MTKN'; diff --git a/test/token/ERC721/ERC721.behavior.js b/test/token/ERC721/ERC721.behavior.js index 436841a25..c09479572 100644 --- a/test/token/ERC721/ERC721.behavior.js +++ b/test/token/ERC721/ERC721.behavior.js @@ -6,8 +6,10 @@ const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsI const ERC721ReceiverMock = artifacts.require('ERC721ReceiverMock'); -const Error = [ 'None', 'RevertWithMessage', 'RevertWithoutMessage', 'Panic' ] - .reduce((acc, entry, idx) => Object.assign({ [entry]: idx }, acc), {}); +const Error = ['None', 'RevertWithMessage', 'RevertWithoutMessage', 'Panic'].reduce( + (acc, entry, idx) => Object.assign({ [entry]: idx }, acc), + {}, +); const firstTokenId = new BN('5042'); const secondTokenId = new BN('79217'); @@ -17,11 +19,8 @@ const baseURI = 'https://api.example.com/v1/'; const RECEIVER_MAGIC_VALUE = '0x150b7a02'; -function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, anotherApproved, operator, other) { - shouldSupportInterfaces([ - 'ERC165', - 'ERC721', - ]); +function shouldBehaveLikeERC721(errorPrefix, owner, newOwner, approved, anotherApproved, operator, other) { + shouldSupportInterfaces(['ERC165', 'ERC721']); context('with minted tokens', function () { beforeEach(async function () { @@ -45,9 +44,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when querying the zero address', function () { it('throws', async function () { - await expectRevert( - this.token.balanceOf(ZERO_ADDRESS), 'ERC721: address zero is not a valid owner', - ); + await expectRevert(this.token.balanceOf(ZERO_ADDRESS), 'ERC721: address zero is not a valid owner'); }); }); }); @@ -65,9 +62,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another const tokenId = nonExistentTokenId; it('reverts', async function () { - await expectRevert( - this.token.ownerOf(tokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); }); }); }); @@ -112,21 +107,21 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another const shouldTransferTokensByUsers = function (transferFunction) { context('when called by the owner', function () { beforeEach(async function () { - (receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: owner })); + receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: owner }); }); transferWasSuccessful({ owner, tokenId, approved }); }); context('when called by the approved individual', function () { beforeEach(async function () { - (receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: approved })); + receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: approved }); }); transferWasSuccessful({ owner, tokenId, approved }); }); context('when called by the operator', function () { beforeEach(async function () { - (receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: operator })); + receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: operator }); }); transferWasSuccessful({ owner, tokenId, approved }); }); @@ -134,14 +129,14 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when called by the owner without an approved user', function () { beforeEach(async function () { await this.token.approve(ZERO_ADDRESS, tokenId, { from: owner }); - (receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: operator })); + receipt = await transferFunction.call(this, owner, this.toWhom, tokenId, { from: operator }); }); transferWasSuccessful({ owner, tokenId, approved: null }); }); context('when sent to the owner', function () { beforeEach(async function () { - (receipt = await transferFunction.call(this, owner, owner, tokenId, { from: owner })); + receipt = await transferFunction.call(this, owner, owner, tokenId, { from: owner }); }); it('keeps ownership of the token', async function () { @@ -166,12 +161,11 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('keeps same tokens by index', async function () { if (!this.token.tokenOfOwnerByIndex) return; - const tokensListed = await Promise.all( - [0, 1].map(i => this.token.tokenOfOwnerByIndex(owner, i)), - ); - expect(tokensListed.map(t => t.toNumber())).to.have.members( - [firstTokenId.toNumber(), secondTokenId.toNumber()], - ); + const tokensListed = await Promise.all([0, 1].map(i => this.token.tokenOfOwnerByIndex(owner, i))); + expect(tokensListed.map(t => t.toNumber())).to.have.members([ + firstTokenId.toNumber(), + secondTokenId.toNumber(), + ]); }); }); @@ -265,13 +259,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('with an invalid token id', function () { it('reverts', async function () { await expectRevert( - transferFun.call( - this, - owner, - this.receiver.address, - nonExistentTokenId, - { from: owner }, - ), + transferFun.call(this, owner, this.receiver.address, nonExistentTokenId, { from: owner }), 'ERC721: invalid token ID', ); }); @@ -342,7 +330,8 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another const tokenId = fourthTokenId; const data = '0x42'; - describe('via safeMint', function () { // regular minting is tested in ERC721Mintable.test.js and others + describe('via safeMint', function () { + // regular minting is tested in ERC721Mintable.test.js and others it('calls onERC721Received — with data', async function () { this.receiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.None); const receipt = await this.token.$_safeMint(this.receiver.address, tokenId, data); @@ -397,9 +386,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('to a receiver contract that panics', function () { it('reverts', async function () { const revertingReceiver = await ERC721ReceiverMock.new(RECEIVER_MAGIC_VALUE, Error.Panic); - await expectRevert.unspecified( - this.token.$_safeMint(revertingReceiver.address, tokenId), - ); + await expectRevert.unspecified(this.token.$_safeMint(revertingReceiver.address, tokenId)); }); }); @@ -445,7 +432,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when clearing approval', function () { context('when there was no prior approval', function () { beforeEach(async function () { - (receipt = await this.token.approve(ZERO_ADDRESS, tokenId, { from: owner })); + receipt = await this.token.approve(ZERO_ADDRESS, tokenId, { from: owner }); }); itClearsApproval(); @@ -455,7 +442,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when there was a prior approval', function () { beforeEach(async function () { await this.token.approve(approved, tokenId, { from: owner }); - (receipt = await this.token.approve(ZERO_ADDRESS, tokenId, { from: owner })); + receipt = await this.token.approve(ZERO_ADDRESS, tokenId, { from: owner }); }); itClearsApproval(); @@ -466,7 +453,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when approving a non-zero address', function () { context('when there was no prior approval', function () { beforeEach(async function () { - (receipt = await this.token.approve(approved, tokenId, { from: owner })); + receipt = await this.token.approve(approved, tokenId, { from: owner }); }); itApproves(approved); @@ -476,7 +463,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when there was a prior approval to the same address', function () { beforeEach(async function () { await this.token.approve(approved, tokenId, { from: owner }); - (receipt = await this.token.approve(approved, tokenId, { from: owner })); + receipt = await this.token.approve(approved, tokenId, { from: owner }); }); itApproves(approved); @@ -486,7 +473,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when there was a prior approval to a different address', function () { beforeEach(async function () { await this.token.approve(anotherApproved, tokenId, { from: owner }); - (receipt = await this.token.approve(anotherApproved, tokenId, { from: owner })); + receipt = await this.token.approve(anotherApproved, tokenId, { from: owner }); }); itApproves(anotherApproved); @@ -496,31 +483,33 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when the address that receives the approval is the owner', function () { it('reverts', async function () { - await expectRevert( - this.token.approve(owner, tokenId, { from: owner }), 'ERC721: approval to current owner', - ); + await expectRevert(this.token.approve(owner, tokenId, { from: owner }), 'ERC721: approval to current owner'); }); }); context('when the sender does not own the given token ID', function () { it('reverts', async function () { - await expectRevert(this.token.approve(approved, tokenId, { from: other }), - 'ERC721: approve caller is not token owner or approved'); + await expectRevert( + this.token.approve(approved, tokenId, { from: other }), + 'ERC721: approve caller is not token owner or approved', + ); }); }); context('when the sender is approved for the given token ID', function () { it('reverts', async function () { await this.token.approve(approved, tokenId, { from: owner }); - await expectRevert(this.token.approve(anotherApproved, tokenId, { from: approved }), - 'ERC721: approve caller is not token owner or approved for all'); + await expectRevert( + this.token.approve(anotherApproved, tokenId, { from: approved }), + 'ERC721: approve caller is not token owner or approved for all', + ); }); }); context('when the sender is an operator', function () { beforeEach(async function () { await this.token.setApprovalForAll(operator, true, { from: owner }); - (receipt = await this.token.approve(approved, tokenId, { from: operator })); + receipt = await this.token.approve(approved, tokenId, { from: operator }); }); itApproves(approved); @@ -529,8 +518,10 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when the given token ID does not exist', function () { it('reverts', async function () { - await expectRevert(this.token.approve(approved, nonExistentTokenId, { from: operator }), - 'ERC721: invalid token ID'); + await expectRevert( + this.token.approve(approved, nonExistentTokenId, { from: operator }), + 'ERC721: invalid token ID', + ); }); }); }); @@ -608,8 +599,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('when the operator is the owner', function () { it('reverts', async function () { - await expectRevert(this.token.setApprovalForAll(owner, true, { from: owner }), - 'ERC721: approve to caller'); + await expectRevert(this.token.setApprovalForAll(owner, true, { from: owner }), 'ERC721: approve to caller'); }); }); }); @@ -617,18 +607,13 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('getApproved', async function () { context('when token is not minted', async function () { it('reverts', async function () { - await expectRevert( - this.token.getApproved(nonExistentTokenId), - 'ERC721: invalid token ID', - ); + await expectRevert(this.token.getApproved(nonExistentTokenId), 'ERC721: invalid token ID'); }); }); context('when token has been minted ', async function () { it('should return the zero address', async function () { - expect(await this.token.getApproved(firstTokenId)).to.be.equal( - ZERO_ADDRESS, - ); + expect(await this.token.getApproved(firstTokenId)).to.be.equal(ZERO_ADDRESS); }); context('when account has been approved', async function () { @@ -646,14 +631,12 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('_mint(address, uint256)', function () { it('reverts with a null destination address', async function () { - await expectRevert( - this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', - ); + await expectRevert(this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address'); }); context('with minted token', async function () { beforeEach(async function () { - (this.receipt = await this.token.$_mint(owner, firstTokenId)); + this.receipt = await this.token.$_mint(owner, firstTokenId); }); it('emits a Transfer event', function () { @@ -673,9 +656,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another describe('_burn', function () { it('reverts when burning a non-existent token id', async function () { - await expectRevert( - this.token.$_burn(nonExistentTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.$_burn(nonExistentTokenId), 'ERC721: invalid token ID'); }); context('with minted tokens', function () { @@ -686,7 +667,7 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another context('with burnt token', function () { beforeEach(async function () { - (this.receipt = await this.token.$_burn(firstTokenId)); + this.receipt = await this.token.$_burn(firstTokenId); }); it('emits a Transfer event', function () { @@ -695,25 +676,19 @@ function shouldBehaveLikeERC721 (errorPrefix, owner, newOwner, approved, another it('deletes the token', async function () { expect(await this.token.balanceOf(owner)).to.be.bignumber.equal('1'); - await expectRevert( - this.token.ownerOf(firstTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.ownerOf(firstTokenId), 'ERC721: invalid token ID'); }); it('reverts when burning a token id that has been deleted', async function () { - await expectRevert( - this.token.$_burn(firstTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.$_burn(firstTokenId), 'ERC721: invalid token ID'); }); }); }); }); } -function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approved, anotherApproved, operator, other) { - shouldSupportInterfaces([ - 'ERC721Enumerable', - ]); +function shouldBehaveLikeERC721Enumerable(errorPrefix, owner, newOwner, approved, anotherApproved, operator, other) { + shouldSupportInterfaces(['ERC721Enumerable']); context('with minted tokens', function () { beforeEach(async function () { @@ -737,17 +712,13 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve describe('when the index is greater than or equal to the total tokens owned by the given address', function () { it('reverts', async function () { - await expectRevert( - this.token.tokenOfOwnerByIndex(owner, 2), 'ERC721Enumerable: owner index out of bounds', - ); + await expectRevert(this.token.tokenOfOwnerByIndex(owner, 2), 'ERC721Enumerable: owner index out of bounds'); }); }); describe('when the given address does not own any token', function () { it('reverts', async function () { - await expectRevert( - this.token.tokenOfOwnerByIndex(other, 0), 'ERC721Enumerable: owner index out of bounds', - ); + await expectRevert(this.token.tokenOfOwnerByIndex(other, 0), 'ERC721Enumerable: owner index out of bounds'); }); }); @@ -759,35 +730,31 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve it('returns correct token IDs for target', async function () { expect(await this.token.balanceOf(other)).to.be.bignumber.equal('2'); - const tokensListed = await Promise.all( - [0, 1].map(i => this.token.tokenOfOwnerByIndex(other, i)), - ); - expect(tokensListed.map(t => t.toNumber())).to.have.members([firstTokenId.toNumber(), - secondTokenId.toNumber()]); + const tokensListed = await Promise.all([0, 1].map(i => this.token.tokenOfOwnerByIndex(other, i))); + expect(tokensListed.map(t => t.toNumber())).to.have.members([ + firstTokenId.toNumber(), + secondTokenId.toNumber(), + ]); }); it('returns empty collection for original owner', async function () { expect(await this.token.balanceOf(owner)).to.be.bignumber.equal('0'); - await expectRevert( - this.token.tokenOfOwnerByIndex(owner, 0), 'ERC721Enumerable: owner index out of bounds', - ); + await expectRevert(this.token.tokenOfOwnerByIndex(owner, 0), 'ERC721Enumerable: owner index out of bounds'); }); }); }); describe('tokenByIndex', function () { it('returns all tokens', async function () { - const tokensListed = await Promise.all( - [0, 1].map(i => this.token.tokenByIndex(i)), - ); - expect(tokensListed.map(t => t.toNumber())).to.have.members([firstTokenId.toNumber(), - secondTokenId.toNumber()]); + const tokensListed = await Promise.all([0, 1].map(i => this.token.tokenByIndex(i))); + expect(tokensListed.map(t => t.toNumber())).to.have.members([ + firstTokenId.toNumber(), + secondTokenId.toNumber(), + ]); }); it('reverts if index is greater than supply', async function () { - await expectRevert( - this.token.tokenByIndex(2), 'ERC721Enumerable: global index out of bounds', - ); + await expectRevert(this.token.tokenByIndex(2), 'ERC721Enumerable: global index out of bounds'); }); [firstTokenId, secondTokenId].forEach(function (tokenId) { @@ -801,11 +768,9 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve expect(await this.token.totalSupply()).to.be.bignumber.equal('3'); - const tokensListed = await Promise.all( - [0, 1, 2].map(i => this.token.tokenByIndex(i)), - ); + const tokensListed = await Promise.all([0, 1, 2].map(i => this.token.tokenByIndex(i))); const expectedTokens = [firstTokenId, secondTokenId, newTokenId, anotherNewTokenId].filter( - x => (x !== tokenId), + x => x !== tokenId, ); expect(tokensListed.map(t => t.toNumber())).to.have.members(expectedTokens.map(t => t.toNumber())); }); @@ -815,14 +780,12 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve describe('_mint(address, uint256)', function () { it('reverts with a null destination address', async function () { - await expectRevert( - this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address', - ); + await expectRevert(this.token.$_mint(ZERO_ADDRESS, firstTokenId), 'ERC721: mint to the zero address'); }); context('with minted token', async function () { beforeEach(async function () { - (this.receipt = await this.token.$_mint(owner, firstTokenId)); + this.receipt = await this.token.$_mint(owner, firstTokenId); }); it('adjusts owner tokens by index', async function () { @@ -837,9 +800,7 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve describe('_burn', function () { it('reverts when burning a non-existent token id', async function () { - await expectRevert( - this.token.$_burn(firstTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.$_burn(firstTokenId), 'ERC721: invalid token ID'); }); context('with minted tokens', function () { @@ -850,7 +811,7 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve context('with burnt token', function () { beforeEach(async function () { - (this.receipt = await this.token.$_burn(firstTokenId)); + this.receipt = await this.token.$_burn(firstTokenId); }); it('removes that token from the token list of the owner', async function () { @@ -864,19 +825,15 @@ function shouldBehaveLikeERC721Enumerable (errorPrefix, owner, newOwner, approve it('burns all tokens', async function () { await this.token.$_burn(secondTokenId, { from: owner }); expect(await this.token.totalSupply()).to.be.bignumber.equal('0'); - await expectRevert( - this.token.tokenByIndex(0), 'ERC721Enumerable: global index out of bounds', - ); + await expectRevert(this.token.tokenByIndex(0), 'ERC721Enumerable: global index out of bounds'); }); }); }); }); } -function shouldBehaveLikeERC721Metadata (errorPrefix, name, symbol, owner) { - shouldSupportInterfaces([ - 'ERC721Metadata', - ]); +function shouldBehaveLikeERC721Metadata(errorPrefix, name, symbol, owner) { + shouldSupportInterfaces(['ERC721Metadata']); describe('metadata', function () { it('has a name', async function () { @@ -897,9 +854,7 @@ function shouldBehaveLikeERC721Metadata (errorPrefix, name, symbol, owner) { }); it('reverts when queried for non existent token id', async function () { - await expectRevert( - this.token.tokenURI(nonExistentTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.tokenURI(nonExistentTokenId), 'ERC721: invalid token ID'); }); describe('base URI', function () { diff --git a/test/token/ERC721/ERC721.test.js b/test/token/ERC721/ERC721.test.js index 6e72e02bd..312430cb9 100644 --- a/test/token/ERC721/ERC721.test.js +++ b/test/token/ERC721/ERC721.test.js @@ -1,7 +1,4 @@ -const { - shouldBehaveLikeERC721, - shouldBehaveLikeERC721Metadata, -} = require('./ERC721.behavior'); +const { shouldBehaveLikeERC721, shouldBehaveLikeERC721Metadata } = require('./ERC721.behavior'); const ERC721 = artifacts.require('$ERC721'); diff --git a/test/token/ERC721/extensions/ERC721Burnable.test.js b/test/token/ERC721/extensions/ERC721Burnable.test.js index 75a5603fb..6a4bc6dbc 100644 --- a/test/token/ERC721/extensions/ERC721Burnable.test.js +++ b/test/token/ERC721/extensions/ERC721Burnable.test.js @@ -34,10 +34,7 @@ contract('ERC721Burnable', function (accounts) { }); it('burns the given token ID and adjusts the balance of the owner', async function () { - await expectRevert( - this.token.ownerOf(tokenId), - 'ERC721: invalid token ID', - ); + await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); expect(await this.token.balanceOf(owner)).to.be.bignumber.equal('1'); }); @@ -58,18 +55,14 @@ contract('ERC721Burnable', function (accounts) { context('getApproved', function () { it('reverts', async function () { - await expectRevert( - this.token.getApproved(tokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.getApproved(tokenId), 'ERC721: invalid token ID'); }); }); }); describe('when the given token ID was not tracked by this contract', function () { it('reverts', async function () { - await expectRevert( - this.token.burn(unknownTokenId, { from: owner }), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.burn(unknownTokenId, { from: owner }), 'ERC721: invalid token ID'); }); }); }); diff --git a/test/token/ERC721/extensions/ERC721Consecutive.test.js b/test/token/ERC721/extensions/ERC721Consecutive.test.js index 17df12ea1..3d4922846 100644 --- a/test/token/ERC721/extensions/ERC721Consecutive.test.js +++ b/test/token/ERC721/extensions/ERC721Consecutive.test.js @@ -6,7 +6,7 @@ const ERC721ConsecutiveEnumerableMock = artifacts.require('$ERC721ConsecutiveEnu const ERC721ConsecutiveNoConstructorMintMock = artifacts.require('$ERC721ConsecutiveNoConstructorMintMock'); contract('ERC721Consecutive', function (accounts) { - const [ user1, user2, user3, receiver ] = accounts; + const [user1, user2, user3, receiver] = accounts; const name = 'Non Fungible Token'; const symbol = 'NFT'; @@ -17,7 +17,7 @@ contract('ERC721Consecutive', function (accounts) { { receiver: user3, amount: 0 }, { receiver: user1, amount: 7 }, ]; - const delegates = [ user1, user3 ]; + const delegates = [user1, user3]; describe('with valid batches', function () { beforeEach(async function () { @@ -53,8 +53,7 @@ contract('ERC721Consecutive', function (accounts) { const owners = batches.flatMap(({ receiver, amount }) => Array(amount).fill(receiver)); for (const tokenId in owners) { - expect(await this.token.ownerOf(tokenId)) - .to.be.equal(owners[tokenId]); + expect(await this.token.ownerOf(tokenId)).to.be.equal(owners[tokenId]); } }); @@ -65,20 +64,17 @@ contract('ERC721Consecutive', function (accounts) { .map(({ amount }) => amount) .reduce((a, b) => a + b, 0); - expect(await this.token.balanceOf(account)) - .to.be.bignumber.equal(web3.utils.toBN(balance)); + expect(await this.token.balanceOf(account)).to.be.bignumber.equal(web3.utils.toBN(balance)); // If not delegated at construction, check before + do delegation if (!delegates.includes(account)) { - expect(await this.token.getVotes(account)) - .to.be.bignumber.equal(web3.utils.toBN(0)); + expect(await this.token.getVotes(account)).to.be.bignumber.equal(web3.utils.toBN(0)); await this.token.delegate(account, { from: account }); } // At this point all accounts should have delegated - expect(await this.token.getVotes(account)) - .to.be.bignumber.equal(web3.utils.toBN(balance)); + expect(await this.token.getVotes(account)).to.be.bignumber.equal(web3.utils.toBN(balance)); } }); }); @@ -96,11 +92,11 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.$_exists(tokenId)).to.be.equal(false); - expectEvent( - await this.token.$_mint(user1, tokenId), - 'Transfer', - { from: constants.ZERO_ADDRESS, to: user1, tokenId: tokenId.toString() }, - ); + expectEvent(await this.token.$_mint(user1, tokenId), 'Transfer', { + from: constants.ZERO_ADDRESS, + to: user1, + tokenId: tokenId.toString(), + }); }); it('cannot mint a token that has been batched minted', async function () { @@ -108,10 +104,7 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.$_exists(tokenId)).to.be.equal(true); - await expectRevert( - this.token.$_mint(user1, tokenId), - 'ERC721: token already minted', - ); + await expectRevert(this.token.$_mint(user1, tokenId), 'ERC721: token already minted'); }); }); @@ -123,19 +116,19 @@ contract('ERC721Consecutive', function (accounts) { }); it('tokens can be burned and re-minted #1', async function () { - expectEvent( - await this.token.$_burn(1, { from: user1 }), - 'Transfer', - { from: user1, to: constants.ZERO_ADDRESS, tokenId: '1' }, - ); + expectEvent(await this.token.$_burn(1, { from: user1 }), 'Transfer', { + from: user1, + to: constants.ZERO_ADDRESS, + tokenId: '1', + }); await expectRevert(this.token.ownerOf(1), 'ERC721: invalid token ID'); - expectEvent( - await this.token.$_mint(user2, 1), - 'Transfer', - { from: constants.ZERO_ADDRESS, to: user2, tokenId: '1' }, - ); + expectEvent(await this.token.$_mint(user2, 1), 'Transfer', { + from: constants.ZERO_ADDRESS, + to: user2, + tokenId: '1', + }); expect(await this.token.ownerOf(1)).to.be.equal(user2); }); @@ -153,21 +146,21 @@ contract('ERC721Consecutive', function (accounts) { expect(await this.token.ownerOf(tokenId), user1); // burn - expectEvent( - await this.token.$_burn(tokenId, { from: user1 }), - 'Transfer', - { from: user1, to: constants.ZERO_ADDRESS, tokenId }, - ); + expectEvent(await this.token.$_burn(tokenId, { from: user1 }), 'Transfer', { + from: user1, + to: constants.ZERO_ADDRESS, + tokenId, + }); expect(await this.token.$_exists(tokenId)).to.be.equal(false); await expectRevert(this.token.ownerOf(tokenId), 'ERC721: invalid token ID'); // re-mint - expectEvent( - await this.token.$_mint(user2, tokenId), - 'Transfer', - { from: constants.ZERO_ADDRESS, to: user2, tokenId }, - ); + expectEvent(await this.token.$_mint(user2, tokenId), 'Transfer', { + from: constants.ZERO_ADDRESS, + to: user2, + tokenId, + }); expect(await this.token.$_exists(tokenId)).to.be.equal(true); expect(await this.token.ownerOf(tokenId), user2); @@ -178,34 +171,22 @@ contract('ERC721Consecutive', function (accounts) { describe('invalid use', function () { it('cannot mint a batch larger than 5000', async function () { await expectRevert( - ERC721ConsecutiveMock.new( - name, - symbol, - [], - [user1], - ['5001'], - ), + ERC721ConsecutiveMock.new(name, symbol, [], [user1], ['5001']), 'ERC721Consecutive: batch too large', ); }); it('cannot use single minting during construction', async function () { await expectRevert( - ERC721ConsecutiveNoConstructorMintMock.new( - name, - symbol, - ), - 'ERC721Consecutive: can\'t mint during construction', + ERC721ConsecutiveNoConstructorMintMock.new(name, symbol), + "ERC721Consecutive: can't mint during construction", ); }); it('cannot use single minting during construction', async function () { await expectRevert( - ERC721ConsecutiveNoConstructorMintMock.new( - name, - symbol, - ), - 'ERC721Consecutive: can\'t mint during construction', + ERC721ConsecutiveNoConstructorMintMock.new(name, symbol), + "ERC721Consecutive: can't mint during construction", ); }); diff --git a/test/token/ERC721/extensions/ERC721Pausable.test.js b/test/token/ERC721/extensions/ERC721Pausable.test.js index 04dd520a3..c7fc8233f 100644 --- a/test/token/ERC721/extensions/ERC721Pausable.test.js +++ b/test/token/ERC721/extensions/ERC721Pausable.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC721Pausable = artifacts.require('$ERC721Pausable'); contract('ERC721Pausable', function (accounts) { - const [ owner, receiver, operator ] = accounts; + const [owner, receiver, operator] = accounts; const name = 'Non Fungible Token'; const symbol = 'NFT'; @@ -41,24 +41,19 @@ contract('ERC721Pausable', function (accounts) { it('reverts when trying to safeTransferFrom with data', async function () { await expectRevert( - this.token.methods['safeTransferFrom(address,address,uint256,bytes)']( - owner, receiver, firstTokenId, mockData, { from: owner }, - ), 'ERC721Pausable: token transfer while paused', + this.token.methods['safeTransferFrom(address,address,uint256,bytes)'](owner, receiver, firstTokenId, mockData, { + from: owner, + }), + 'ERC721Pausable: token transfer while paused', ); }); it('reverts when trying to mint', async function () { - await expectRevert( - this.token.$_mint(receiver, secondTokenId), - 'ERC721Pausable: token transfer while paused', - ); + await expectRevert(this.token.$_mint(receiver, secondTokenId), 'ERC721Pausable: token transfer while paused'); }); it('reverts when trying to burn', async function () { - await expectRevert( - this.token.$_burn(firstTokenId), - 'ERC721Pausable: token transfer while paused', - ); + await expectRevert(this.token.$_burn(firstTokenId), 'ERC721Pausable: token transfer while paused'); }); describe('getApproved', function () { diff --git a/test/token/ERC721/extensions/ERC721Royalty.test.js b/test/token/ERC721/extensions/ERC721Royalty.test.js index 9d38071e3..1c0536bf5 100644 --- a/test/token/ERC721/extensions/ERC721Royalty.test.js +++ b/test/token/ERC721/extensions/ERC721Royalty.test.js @@ -5,7 +5,7 @@ const { shouldBehaveLikeERC2981 } = require('../../common/ERC2981.behavior'); const ERC721Royalty = artifacts.require('$ERC721Royalty'); contract('ERC721Royalty', function (accounts) { - const [ account1, account2 ] = accounts; + const [account1, account2] = accounts; const tokenId1 = new BN('1'); const tokenId2 = new BN('2'); const royalty = new BN('200'); diff --git a/test/token/ERC721/extensions/ERC721URIStorage.test.js b/test/token/ERC721/extensions/ERC721URIStorage.test.js index a27b5f658..c0274c669 100644 --- a/test/token/ERC721/extensions/ERC721URIStorage.test.js +++ b/test/token/ERC721/extensions/ERC721URIStorage.test.js @@ -5,7 +5,7 @@ const { expect } = require('chai'); const ERC721URIStorageMock = artifacts.require('$ERC721URIStorageMock'); contract('ERC721URIStorage', function (accounts) { - const [ owner ] = accounts; + const [owner] = accounts; const name = 'Non Fungible Token'; const symbol = 'NFT'; @@ -30,9 +30,7 @@ contract('ERC721URIStorage', function (accounts) { }); it('reverts when queried for non existent token id', async function () { - await expectRevert( - this.token.tokenURI(nonExistentTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.tokenURI(nonExistentTokenId), 'ERC721: invalid token ID'); }); it('can be set for a token id', async function () { @@ -42,7 +40,8 @@ contract('ERC721URIStorage', function (accounts) { it('reverts when setting for non existent token id', async function () { await expectRevert( - this.token.$_setTokenURI(nonExistentTokenId, sampleUri), 'ERC721URIStorage: URI set of nonexistent token', + this.token.$_setTokenURI(nonExistentTokenId, sampleUri), + 'ERC721URIStorage: URI set of nonexistent token', ); }); @@ -77,9 +76,7 @@ contract('ERC721URIStorage', function (accounts) { await this.token.$_burn(firstTokenId, { from: owner }); expect(await this.token.$_exists(firstTokenId)).to.equal(false); - await expectRevert( - this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID'); }); it('tokens with URI can be burnt ', async function () { @@ -88,9 +85,7 @@ contract('ERC721URIStorage', function (accounts) { await this.token.$_burn(firstTokenId, { from: owner }); expect(await this.token.$_exists(firstTokenId)).to.equal(false); - await expectRevert( - this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID', - ); + await expectRevert(this.token.tokenURI(firstTokenId), 'ERC721: invalid token ID'); }); }); }); diff --git a/test/token/ERC721/extensions/ERC721Votes.test.js b/test/token/ERC721/extensions/ERC721Votes.test.js index 8d9cb701e..f7baef4c1 100644 --- a/test/token/ERC721/extensions/ERC721Votes.test.js +++ b/test/token/ERC721/extensions/ERC721Votes.test.js @@ -10,7 +10,7 @@ const { shouldBehaveLikeVotes } = require('../../../governance/utils/Votes.behav const ERC721Votes = artifacts.require('$ERC721Votes'); contract('ERC721Votes', function (accounts) { - const [ account1, account2, account1Delegatee, other1, other2 ] = accounts; + const [account1, account2, account1Delegatee, other1, other2] = accounts; const name = 'My Vote'; const symbol = 'MTKN'; @@ -18,7 +18,7 @@ contract('ERC721Votes', function (accounts) { beforeEach(async function () { this.chainId = await getChainId(); - this.votes = await ERC721Votes.new(name, symbol, name, "1"); + this.votes = await ERC721Votes.new(name, symbol, name, '1'); this.NFT0 = new BN('10000000000000000000000000'); this.NFT1 = new BN('10'); @@ -61,7 +61,11 @@ contract('ERC721Votes', function (accounts) { expectEvent(receipt, 'DelegateVotesChanged', { delegate: account1, previousBalance: '1', newBalance: '0' }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.account1Votes = '0'; this.account2Votes = '0'; @@ -75,7 +79,11 @@ contract('ERC721Votes', function (accounts) { expectEvent(receipt, 'DelegateVotesChanged', { delegate: account2, previousBalance: '0', newBalance: '1' }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.account1Votes = '0'; this.account2Votes = '1'; @@ -87,11 +95,15 @@ contract('ERC721Votes', function (accounts) { const { receipt } = await this.votes.transferFrom(account1, account2, this.NFT0, { from: account1 }); expectEvent(receipt, 'Transfer', { from: account1, to: account2, tokenId: this.NFT0 }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: account1, previousBalance: '1', newBalance: '0'}); + expectEvent(receipt, 'DelegateVotesChanged', { delegate: account1, previousBalance: '1', newBalance: '0' }); expectEvent(receipt, 'DelegateVotesChanged', { delegate: account2, previousBalance: '0', newBalance: '1' }); const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect(receipt.logs.filter(({ event }) => event == 'DelegateVotesChanged').every(({ logIndex }) => transferLogIndex < logIndex)).to.be.equal(true); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); this.account1Votes = '0'; this.account2Votes = '1'; diff --git a/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js b/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js index 4ad73552a..0af614bd1 100644 --- a/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js +++ b/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js @@ -7,7 +7,7 @@ const { expect } = require('chai'); const ERC721PresetMinterPauserAutoId = artifacts.require('ERC721PresetMinterPauserAutoId'); contract('ERC721PresetMinterPauserAutoId', function (accounts) { - const [ deployer, other ] = accounts; + const [deployer, other] = accounts; const name = 'MinterAutoIDToken'; const symbol = 'MAIT'; @@ -85,10 +85,7 @@ contract('ERC721PresetMinterPauserAutoId', function (accounts) { it('cannot mint while paused', async function () { await this.token.pause({ from: deployer }); - await expectRevert( - this.token.mint(other, { from: deployer }), - 'ERC721Pausable: token transfer while paused', - ); + await expectRevert(this.token.mint(other, { from: deployer }), 'ERC721Pausable: token transfer while paused'); }); it('other accounts cannot pause', async function () { diff --git a/test/token/ERC721/utils/ERC721Holder.test.js b/test/token/ERC721/utils/ERC721Holder.test.js index e821f32dd..0fd822280 100644 --- a/test/token/ERC721/utils/ERC721Holder.test.js +++ b/test/token/ERC721/utils/ERC721Holder.test.js @@ -4,7 +4,7 @@ const ERC721Holder = artifacts.require('ERC721Holder'); const ERC721 = artifacts.require('$ERC721'); contract('ERC721Holder', function (accounts) { - const [ owner ] = accounts; + const [owner] = accounts; const name = 'Non Fungible Token'; const symbol = 'NFT'; diff --git a/test/token/ERC777/ERC777.behavior.js b/test/token/ERC777/ERC777.behavior.js index be104f467..b1585bc91 100644 --- a/test/token/ERC777/ERC777.behavior.js +++ b/test/token/ERC777/ERC777.behavior.js @@ -5,22 +5,22 @@ const { expect } = require('chai'); const ERC777SenderRecipientMock = artifacts.require('ERC777SenderRecipientMock'); -function shouldBehaveLikeERC777DirectSendBurn (holder, recipient, data) { +function shouldBehaveLikeERC777DirectSendBurn(holder, recipient, data) { shouldBehaveLikeERC777DirectSend(holder, recipient, data); shouldBehaveLikeERC777DirectBurn(holder, data); } -function shouldBehaveLikeERC777OperatorSendBurn (holder, recipient, operator, data, operatorData) { +function shouldBehaveLikeERC777OperatorSendBurn(holder, recipient, operator, data, operatorData) { shouldBehaveLikeERC777OperatorSend(holder, recipient, operator, data, operatorData); shouldBehaveLikeERC777OperatorBurn(holder, operator, data, operatorData); } -function shouldBehaveLikeERC777UnauthorizedOperatorSendBurn (holder, recipient, operator, data, operatorData) { +function shouldBehaveLikeERC777UnauthorizedOperatorSendBurn(holder, recipient, operator, data, operatorData) { shouldBehaveLikeERC777UnauthorizedOperatorSend(holder, recipient, operator, data, operatorData); shouldBehaveLikeERC777UnauthorizedOperatorBurn(holder, operator, data, operatorData); } -function shouldBehaveLikeERC777DirectSend (holder, recipient, data) { +function shouldBehaveLikeERC777DirectSend(holder, recipient, data) { describe('direct send', function () { context('when the sender has tokens', function () { shouldDirectSendTokens(holder, recipient, new BN('0'), data); @@ -48,7 +48,7 @@ function shouldBehaveLikeERC777DirectSend (holder, recipient, data) { }); } -function shouldBehaveLikeERC777OperatorSend (holder, recipient, operator, data, operatorData) { +function shouldBehaveLikeERC777OperatorSend(holder, recipient, operator, data, operatorData) { describe('operator send', function () { context('when the sender has tokens', async function () { shouldOperatorSendTokens(holder, operator, recipient, new BN('0'), data, operatorData); @@ -63,9 +63,7 @@ function shouldBehaveLikeERC777OperatorSend (holder, recipient, operator, data, it('reverts when sending to the zero address', async function () { await expectRevert.unspecified( - this.token.operatorSend( - holder, ZERO_ADDRESS, new BN('1'), data, operatorData, { from: operator }, - ), + this.token.operatorSend(holder, ZERO_ADDRESS, new BN('1'), data, operatorData, { from: operator }), ); }); }); @@ -84,16 +82,14 @@ function shouldBehaveLikeERC777OperatorSend (holder, recipient, operator, data, it('reverts when sending from the zero address', async function () { // This is not yet reflected in the spec await expectRevert.unspecified( - this.token.operatorSend( - ZERO_ADDRESS, recipient, new BN('0'), data, operatorData, { from: operator }, - ), + this.token.operatorSend(ZERO_ADDRESS, recipient, new BN('0'), data, operatorData, { from: operator }), ); }); }); }); } -function shouldBehaveLikeERC777UnauthorizedOperatorSend (holder, recipient, operator, data, operatorData) { +function shouldBehaveLikeERC777UnauthorizedOperatorSend(holder, recipient, operator, data, operatorData) { describe('operator send', function () { it('reverts', async function () { await expectRevert.unspecified(this.token.operatorSend(holder, recipient, new BN('0'), data, operatorData)); @@ -101,7 +97,7 @@ function shouldBehaveLikeERC777UnauthorizedOperatorSend (holder, recipient, oper }); } -function shouldBehaveLikeERC777DirectBurn (holder, data) { +function shouldBehaveLikeERC777DirectBurn(holder, data) { describe('direct burn', function () { context('when the sender has tokens', function () { shouldDirectBurnTokens(holder, new BN('0'), data); @@ -125,7 +121,7 @@ function shouldBehaveLikeERC777DirectBurn (holder, data) { }); } -function shouldBehaveLikeERC777OperatorBurn (holder, operator, data, operatorData) { +function shouldBehaveLikeERC777OperatorBurn(holder, operator, data, operatorData) { describe('operator burn', function () { context('when the sender has tokens', async function () { shouldOperatorBurnTokens(holder, operator, new BN('0'), data, operatorData); @@ -153,16 +149,14 @@ function shouldBehaveLikeERC777OperatorBurn (holder, operator, data, operatorDat it('reverts when burning from the zero address', async function () { // This is not yet reflected in the spec await expectRevert.unspecified( - this.token.operatorBurn( - ZERO_ADDRESS, new BN('0'), data, operatorData, { from: operator }, - ), + this.token.operatorBurn(ZERO_ADDRESS, new BN('0'), data, operatorData, { from: operator }), ); }); }); }); } -function shouldBehaveLikeERC777UnauthorizedOperatorBurn (holder, operator, data, operatorData) { +function shouldBehaveLikeERC777UnauthorizedOperatorBurn(holder, operator, data, operatorData) { describe('operator burn', function () { it('reverts', async function () { await expectRevert.unspecified(this.token.operatorBurn(holder, new BN('0'), data, operatorData)); @@ -170,15 +164,15 @@ function shouldBehaveLikeERC777UnauthorizedOperatorBurn (holder, operator, data, }); } -function shouldDirectSendTokens (from, to, amount, data) { +function shouldDirectSendTokens(from, to, amount, data) { shouldSendTokens(from, null, to, amount, data, null); } -function shouldOperatorSendTokens (from, operator, to, amount, data, operatorData) { +function shouldOperatorSendTokens(from, operator, to, amount, data, operatorData) { shouldSendTokens(from, operator, to, amount, data, operatorData); } -function shouldSendTokens (from, operator, to, amount, data, operatorData) { +function shouldSendTokens(from, operator, to, amount, data, operatorData) { const operatorCall = operator !== null; it(`${operatorCall ? 'operator ' : ''}can send an amount of ${amount}`, async function () { @@ -188,7 +182,7 @@ function shouldSendTokens (from, operator, to, amount, data, operatorData) { let receipt; if (!operatorCall) { - (receipt = await this.token.send(to, amount, data, { from })); + receipt = await this.token.send(to, amount, data, { from }); expectEvent(receipt, 'Sent', { operator: from, from, @@ -198,7 +192,7 @@ function shouldSendTokens (from, operator, to, amount, data, operatorData) { operatorData: null, }); } else { - (receipt = await this.token.operatorSend(from, to, amount, data, operatorData, { from: operator })); + receipt = await this.token.operatorSend(from, to, amount, data, operatorData, { from: operator }); expectEvent(receipt, 'Sent', { operator, from, @@ -225,15 +219,15 @@ function shouldSendTokens (from, operator, to, amount, data, operatorData) { }); } -function shouldDirectBurnTokens (from, amount, data) { +function shouldDirectBurnTokens(from, amount, data) { shouldBurnTokens(from, null, amount, data, null); } -function shouldOperatorBurnTokens (from, operator, amount, data, operatorData) { +function shouldOperatorBurnTokens(from, operator, amount, data, operatorData) { shouldBurnTokens(from, operator, amount, data, operatorData); } -function shouldBurnTokens (from, operator, amount, data, operatorData) { +function shouldBurnTokens(from, operator, amount, data, operatorData) { const operatorCall = operator !== null; it(`${operatorCall ? 'operator ' : ''}can burn an amount of ${amount}`, async function () { @@ -242,7 +236,7 @@ function shouldBurnTokens (from, operator, amount, data, operatorData) { let receipt; if (!operatorCall) { - (receipt = await this.token.burn(amount, data, { from })); + receipt = await this.token.burn(amount, data, { from }); expectEvent(receipt, 'Burned', { operator: from, from, @@ -251,7 +245,7 @@ function shouldBurnTokens (from, operator, amount, data, operatorData) { operatorData: null, }); } else { - (receipt = await this.token.operatorBurn(from, amount, data, operatorData, { from: operator })); + receipt = await this.token.operatorBurn(from, amount, data, operatorData, { from: operator }); expectEvent(receipt, 'Burned', { operator, from, @@ -275,7 +269,7 @@ function shouldBurnTokens (from, operator, amount, data, operatorData) { }); } -function shouldBehaveLikeERC777InternalMint (recipient, operator, amount, data, operatorData) { +function shouldBehaveLikeERC777InternalMint(recipient, operator, amount, data, operatorData) { shouldInternalMintTokens(operator, recipient, new BN('0'), data, operatorData); shouldInternalMintTokens(operator, recipient, amount, data, operatorData); @@ -286,7 +280,7 @@ function shouldBehaveLikeERC777InternalMint (recipient, operator, amount, data, }); } -function shouldInternalMintTokens (operator, to, amount, data, operatorData) { +function shouldInternalMintTokens(operator, to, amount, data, operatorData) { it(`can (internal) mint an amount of ${amount}`, async function () { const initialTotalSupply = await this.token.totalSupply(); const initialToBalance = await this.token.balanceOf(to); @@ -315,7 +309,7 @@ function shouldInternalMintTokens (operator, to, amount, data, operatorData) { }); } -function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook (operator, amount, data, operatorData) { +function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook(operator, amount, data, operatorData) { context('when TokensRecipient reverts', function () { beforeEach(async function () { await this.tokensRecipientImplementer.setShouldRevertReceive(true); @@ -364,10 +358,9 @@ function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook (operator, am }); it('TokensRecipient receives operatorSend data and is called after state mutation', async function () { - const { tx } = await this.token.operatorSend( - this.sender, this.recipient, amount, data, operatorData, - { from: operator }, - ); + const { tx } = await this.token.operatorSend(this.sender, this.recipient, amount, data, operatorData, { + from: operator, + }); const postSenderBalance = await this.token.balanceOf(this.sender); const postRecipientBalance = await this.token.balanceOf(this.recipient); @@ -407,7 +400,7 @@ function shouldBehaveLikeERC777SendBurnMintInternalWithReceiveHook (operator, am }); } -function shouldBehaveLikeERC777SendBurnWithSendHook (operator, amount, data, operatorData) { +function shouldBehaveLikeERC777SendBurnWithSendHook(operator, amount, data, operatorData) { context('when TokensSender reverts', function () { beforeEach(async function () { await this.tokensSenderImplementer.setShouldRevertSend(true); @@ -463,10 +456,9 @@ function shouldBehaveLikeERC777SendBurnWithSendHook (operator, amount, data, ope const preSenderBalance = await this.token.balanceOf(this.sender); const preRecipientBalance = await this.token.balanceOf(this.recipient); - const { tx } = await this.token.operatorSend( - this.sender, this.recipient, amount, data, operatorData, - { from: operator }, - ); + const { tx } = await this.token.operatorSend(this.sender, this.recipient, amount, data, operatorData, { + from: operator, + }); await assertTokensToSendCalled( this.token, @@ -488,7 +480,15 @@ function shouldBehaveLikeERC777SendBurnWithSendHook (operator, amount, data, ope const { tx } = await burnFromHolder(this.token, this.sender, amount, data, { from: this.sender }); await assertTokensToSendCalled( - this.token, tx, this.sender, this.sender, ZERO_ADDRESS, amount, data, null, preSenderBalance, + this.token, + tx, + this.sender, + this.sender, + ZERO_ADDRESS, + amount, + data, + null, + preSenderBalance, ); }); @@ -498,34 +498,78 @@ function shouldBehaveLikeERC777SendBurnWithSendHook (operator, amount, data, ope const { tx } = await this.token.operatorBurn(this.sender, amount, data, operatorData, { from: operator }); await assertTokensToSendCalled( - this.token, tx, operator, this.sender, ZERO_ADDRESS, amount, data, operatorData, preSenderBalance, + this.token, + tx, + operator, + this.sender, + ZERO_ADDRESS, + amount, + data, + operatorData, + preSenderBalance, ); }); }); } -function removeBalance (holder) { +function removeBalance(holder) { beforeEach(async function () { await this.token.burn(await this.token.balanceOf(holder), '0x', { from: holder }); expect(await this.token.balanceOf(holder)).to.be.bignumber.equal('0'); }); } -async function assertTokensReceivedCalled (token, txHash, operator, from, to, amount, data, operatorData, fromBalance, - toBalance = '0') { +async function assertTokensReceivedCalled( + token, + txHash, + operator, + from, + to, + amount, + data, + operatorData, + fromBalance, + toBalance = '0', +) { await expectEvent.inTransaction(txHash, ERC777SenderRecipientMock, 'TokensReceivedCalled', { - operator, from, to, amount, data, operatorData, token: token.address, fromBalance, toBalance, + operator, + from, + to, + amount, + data, + operatorData, + token: token.address, + fromBalance, + toBalance, }); } -async function assertTokensToSendCalled (token, txHash, operator, from, to, amount, data, operatorData, fromBalance, - toBalance = '0') { +async function assertTokensToSendCalled( + token, + txHash, + operator, + from, + to, + amount, + data, + operatorData, + fromBalance, + toBalance = '0', +) { await expectEvent.inTransaction(txHash, ERC777SenderRecipientMock, 'TokensToSendCalled', { - operator, from, to, amount, data, operatorData, token: token.address, fromBalance, toBalance, + operator, + from, + to, + amount, + data, + operatorData, + token: token.address, + fromBalance, + toBalance, }); } -async function sendFromHolder (token, holder, to, amount, data) { +async function sendFromHolder(token, holder, to, amount, data) { if ((await web3.eth.getCode(holder)).length <= '0x'.length) { return token.send(to, amount, data, { from: holder }); } else { @@ -534,7 +578,7 @@ async function sendFromHolder (token, holder, to, amount, data) { } } -async function burnFromHolder (token, holder, amount, data) { +async function burnFromHolder(token, holder, amount, data) { if ((await web3.eth.getCode(holder)).length <= '0x'.length) { return token.burn(amount, data, { from: holder }); } else { diff --git a/test/token/ERC777/ERC777.test.js b/test/token/ERC777/ERC777.test.js index efb8eae43..44bc25351 100644 --- a/test/token/ERC777/ERC777.test.js +++ b/test/token/ERC777/ERC777.test.js @@ -12,16 +12,13 @@ const { shouldBehaveLikeERC777SendBurnWithSendHook, } = require('./ERC777.behavior'); -const { - shouldBehaveLikeERC20, - shouldBehaveLikeERC20Approve, -} = require('../ERC20/ERC20.behavior'); +const { shouldBehaveLikeERC20, shouldBehaveLikeERC20Approve } = require('../ERC20/ERC20.behavior'); const ERC777 = artifacts.require('$ERC777Mock'); const ERC777SenderRecipientMock = artifacts.require('$ERC777SenderRecipientMock'); contract('ERC777', function (accounts) { - const [ registryFunder, holder, defaultOperatorA, defaultOperatorB, newOperator, anyone ] = accounts; + const [registryFunder, holder, defaultOperatorA, defaultOperatorB, newOperator, anyone] = accounts; const initialSupply = new BN('10000'); const name = 'ERC777Test'; @@ -51,7 +48,8 @@ contract('ERC777', function (accounts) { describe('when the owner is the zero address', function () { it('reverts', async function () { - await expectRevert(this.token.$_approve(ZERO_ADDRESS, anyone, initialSupply), + await expectRevert( + this.token.$_approve(ZERO_ADDRESS, anyone, initialSupply), 'ERC777: approve from the zero address', ); }); @@ -95,13 +93,15 @@ contract('ERC777', function (accounts) { }); it('the ERC777Token interface is registered in the registry', async function () { - expect(await this.erc1820.getInterfaceImplementer(this.token.address, web3.utils.soliditySha3('ERC777Token'))) - .to.equal(this.token.address); + expect( + await this.erc1820.getInterfaceImplementer(this.token.address, web3.utils.soliditySha3('ERC777Token')), + ).to.equal(this.token.address); }); it('the ERC20Token interface is registered in the registry', async function () { - expect(await this.erc1820.getInterfaceImplementer(this.token.address, web3.utils.soliditySha3('ERC20Token'))) - .to.equal(this.token.address); + expect( + await this.erc1820.getInterfaceImplementer(this.token.address, web3.utils.soliditySha3('ERC20Token')), + ).to.equal(this.token.address); }); }); @@ -185,25 +185,11 @@ contract('ERC777', function (accounts) { const operator = defaultOperatorA; it('without requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - false, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, false, { from: operator }); }); it('with requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - true, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }); }); }); @@ -211,25 +197,11 @@ contract('ERC777', function (accounts) { const operator = newOperator; it('without requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - false, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, false, { from: operator }); }); it('with requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - true, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }); }); }); }); @@ -244,26 +216,12 @@ contract('ERC777', function (accounts) { const operator = defaultOperatorA; it('without requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - false, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, false, { from: operator }); }); it('with requireReceptionAck', async function () { await expectRevert( - this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - true, - { from: operator }, - ), + this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }), 'ERC777: token recipient contract has no implementer for ERC777TokensRecipient', ); }); @@ -273,26 +231,12 @@ contract('ERC777', function (accounts) { const operator = newOperator; it('without requireReceptionAck', async function () { - await this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - false, - { from: operator }, - ); + await this.token.$_mint(this.recipient, amount, data, operatorData, false, { from: operator }); }); it('with requireReceptionAck', async function () { await expectRevert( - this.token.$_mint( - this.recipient, - amount, - data, - operatorData, - true, - { from: operator }, - ), + this.token.$_mint(this.recipient, amount, data, operatorData, true, { from: operator }), 'ERC777: token recipient contract has no implementer for ERC777TokensRecipient', ); }); @@ -308,14 +252,13 @@ contract('ERC777', function (accounts) { it('reverts when self-authorizing', async function () { await expectRevert( - this.token.authorizeOperator(holder, { from: holder }), 'ERC777: authorizing self as operator', + this.token.authorizeOperator(holder, { from: holder }), + 'ERC777: authorizing self as operator', ); }); it('reverts when self-revoking', async function () { - await expectRevert( - this.token.revokeOperator(holder, { from: holder }), 'ERC777: revoking self as operator', - ); + await expectRevert(this.token.revokeOperator(holder, { from: holder }), 'ERC777: revoking self as operator'); }); it('non-operators can be revoked', async function () { @@ -471,7 +414,8 @@ contract('ERC777', function (accounts) { await this.erc1820.setInterfaceImplementer( this.recipient, - web3.utils.soliditySha3('ERC777TokensRecipient'), this.tokensRecipientImplementer.address, + web3.utils.soliditySha3('ERC777TokensRecipient'), + this.tokensRecipientImplementer.address, { from: this.recipient }, ); }); @@ -519,7 +463,8 @@ contract('ERC777', function (accounts) { await this.erc1820.setInterfaceImplementer( this.sender, - web3.utils.soliditySha3('ERC777TokensSender'), this.tokensSenderImplementer.address, + web3.utils.soliditySha3('ERC777TokensSender'), + this.tokensSenderImplementer.address, { from: this.sender }, ); }); diff --git a/test/token/common/ERC2981.behavior.js b/test/token/common/ERC2981.behavior.js index aea5e52f0..5d0f67715 100644 --- a/test/token/common/ERC2981.behavior.js +++ b/test/token/common/ERC2981.behavior.js @@ -4,7 +4,7 @@ const { ZERO_ADDRESS } = constants; const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); -function shouldBehaveLikeERC2981 () { +function shouldBehaveLikeERC2981() { const royaltyFraction = new BN('10'); shouldSupportInterfaces(['ERC2981']); @@ -60,10 +60,7 @@ function shouldBehaveLikeERC2981 () { }); it('reverts if invalid parameters', async function () { - await expectRevert( - this.token.$_setDefaultRoyalty(ZERO_ADDRESS, royaltyFraction), - 'ERC2981: invalid receiver', - ); + await expectRevert(this.token.$_setDefaultRoyalty(ZERO_ADDRESS, royaltyFraction), 'ERC2981: invalid receiver'); await expectRevert( this.token.$_setDefaultRoyalty(this.account1, new BN('11000')), diff --git a/test/utils/Address.test.js b/test/utils/Address.test.js index 135a7f96d..a78ae14e6 100644 --- a/test/utils/Address.test.js +++ b/test/utils/Address.test.js @@ -6,7 +6,7 @@ const EtherReceiver = artifacts.require('EtherReceiverMock'); const CallReceiverMock = artifacts.require('CallReceiverMock'); contract('Address', function (accounts) { - const [ recipient, other ] = accounts; + const [recipient, other] = accounts; beforeEach(async function () { this.mock = await Address.new(); @@ -35,10 +35,7 @@ contract('Address', function (accounts) { }); it('reverts when sending non-zero amounts', async function () { - await expectRevert( - this.mock.$sendValue(other, 1), - 'Address: insufficient balance', - ); + await expectRevert(this.mock.$sendValue(other, 1), 'Address: insufficient balance'); }); }); @@ -65,10 +62,7 @@ contract('Address', function (accounts) { }); it('reverts when sending more than the balance', async function () { - await expectRevert( - this.mock.$sendValue(recipient, funds.addn(1)), - 'Address: insufficient balance', - ); + await expectRevert(this.mock.$sendValue(recipient, funds.addn(1)), 'Address: insufficient balance'); }); context('with contract recipient', function () { @@ -107,11 +101,9 @@ contract('Address', function (accounts) { const receipt = await this.mock.$functionCall(this.target.address, abiEncodedCall); - expectEvent( - receipt, - 'return$functionCall_address_bytes', - { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, - ); + expectEvent(receipt, 'return$functionCall_address_bytes', { + ret0: web3.eth.abi.encodeParameters(['string'], ['0x1234']), + }); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); @@ -127,10 +119,7 @@ contract('Address', function (accounts) { it('reverts when the called function reverts, bubbling up the revert reason', async function () { const abiEncodedCall = this.target.contract.methods.mockFunctionRevertsReason().encodeABI(); - await expectRevert( - this.mock.$functionCall(this.target.address, abiEncodedCall), - 'CallReceiverMock: reverting', - ); + await expectRevert(this.mock.$functionCall(this.target.address, abiEncodedCall), 'CallReceiverMock: reverting'); }); it('reverts when the called function runs out of gas', async function () { @@ -145,17 +134,18 @@ contract('Address', function (accounts) { it('reverts when the called function throws', async function () { const abiEncodedCall = this.target.contract.methods.mockFunctionThrows().encodeABI(); - await expectRevert.unspecified( - this.mock.$functionCall(this.target.address, abiEncodedCall), - ); + await expectRevert.unspecified(this.mock.$functionCall(this.target.address, abiEncodedCall)); }); it('reverts when function does not exist', async function () { - const abiEncodedCall = web3.eth.abi.encodeFunctionCall({ - name: 'mockFunctionDoesNotExist', - type: 'function', - inputs: [], - }, []); + const abiEncodedCall = web3.eth.abi.encodeFunctionCall( + { + name: 'mockFunctionDoesNotExist', + type: 'function', + inputs: [], + }, + [], + ); await expectRevert( this.mock.$functionCall(this.target.address, abiEncodedCall), @@ -166,13 +156,10 @@ contract('Address', function (accounts) { context('with non-contract receiver', function () { it('reverts when address is not a contract', async function () { - const [ recipient ] = accounts; + const [recipient] = accounts; const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - await expectRevert( - this.mock.$functionCall(recipient, abiEncodedCall), - 'Address: call to non-contract', - ); + await expectRevert(this.mock.$functionCall(recipient, abiEncodedCall), 'Address: call to non-contract'); }); }); }); @@ -187,11 +174,9 @@ contract('Address', function (accounts) { const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); const receipt = await this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, 0); - expectEvent( - receipt, - 'return$functionCallWithValue_address_bytes_uint256', - { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, - ); + expectEvent(receipt, 'return$functionCallWithValue_address_bytes_uint256', { + ret0: web3.eth.abi.encodeParameters(['string'], ['0x1234']), + }); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); }); }); @@ -216,11 +201,9 @@ contract('Address', function (accounts) { await send.ether(other, this.mock.address, amount); const receipt = await this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, amount); - expectEvent( - receipt, - 'return$functionCallWithValue_address_bytes_uint256', - { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, - ); + expectEvent(receipt, 'return$functionCallWithValue_address_bytes_uint256', { + ret0: web3.eth.abi.encodeParameters(['string'], ['0x1234']), + }); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); expect(await tracker.delta()).to.be.bignumber.equal(amount); @@ -233,17 +216,13 @@ contract('Address', function (accounts) { expect(await balance.current(this.mock.address)).to.be.bignumber.equal('0'); - const receipt = await this.mock.$functionCallWithValue( - this.target.address, - abiEncodedCall, - amount, - { from: other, value: amount }, - ); - expectEvent( - receipt, - 'return$functionCallWithValue_address_bytes_uint256', - { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, - ); + const receipt = await this.mock.$functionCallWithValue(this.target.address, abiEncodedCall, amount, { + from: other, + value: amount, + }); + expectEvent(receipt, 'return$functionCallWithValue_address_bytes_uint256', { + ret0: web3.eth.abi.encodeParameters(['string'], ['0x1234']), + }); await expectEvent.inTransaction(receipt.tx, CallReceiverMock, 'MockFunctionCalled'); expect(await tracker.delta()).to.be.bignumber.equal(amount); @@ -269,8 +248,9 @@ contract('Address', function (accounts) { it('calls the requested function', async function () { const abiEncodedCall = this.target.contract.methods.mockStaticFunction().encodeABI(); - expect(await this.mock.$functionStaticCall(this.target.address, abiEncodedCall)) - .to.be.equal(web3.eth.abi.encodeParameters(['string'], [ '0x1234' ])); + expect(await this.mock.$functionStaticCall(this.target.address, abiEncodedCall)).to.be.equal( + web3.eth.abi.encodeParameters(['string'], ['0x1234']), + ); }); it('reverts on a non-static function', async function () { @@ -292,13 +272,10 @@ contract('Address', function (accounts) { }); it('reverts when address is not a contract', async function () { - const [ recipient ] = accounts; + const [recipient] = accounts; const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - await expectRevert( - this.mock.$functionStaticCall(recipient, abiEncodedCall), - 'Address: call to non-contract', - ); + await expectRevert(this.mock.$functionStaticCall(recipient, abiEncodedCall), 'Address: call to non-contract'); }); }); @@ -319,7 +296,7 @@ contract('Address', function (accounts) { expectEvent( await this.mock.$functionDelegateCall(this.target.address, abiEncodedCall), 'return$functionDelegateCall_address_bytes', - { ret0: web3.eth.abi.encodeParameters(['string'], [ '0x1234' ]) }, + { ret0: web3.eth.abi.encodeParameters(['string'], ['0x1234']) }, ); expect(await web3.eth.getStorageAt(this.mock.address, slot)).to.be.equal(value); @@ -335,13 +312,10 @@ contract('Address', function (accounts) { }); it('reverts when address is not a contract', async function () { - const [ recipient ] = accounts; + const [recipient] = accounts; const abiEncodedCall = this.target.contract.methods.mockFunction().encodeABI(); - await expectRevert( - this.mock.$functionDelegateCall(recipient, abiEncodedCall), - 'Address: call to non-contract', - ); + await expectRevert(this.mock.$functionDelegateCall(recipient, abiEncodedCall), 'Address: call to non-contract'); }); }); }); diff --git a/test/utils/Arrays.test.js b/test/utils/Arrays.test.js index 5d32e510a..d939d59bd 100644 --- a/test/utils/Arrays.test.js +++ b/test/utils/Arrays.test.js @@ -89,9 +89,27 @@ contract('Arrays', function () { describe('unsafeAccess', function () { for (const { type, artifact, elements } of [ - { type: 'address', artifact: AddressArraysMock, elements: Array(10).fill().map(() => web3.utils.randomHex(20)) }, - { type: 'bytes32', artifact: Bytes32ArraysMock, elements: Array(10).fill().map(() => web3.utils.randomHex(32)) }, - { type: 'uint256', artifact: Uint256ArraysMock, elements: Array(10).fill().map(() => web3.utils.randomHex(32)) }, + { + type: 'address', + artifact: AddressArraysMock, + elements: Array(10) + .fill() + .map(() => web3.utils.randomHex(20)), + }, + { + type: 'bytes32', + artifact: Bytes32ArraysMock, + elements: Array(10) + .fill() + .map(() => web3.utils.randomHex(32)), + }, + { + type: 'uint256', + artifact: Uint256ArraysMock, + elements: Array(10) + .fill() + .map(() => web3.utils.randomHex(32)), + }, ]) { it(type, async function () { const contract = await artifact.new(elements); diff --git a/test/utils/Checkpoints.test.js b/test/utils/Checkpoints.test.js index 520cf4fd0..d43d469cc 100644 --- a/test/utils/Checkpoints.test.js +++ b/test/utils/Checkpoints.test.js @@ -6,8 +6,8 @@ const { batchInBlock } = require('../helpers/txpool'); const $Checkpoints = artifacts.require('$Checkpoints'); -const first = (array) => array.length ? array[0] : undefined; -const last = (array) => array.length ? array[array.length - 1] : undefined; +const first = array => (array.length ? array[0] : undefined); +const last = array => (array.length ? array[array.length - 1] : undefined); contract('Checkpoints', function () { beforeEach(async function () { @@ -15,18 +15,13 @@ contract('Checkpoints', function () { }); describe('History checkpoints', function () { - const latest = (self, ...args) => - self.methods['$latest_Checkpoints_History(uint256)'](0, ...args); + const latest = (self, ...args) => self.methods['$latest_Checkpoints_History(uint256)'](0, ...args); const latestCheckpoint = (self, ...args) => self.methods['$latestCheckpoint_Checkpoints_History(uint256)'](0, ...args); - const push = (self, ...args) => - self.methods['$push(uint256,uint256)'](0, ...args); - const getAtBlock = (self, ...args) => - self.methods['$getAtBlock(uint256,uint256)'](0, ...args); - const getAtRecentBlock = (self, ...args) => - self.methods['$getAtProbablyRecentBlock(uint256,uint256)'](0, ...args); - const getLength = (self, ...args) => - self.methods['$length_Checkpoints_History(uint256)'](0, ...args); + const push = (self, ...args) => self.methods['$push(uint256,uint256)'](0, ...args); + const getAtBlock = (self, ...args) => self.methods['$getAtBlock(uint256,uint256)'](0, ...args); + const getAtRecentBlock = (self, ...args) => self.methods['$getAtProbablyRecentBlock(uint256,uint256)'](0, ...args); + const getLength = (self, ...args) => self.methods['$length_Checkpoints_History(uint256)'](0, ...args); describe('without checkpoints', function () { it('returns zero as latest value', async function () { @@ -40,8 +35,8 @@ contract('Checkpoints', function () { it('returns zero as past value', async function () { await time.advanceBlock(); - expect(await getAtBlock(this.mock, await web3.eth.getBlockNumber() - 1)).to.be.bignumber.equal('0'); - expect(await getAtRecentBlock(this.mock, await web3.eth.getBlockNumber() - 1)).to.be.bignumber.equal('0'); + expect(await getAtBlock(this.mock, (await web3.eth.getBlockNumber()) - 1)).to.be.bignumber.equal('0'); + expect(await getAtRecentBlock(this.mock, (await web3.eth.getBlockNumber()) - 1)).to.be.bignumber.equal('0'); }); }); @@ -64,7 +59,7 @@ contract('Checkpoints', function () { expect(ckpt[2]).to.be.bignumber.equal(web3.utils.toBN('3')); }); - for (const getAtBlockVariant of [ getAtBlock, getAtRecentBlock ]) { + for (const getAtBlockVariant of [getAtBlock, getAtRecentBlock]) { describe(`lookup: ${getAtBlockVariant}`, function () { it('returns past values', async function () { expect(await getAtBlockVariant(this.mock, this.tx1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); @@ -82,7 +77,7 @@ contract('Checkpoints', function () { ); await expectRevert( - getAtBlockVariant(this.mock, await web3.eth.getBlockNumber() + 1), + getAtBlockVariant(this.mock, (await web3.eth.getBlockNumber()) + 1), 'Checkpoints: block not yet mined', ); }); @@ -118,18 +113,13 @@ contract('Checkpoints', function () { for (const length of [160, 224]) { describe(`Trace${length}`, function () { - const latest = (self, ...args) => - self.methods[`$latest_Checkpoints_Trace${length}(uint256)`](0, ...args); + const latest = (self, ...args) => self.methods[`$latest_Checkpoints_Trace${length}(uint256)`](0, ...args); const latestCheckpoint = (self, ...args) => self.methods[`$latestCheckpoint_Checkpoints_Trace${length}(uint256)`](0, ...args); - const push = (self, ...args) => - self.methods[`$push(uint256,uint${256 - length},uint${length})`](0, ...args); - const upperLookup = (self, ...args) => - self.methods[`$upperLookup(uint256,uint${256 - length})`](0, ...args); - const lowerLookup = (self, ...args) => - self.methods[`$lowerLookup(uint256,uint${256 - length})`](0, ...args); - const getLength = (self, ...args) => - self.methods[`$length_Checkpoints_Trace${length}(uint256)`](0, ...args); + const push = (self, ...args) => self.methods[`$push(uint256,uint${256 - length},uint${length})`](0, ...args); + const upperLookup = (self, ...args) => self.methods[`$upperLookup(uint256,uint${256 - length})`](0, ...args); + const lowerLookup = (self, ...args) => self.methods[`$lowerLookup(uint256,uint${256 - length})`](0, ...args); + const getLength = (self, ...args) => self.methods[`$length_Checkpoints_Trace${length}(uint256)`](0, ...args); describe('without checkpoints', function () { it('returns zero as latest value', async function () { @@ -162,8 +152,7 @@ contract('Checkpoints', function () { }); it('length', async function () { - expect(await getLength(this.mock)) - .to.be.bignumber.equal(this.checkpoints.length.toString()); + expect(await getLength(this.mock)).to.be.bignumber.equal(this.checkpoints.length.toString()); }); it('returns latest value', async function () { diff --git a/test/utils/Context.behavior.js b/test/utils/Context.behavior.js index 8728e1021..08f7558d7 100644 --- a/test/utils/Context.behavior.js +++ b/test/utils/Context.behavior.js @@ -2,7 +2,7 @@ const { BN, expectEvent } = require('@openzeppelin/test-helpers'); const ContextMock = artifacts.require('ContextMock'); -function shouldBehaveLikeRegularContext (sender) { +function shouldBehaveLikeRegularContext(sender) { describe('msgSender', function () { it('returns the transaction sender when called from an EOA', async function () { const receipt = await this.context.msgSender({ from: sender }); diff --git a/test/utils/Context.test.js b/test/utils/Context.test.js index 709aa87d4..f372f7420 100644 --- a/test/utils/Context.test.js +++ b/test/utils/Context.test.js @@ -6,7 +6,7 @@ const ContextMockCaller = artifacts.require('ContextMockCaller'); const { shouldBehaveLikeRegularContext } = require('./Context.behavior'); contract('Context', function (accounts) { - const [ sender ] = accounts; + const [sender] = accounts; beforeEach(async function () { this.context = await ContextMock.new(); diff --git a/test/utils/Create2.test.js b/test/utils/Create2.test.js index 121630265..2fc27dc15 100644 --- a/test/utils/Create2.test.js +++ b/test/utils/Create2.test.js @@ -7,15 +7,12 @@ const VestingWallet = artifacts.require('VestingWallet'); const ERC1820Implementer = artifacts.require('$ERC1820Implementer'); contract('Create2', function (accounts) { - const [ deployerAccount, other ] = accounts; + const [deployerAccount, other] = accounts; const salt = 'salt message'; const saltHex = web3.utils.soliditySha3(salt); - const encodedParams = web3.eth.abi.encodeParameters( - [ 'address', 'uint64', 'uint64' ], - [ other, 0, 0 ], - ).slice(2); + const encodedParams = web3.eth.abi.encodeParameters(['address', 'uint64', 'uint64'], [other, 0, 0]).slice(2); const constructorByteCode = `${VestingWallet.bytecode}${encodedParams}`; @@ -24,18 +21,18 @@ contract('Create2', function (accounts) { }); describe('computeAddress', function () { it('computes the correct contract address', async function () { - const onChainComputed = - await this.factory.$computeAddress(saltHex, web3.utils.keccak256(constructorByteCode)); - const offChainComputed = - computeCreate2Address(saltHex, constructorByteCode, this.factory.address); + const onChainComputed = await this.factory.$computeAddress(saltHex, web3.utils.keccak256(constructorByteCode)); + const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); expect(onChainComputed).to.equal(offChainComputed); }); it('computes the correct contract address with deployer', async function () { - const onChainComputed = - await this.factory.$computeAddress(saltHex, web3.utils.keccak256(constructorByteCode), deployerAccount); - const offChainComputed = - computeCreate2Address(saltHex, constructorByteCode, deployerAccount); + const onChainComputed = await this.factory.$computeAddress( + saltHex, + web3.utils.keccak256(constructorByteCode), + deployerAccount, + ); + const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, deployerAccount); expect(onChainComputed).to.equal(offChainComputed); }); }); @@ -44,11 +41,9 @@ contract('Create2', function (accounts) { it('deploys a ERC1820Implementer from inline assembly code', async function () { const offChainComputed = computeCreate2Address(saltHex, ERC1820Implementer.bytecode, this.factory.address); - expectEvent( - await this.factory.$deploy(0, saltHex, ERC1820Implementer.bytecode), - 'return$deploy', - { addr: offChainComputed }, - ); + expectEvent(await this.factory.$deploy(0, saltHex, ERC1820Implementer.bytecode), 'return$deploy', { + addr: offChainComputed, + }); expect(ERC1820Implementer.bytecode).to.include((await web3.eth.getCode(offChainComputed)).slice(2)); }); @@ -56,11 +51,9 @@ contract('Create2', function (accounts) { it('deploys a contract with constructor arguments', async function () { const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); - expectEvent( - await this.factory.$deploy(0, saltHex, constructorByteCode), - 'return$deploy', - { addr: offChainComputed }, - ); + expectEvent(await this.factory.$deploy(0, saltHex, constructorByteCode), 'return$deploy', { + addr: offChainComputed, + }); expect(await VestingWallet.at(offChainComputed).then(instance => instance.beneficiary())).to.be.equal(other); }); @@ -72,39 +65,25 @@ contract('Create2', function (accounts) { const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); - expectEvent( - await this.factory.$deploy(deposit, saltHex, constructorByteCode), - 'return$deploy', - { addr: offChainComputed }, - ); + expectEvent(await this.factory.$deploy(deposit, saltHex, constructorByteCode), 'return$deploy', { + addr: offChainComputed, + }); expect(await balance.current(offChainComputed)).to.be.bignumber.equal(deposit); }); it('fails deploying a contract in an existent address', async function () { - expectEvent( - await this.factory.$deploy(0, saltHex, constructorByteCode), - 'return$deploy', - ); + expectEvent(await this.factory.$deploy(0, saltHex, constructorByteCode), 'return$deploy'); - await expectRevert( - this.factory.$deploy(0, saltHex, constructorByteCode), - 'Create2: Failed on deploy', - ); + await expectRevert(this.factory.$deploy(0, saltHex, constructorByteCode), 'Create2: Failed on deploy'); }); it('fails deploying a contract if the bytecode length is zero', async function () { - await expectRevert( - this.factory.$deploy(0, saltHex, '0x'), - 'Create2: bytecode length is zero', - ); + await expectRevert(this.factory.$deploy(0, saltHex, '0x'), 'Create2: bytecode length is zero'); }); it('fails deploying a contract if factory contract does not have sufficient balance', async function () { - await expectRevert( - this.factory.$deploy(1, saltHex, constructorByteCode), - 'Create2: insufficient balance', - ); + await expectRevert(this.factory.$deploy(1, saltHex, constructorByteCode), 'Create2: insufficient balance'); }); }); }); diff --git a/test/utils/Multicall.test.js b/test/utils/Multicall.test.js index 95cdddc92..cfb800769 100644 --- a/test/utils/Multicall.test.js +++ b/test/utils/Multicall.test.js @@ -3,7 +3,7 @@ const { BN, expectRevert } = require('@openzeppelin/test-helpers'); const ERC20MulticallMock = artifacts.require('$ERC20MulticallMock'); contract('Multicall', function (accounts) { - const [ deployer, alice, bob ] = accounts; + const [deployer, alice, bob] = accounts; const amount = 12000; beforeEach(async function () { @@ -15,10 +15,13 @@ contract('Multicall', function (accounts) { expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0')); expect(await this.multicallToken.balanceOf(bob)).to.be.bignumber.equal(new BN('0')); - await this.multicallToken.multicall([ - this.multicallToken.contract.methods.transfer(alice, amount / 2).encodeABI(), - this.multicallToken.contract.methods.transfer(bob, amount / 3).encodeABI(), - ], { from: deployer }); + await this.multicallToken.multicall( + [ + this.multicallToken.contract.methods.transfer(alice, amount / 2).encodeABI(), + this.multicallToken.contract.methods.transfer(bob, amount / 3).encodeABI(), + ], + { from: deployer }, + ); expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN(amount / 2)); expect(await this.multicallToken.balanceOf(bob)).to.be.bignumber.equal(new BN(amount / 3)); @@ -39,20 +42,26 @@ contract('Multicall', function (accounts) { it('reverts previous calls', async function () { expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0')); - const call = this.multicallToken.multicall([ - this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(), - this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(), - ], { from: deployer }); + const call = this.multicallToken.multicall( + [ + this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(), + this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(), + ], + { from: deployer }, + ); await expectRevert(call, 'ERC20: transfer amount exceeds balance'); expect(await this.multicallToken.balanceOf(alice)).to.be.bignumber.equal(new BN('0')); }); it('bubbles up revert reasons', async function () { - const call = this.multicallToken.multicall([ - this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(), - this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(), - ], { from: deployer }); + const call = this.multicallToken.multicall( + [ + this.multicallToken.contract.methods.transfer(alice, amount).encodeABI(), + this.multicallToken.contract.methods.transfer(bob, amount).encodeABI(), + ], + { from: deployer }, + ); await expectRevert(call, 'ERC20: transfer amount exceeds balance'); }); diff --git a/test/utils/Strings.test.js b/test/utils/Strings.test.js index 11f3e7270..6658871a0 100644 --- a/test/utils/Strings.test.js +++ b/test/utils/Strings.test.js @@ -78,15 +78,17 @@ contract('Strings', function () { }); it('converts MAX_UINT256', async function () { - expect(await this.strings.methods['$toHexString(uint256)'](constants.MAX_UINT256)) - .to.equal(web3.utils.toHex(constants.MAX_UINT256)); + expect(await this.strings.methods['$toHexString(uint256)'](constants.MAX_UINT256)).to.equal( + web3.utils.toHex(constants.MAX_UINT256), + ); }); }); describe('toHexString fixed', function () { it('converts a positive number (long)', async function () { - expect(await this.strings.methods['$toHexString(uint256,uint256)'](0x4132, 32)) - .to.equal('0x0000000000000000000000000000000000000000000000000000000000004132'); + expect(await this.strings.methods['$toHexString(uint256,uint256)'](0x4132, 32)).to.equal( + '0x0000000000000000000000000000000000000000000000000000000000004132', + ); }); it('converts a positive number (short)', async function () { @@ -97,8 +99,9 @@ contract('Strings', function () { }); it('converts MAX_UINT256', async function () { - expect(await this.strings.methods['$toHexString(uint256,uint256)'](constants.MAX_UINT256, 32)) - .to.equal(web3.utils.toHex(constants.MAX_UINT256)); + expect(await this.strings.methods['$toHexString(uint256,uint256)'](constants.MAX_UINT256, 32)).to.equal( + web3.utils.toHex(constants.MAX_UINT256), + ); }); }); diff --git a/test/utils/cryptography/ECDSA.test.js b/test/utils/cryptography/ECDSA.test.js index fc3df0db4..3b19cde60 100644 --- a/test/utils/cryptography/ECDSA.test.js +++ b/test/utils/cryptography/ECDSA.test.js @@ -9,40 +9,40 @@ const TEST_MESSAGE = web3.utils.sha3('OpenZeppelin'); const WRONG_MESSAGE = web3.utils.sha3('Nope'); const NON_HASH_MESSAGE = '0x' + Buffer.from('abcd').toString('hex'); -function to2098Format (signature) { +function to2098Format(signature) { const long = web3.utils.hexToBytes(signature); if (long.length !== 65) { throw new Error('invalid signature length (expected long format)'); } if (long[32] >> 7 === 1) { - throw new Error('invalid signature \'s\' value'); + throw new Error("invalid signature 's' value"); } const short = long.slice(0, 64); - short[32] |= (long[64] % 27) << 7; // set the first bit of the 32nd byte to the v parity bit + short[32] |= long[64] % 27 << 7; // set the first bit of the 32nd byte to the v parity bit return web3.utils.bytesToHex(short); } -function split (signature) { +function split(signature) { const raw = web3.utils.hexToBytes(signature); switch (raw.length) { - case 64: - return [ - web3.utils.bytesToHex(raw.slice(0, 32)), // r - web3.utils.bytesToHex(raw.slice(32, 64)), // vs - ]; - case 65: - return [ - raw[64], // v - web3.utils.bytesToHex(raw.slice(0, 32)), // r - web3.utils.bytesToHex(raw.slice(32, 64)), // s - ]; - default: - expect.fail('Invalid signature length, cannot split'); + case 64: + return [ + web3.utils.bytesToHex(raw.slice(0, 32)), // r + web3.utils.bytesToHex(raw.slice(32, 64)), // vs + ]; + case 65: + return [ + raw[64], // v + web3.utils.bytesToHex(raw.slice(0, 32)), // r + web3.utils.bytesToHex(raw.slice(32, 64)), // s + ]; + default: + expect.fail('Invalid signature length, cannot split'); } } contract('ECDSA', function (accounts) { - const [ other ] = accounts; + const [other] = accounts; beforeEach(async function () { this.ecdsa = await ECDSA.new(); @@ -56,7 +56,10 @@ contract('ECDSA', function (accounts) { it('with long signature', async function () { await expectRevert( // eslint-disable-next-line max-len - this.ecdsa.$recover(TEST_MESSAGE, '0x01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789'), + this.ecdsa.$recover( + TEST_MESSAGE, + '0x01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', + ), 'ECDSA: invalid signature length', ); }); @@ -69,10 +72,7 @@ contract('ECDSA', function (accounts) { const signature = await web3.eth.sign(TEST_MESSAGE, other); // Recover the signer address from the generated message and signature. - expect(await this.ecdsa.$recover( - toEthSignedMessageHash(TEST_MESSAGE), - signature, - )).to.equal(other); + expect(await this.ecdsa.$recover(toEthSignedMessageHash(TEST_MESSAGE), signature)).to.equal(other); }); it('returns signer address with correct signature for arbitrary length message', async function () { @@ -80,10 +80,7 @@ contract('ECDSA', function (accounts) { const signature = await web3.eth.sign(NON_HASH_MESSAGE, other); // Recover the signer address from the generated message and signature. - expect(await this.ecdsa.$recover( - toEthSignedMessageHash(NON_HASH_MESSAGE), - signature, - )).to.equal(other); + expect(await this.ecdsa.$recover(toEthSignedMessageHash(NON_HASH_MESSAGE), signature)).to.equal(other); }); it('returns a different address', async function () { @@ -93,7 +90,8 @@ contract('ECDSA', function (accounts) { it('reverts with invalid signature', async function () { // eslint-disable-next-line max-len - const signature = '0x332ce75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e01c'; + const signature = + '0x332ce75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e01c'; await expectRevert(this.ecdsa.$recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); }); }); @@ -102,53 +100,47 @@ contract('ECDSA', function (accounts) { // Signature generated outside ganache with method web3.eth.sign(signer, message) const signer = '0x2cc1166f6212628A0deEf2B33BEFB2187D35b86c'; // eslint-disable-next-line max-len - const signatureWithoutV = '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be892'; + const signatureWithoutV = + '0x5d99b6f7f6d1f73d1a26497f2b1c89b24c0993913f86e9a2d02cd69887d9c94f3c880358579d811b21dd1b7fd9bb01c1d81d10e69f0384e675c32b39643be892'; it('works with correct v value', async function () { const v = '1b'; // 27 = 1b. const signature = signatureWithoutV + v; - expect(await this.ecdsa.$recover( - TEST_MESSAGE, - signature, - )).to.equal(signer); + expect(await this.ecdsa.$recover(TEST_MESSAGE, signature)).to.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(signature), - )).to.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + ).to.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(to2098Format(signature)), - )).to.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + ), + ).to.equal(signer); }); it('rejects incorrect v value', async function () { const v = '1c'; // 28 = 1c. const signature = signatureWithoutV + v; - expect(await this.ecdsa.$recover( - TEST_MESSAGE, - signature, - )).to.not.equal(signer); + expect(await this.ecdsa.$recover(TEST_MESSAGE, signature)).to.not.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(signature), - )).to.not.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + ).to.not.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(to2098Format(signature)), - )).to.not.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + ), + ).to.not.equal(signer); }); it('reverts wrong v values', async function () { for (const v of ['00', '01']) { const signature = signatureWithoutV + v; - await expectRevert( - this.ecdsa.$recover(TEST_MESSAGE, signature), - 'ECDSA: invalid signature', - ); + await expectRevert(this.ecdsa.$recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); await expectRevert( this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), @@ -170,53 +162,47 @@ contract('ECDSA', function (accounts) { context('with v=28 signature', function () { const signer = '0x1E318623aB09Fe6de3C9b8672098464Aeda9100E'; // eslint-disable-next-line max-len - const signatureWithoutV = '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e0'; + const signatureWithoutV = + '0x331fe75a821c982f9127538858900d87d3ec1f9f737338ad67cad133fa48feff48e6fa0c18abc62e42820f05943e47af3e9fbe306ce74d64094bdf1691ee53e0'; it('works with correct v value', async function () { const v = '1c'; // 28 = 1c. const signature = signatureWithoutV + v; - expect(await this.ecdsa.$recover( - TEST_MESSAGE, - signature, - )).to.equal(signer); + expect(await this.ecdsa.$recover(TEST_MESSAGE, signature)).to.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(signature), - )).to.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + ).to.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(to2098Format(signature)), - )).to.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + ), + ).to.equal(signer); }); it('rejects incorrect v value', async function () { const v = '1b'; // 27 = 1b. const signature = signatureWithoutV + v; - expect(await this.ecdsa.$recover( - TEST_MESSAGE, - signature, - )).to.not.equal(signer); + expect(await this.ecdsa.$recover(TEST_MESSAGE, signature)).to.not.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(signature), - )).to.not.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), + ).to.not.equal(signer); - expect(await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( - TEST_MESSAGE, - ...split(to2098Format(signature)), - )).to.not.equal(signer); + expect( + await this.ecdsa.methods['$recover(bytes32,bytes32,bytes32)']( + TEST_MESSAGE, + ...split(to2098Format(signature)), + ), + ).to.not.equal(signer); }); it('reverts invalid v values', async function () { for (const v of ['00', '01']) { const signature = signatureWithoutV + v; - await expectRevert( - this.ecdsa.$recover(TEST_MESSAGE, signature), - 'ECDSA: invalid signature', - ); + await expectRevert(this.ecdsa.$recover(TEST_MESSAGE, signature), 'ECDSA: invalid signature'); await expectRevert( this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(signature)), @@ -238,25 +224,28 @@ contract('ECDSA', function (accounts) { it('reverts with high-s value signature', async function () { const message = '0xb94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'; // eslint-disable-next-line max-len - const highSSignature = '0xe742ff452d41413616a5bf43fe15dd88294e983d3d36206c2712f39083d638bde0a0fc89be718fbc1033e1d30d78be1c68081562ed2e97af876f286f3453231d1b'; - await expectRevert(this.ecdsa.$recover(message, highSSignature), 'ECDSA: invalid signature \'s\' value'); + const highSSignature = + '0xe742ff452d41413616a5bf43fe15dd88294e983d3d36206c2712f39083d638bde0a0fc89be718fbc1033e1d30d78be1c68081562ed2e97af876f286f3453231d1b'; + await expectRevert(this.ecdsa.$recover(message, highSSignature), "ECDSA: invalid signature 's' value"); await expectRevert( this.ecdsa.methods['$recover(bytes32,uint8,bytes32,bytes32)'](TEST_MESSAGE, ...split(highSSignature)), - 'ECDSA: invalid signature \'s\' value', + "ECDSA: invalid signature 's' value", ); - expect(() => to2098Format(highSSignature)).to.throw('invalid signature \'s\' value'); + expect(() => to2098Format(highSSignature)).to.throw("invalid signature 's' value"); }); }); context('toEthSignedMessageHash', function () { it('prefixes bytes32 data correctly', async function () { - expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes32)'](TEST_MESSAGE)) - .to.equal(toEthSignedMessageHash(TEST_MESSAGE)); + expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes32)'](TEST_MESSAGE)).to.equal( + toEthSignedMessageHash(TEST_MESSAGE), + ); }); it('prefixes dynamic length data correctly', async function () { - expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes)'](NON_HASH_MESSAGE)) - .to.equal(toEthSignedMessageHash(NON_HASH_MESSAGE)); + expect(await this.ecdsa.methods['$toEthSignedMessageHash(bytes)'](NON_HASH_MESSAGE)).to.equal( + toEthSignedMessageHash(NON_HASH_MESSAGE), + ); }); }); }); diff --git a/test/utils/cryptography/MerkleProof.test.js b/test/utils/cryptography/MerkleProof.test.js index 70271eea1..62157b56a 100644 --- a/test/utils/cryptography/MerkleProof.test.js +++ b/test/utils/cryptography/MerkleProof.test.js @@ -92,10 +92,10 @@ contract('MerkleProof', function () { const badProof = badMerkleTree.getMultiProof(badProofLeaves); const badProofFlags = badMerkleTree.getProofFlags(badProofLeaves, badProof); - expect(await this.merkleProof.$multiProofVerify(badProof, badProofFlags, root, badProofLeaves)) - .to.equal(false); - expect(await this.merkleProof.$multiProofVerifyCalldata(badProof, badProofFlags, root, badProofLeaves)) - .to.equal(false); + expect(await this.merkleProof.$multiProofVerify(badProof, badProofFlags, root, badProofLeaves)).to.equal(false); + expect(await this.merkleProof.$multiProofVerifyCalldata(badProof, badProofFlags, root, badProofLeaves)).to.equal( + false, + ); }); it('revert with invalid multi proof #1', async function () { @@ -108,19 +108,19 @@ contract('MerkleProof', function () { await expectRevert( this.merkleProof.$multiProofVerify( - [ leaves[1], fill, merkleTree.layers[1][1] ], - [ false, false, false ], + [leaves[1], fill, merkleTree.layers[1][1]], + [false, false, false], root, - [ leaves[0], badLeaf ], // A, E + [leaves[0], badLeaf], // A, E ), 'MerkleProof: invalid multiproof', ); await expectRevert( this.merkleProof.$multiProofVerifyCalldata( - [ leaves[1], fill, merkleTree.layers[1][1] ], - [ false, false, false ], + [leaves[1], fill, merkleTree.layers[1][1]], + [false, false, false], root, - [ leaves[0], badLeaf ], // A, E + [leaves[0], badLeaf], // A, E ), 'MerkleProof: invalid multiproof', ); @@ -136,20 +136,20 @@ contract('MerkleProof', function () { await expectRevert( this.merkleProof.$multiProofVerify( - [ leaves[1], fill, merkleTree.layers[1][1] ], - [ false, false, false, false ], + [leaves[1], fill, merkleTree.layers[1][1]], + [false, false, false, false], root, - [ badLeaf, leaves[0] ], // A, E + [badLeaf, leaves[0]], // A, E ), 'reverted with panic code 0x32', ); await expectRevert( this.merkleProof.$multiProofVerifyCalldata( - [ leaves[1], fill, merkleTree.layers[1][1] ], - [ false, false, false, false ], + [leaves[1], fill, merkleTree.layers[1][1]], + [false, false, false, false], root, - [ badLeaf, leaves[0] ], // A, E + [badLeaf, leaves[0]], // A, E ), 'reverted with panic code 0x32', ); @@ -173,8 +173,8 @@ contract('MerkleProof', function () { const merkleTree = new MerkleTree(leaves, keccak256, { sort: true }); const root = merkleTree.getRoot(); - expect(await this.merkleProof.$multiProofVerify([ root ], [], root, [])).to.equal(true); - expect(await this.merkleProof.$multiProofVerifyCalldata([ root ], [], root, [])).to.equal(true); + expect(await this.merkleProof.$multiProofVerify([root], [], root, [])).to.equal(true); + expect(await this.merkleProof.$multiProofVerifyCalldata([root], [], root, [])).to.equal(true); }); }); }); diff --git a/test/utils/cryptography/SignatureChecker.test.js b/test/utils/cryptography/SignatureChecker.test.js index 55ba75af0..11054c3e1 100644 --- a/test/utils/cryptography/SignatureChecker.test.js +++ b/test/utils/cryptography/SignatureChecker.test.js @@ -21,61 +21,63 @@ contract('SignatureChecker (ERC1271)', function (accounts) { context('EOA account', function () { it('with matching signer and signature', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - signer, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - )).to.equal(true); + expect( + await this.signaturechecker.$isValidSignatureNow(signer, toEthSignedMessageHash(TEST_MESSAGE), this.signature), + ).to.equal(true); }); it('with invalid signer', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - other, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - )).to.equal(false); + expect( + await this.signaturechecker.$isValidSignatureNow(other, toEthSignedMessageHash(TEST_MESSAGE), this.signature), + ).to.equal(false); }); it('with invalid signature', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - signer, - toEthSignedMessageHash(WRONG_MESSAGE), - this.signature, - )).to.equal(false); + expect( + await this.signaturechecker.$isValidSignatureNow(signer, toEthSignedMessageHash(WRONG_MESSAGE), this.signature), + ).to.equal(false); }); }); context('ERC1271 wallet', function () { it('with matching signer and signature', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - this.wallet.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - )).to.equal(true); + expect( + await this.signaturechecker.$isValidSignatureNow( + this.wallet.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(true); }); it('with invalid signer', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - this.signaturechecker.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - )).to.equal(false); + expect( + await this.signaturechecker.$isValidSignatureNow( + this.signaturechecker.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(false); }); it('with invalid signature', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - this.wallet.address, - toEthSignedMessageHash(WRONG_MESSAGE), - this.signature, - )).to.equal(false); + expect( + await this.signaturechecker.$isValidSignatureNow( + this.wallet.address, + toEthSignedMessageHash(WRONG_MESSAGE), + this.signature, + ), + ).to.equal(false); }); it('with malicious wallet', async function () { - expect(await this.signaturechecker.$isValidSignatureNow( - this.malicious.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - )).to.equal(false); + expect( + await this.signaturechecker.$isValidSignatureNow( + this.malicious.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(false); }); }); }); diff --git a/test/utils/escrow/ConditionalEscrow.test.js b/test/utils/escrow/ConditionalEscrow.test.js index 3386ca55c..9e17a8bce 100644 --- a/test/utils/escrow/ConditionalEscrow.test.js +++ b/test/utils/escrow/ConditionalEscrow.test.js @@ -4,7 +4,7 @@ const { shouldBehaveLikeEscrow } = require('./Escrow.behavior'); const ConditionalEscrowMock = artifacts.require('ConditionalEscrowMock'); contract('ConditionalEscrow', function (accounts) { - const [ owner, payee, ...otherAccounts ] = accounts; + const [owner, payee, ...otherAccounts] = accounts; beforeEach(async function () { this.escrow = await ConditionalEscrowMock.new({ from: owner }); @@ -28,7 +28,8 @@ contract('ConditionalEscrow', function (accounts) { it('reverts on withdrawals', async function () { await this.escrow.deposit(payee, { from: owner, value: amount }); - await expectRevert(this.escrow.withdraw(payee, { from: owner }), + await expectRevert( + this.escrow.withdraw(payee, { from: owner }), 'ConditionalEscrow: payee is not allowed to withdraw', ); }); diff --git a/test/utils/escrow/Escrow.behavior.js b/test/utils/escrow/Escrow.behavior.js index ab5905994..f2059ed62 100644 --- a/test/utils/escrow/Escrow.behavior.js +++ b/test/utils/escrow/Escrow.behavior.js @@ -2,7 +2,7 @@ const { balance, ether, expectEvent, expectRevert } = require('@openzeppelin/tes const { expect } = require('chai'); -function shouldBehaveLikeEscrow (owner, [payee1, payee2]) { +function shouldBehaveLikeEscrow(owner, [payee1, payee2]) { const amount = ether('42'); describe('as an escrow', function () { @@ -20,9 +20,7 @@ function shouldBehaveLikeEscrow (owner, [payee1, payee2]) { }); it('only the owner can deposit', async function () { - await expectRevert(this.escrow.deposit(payee1, { from: payee2 }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.escrow.deposit(payee1, { from: payee2 }), 'Ownable: caller is not the owner'); }); it('emits a deposited event', async function () { @@ -72,9 +70,7 @@ function shouldBehaveLikeEscrow (owner, [payee1, payee2]) { }); it('only the owner can withdraw', async function () { - await expectRevert(this.escrow.withdraw(payee1, { from: payee1 }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.escrow.withdraw(payee1, { from: payee1 }), 'Ownable: caller is not the owner'); }); it('emits a withdrawn event', async function () { diff --git a/test/utils/escrow/Escrow.test.js b/test/utils/escrow/Escrow.test.js index 025a2a936..47627904b 100644 --- a/test/utils/escrow/Escrow.test.js +++ b/test/utils/escrow/Escrow.test.js @@ -4,7 +4,7 @@ const { shouldBehaveLikeEscrow } = require('./Escrow.behavior'); const Escrow = artifacts.require('Escrow'); contract('Escrow', function (accounts) { - const [ owner, ...otherAccounts ] = accounts; + const [owner, ...otherAccounts] = accounts; beforeEach(async function () { this.escrow = await Escrow.new({ from: owner }); diff --git a/test/utils/escrow/RefundEscrow.test.js b/test/utils/escrow/RefundEscrow.test.js index 26c19b366..c5344db16 100644 --- a/test/utils/escrow/RefundEscrow.test.js +++ b/test/utils/escrow/RefundEscrow.test.js @@ -6,14 +6,15 @@ const { expect } = require('chai'); const RefundEscrow = artifacts.require('RefundEscrow'); contract('RefundEscrow', function (accounts) { - const [ owner, beneficiary, refundee1, refundee2 ] = accounts; + const [owner, beneficiary, refundee1, refundee2] = accounts; const amount = ether('54'); const refundees = [refundee1, refundee2]; it('requires a non-null beneficiary', async function () { await expectRevert( - RefundEscrow.new(ZERO_ADDRESS, { from: owner }), 'RefundEscrow: beneficiary is the zero address', + RefundEscrow.new(ZERO_ADDRESS, { from: owner }), + 'RefundEscrow: beneficiary is the zero address', ); }); @@ -36,23 +37,20 @@ contract('RefundEscrow', function (accounts) { it('does not refund refundees', async function () { await this.escrow.deposit(refundee1, { from: owner, value: amount }); - await expectRevert(this.escrow.withdraw(refundee1), - 'ConditionalEscrow: payee is not allowed to withdraw', - ); + await expectRevert(this.escrow.withdraw(refundee1), 'ConditionalEscrow: payee is not allowed to withdraw'); }); it('does not allow beneficiary withdrawal', async function () { await this.escrow.deposit(refundee1, { from: owner, value: amount }); - await expectRevert(this.escrow.beneficiaryWithdraw(), + await expectRevert( + this.escrow.beneficiaryWithdraw(), 'RefundEscrow: beneficiary can only withdraw while closed', ); }); }); it('only the owner can enter closed state', async function () { - await expectRevert(this.escrow.close({ from: beneficiary }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.escrow.close({ from: beneficiary }), 'Ownable: caller is not the owner'); const receipt = await this.escrow.close({ from: owner }); expectEvent(receipt, 'RefundsClosed'); @@ -66,15 +64,14 @@ contract('RefundEscrow', function (accounts) { }); it('rejects deposits', async function () { - await expectRevert(this.escrow.deposit(refundee1, { from: owner, value: amount }), + await expectRevert( + this.escrow.deposit(refundee1, { from: owner, value: amount }), 'RefundEscrow: can only deposit while active', ); }); it('does not refund refundees', async function () { - await expectRevert(this.escrow.withdraw(refundee1), - 'ConditionalEscrow: payee is not allowed to withdraw', - ); + await expectRevert(this.escrow.withdraw(refundee1), 'ConditionalEscrow: payee is not allowed to withdraw'); }); it('allows beneficiary withdrawal', async function () { @@ -84,22 +81,19 @@ contract('RefundEscrow', function (accounts) { }); it('prevents entering the refund state', async function () { - await expectRevert(this.escrow.enableRefunds({ from: owner }), + await expectRevert( + this.escrow.enableRefunds({ from: owner }), 'RefundEscrow: can only enable refunds while active', ); }); it('prevents re-entering the closed state', async function () { - await expectRevert(this.escrow.close({ from: owner }), - 'RefundEscrow: can only close while active', - ); + await expectRevert(this.escrow.close({ from: owner }), 'RefundEscrow: can only close while active'); }); }); it('only the owner can enter refund state', async function () { - await expectRevert(this.escrow.enableRefunds({ from: beneficiary }), - 'Ownable: caller is not the owner', - ); + await expectRevert(this.escrow.enableRefunds({ from: beneficiary }), 'Ownable: caller is not the owner'); const receipt = await this.escrow.enableRefunds({ from: owner }); expectEvent(receipt, 'RefundsEnabled'); @@ -113,7 +107,8 @@ contract('RefundEscrow', function (accounts) { }); it('rejects deposits', async function () { - await expectRevert(this.escrow.deposit(refundee1, { from: owner, value: amount }), + await expectRevert( + this.escrow.deposit(refundee1, { from: owner, value: amount }), 'RefundEscrow: can only deposit while active', ); }); @@ -127,19 +122,19 @@ contract('RefundEscrow', function (accounts) { }); it('does not allow beneficiary withdrawal', async function () { - await expectRevert(this.escrow.beneficiaryWithdraw(), + await expectRevert( + this.escrow.beneficiaryWithdraw(), 'RefundEscrow: beneficiary can only withdraw while closed', ); }); it('prevents entering the closed state', async function () { - await expectRevert(this.escrow.close({ from: owner }), - 'RefundEscrow: can only close while active', - ); + await expectRevert(this.escrow.close({ from: owner }), 'RefundEscrow: can only close while active'); }); it('prevents re-entering the refund state', async function () { - await expectRevert(this.escrow.enableRefunds({ from: owner }), + await expectRevert( + this.escrow.enableRefunds({ from: owner }), 'RefundEscrow: can only enable refunds while active', ); }); diff --git a/test/utils/introspection/ERC165.test.js b/test/utils/introspection/ERC165.test.js index c1db67768..6d531c16d 100644 --- a/test/utils/introspection/ERC165.test.js +++ b/test/utils/introspection/ERC165.test.js @@ -7,7 +7,5 @@ contract('ERC165', function () { this.mock = await ERC165.new(); }); - shouldSupportInterfaces([ - 'ERC165', - ]); + shouldSupportInterfaces(['ERC165']); }); diff --git a/test/utils/introspection/ERC165Checker.test.js b/test/utils/introspection/ERC165Checker.test.js index baa344a7f..bb6842812 100644 --- a/test/utils/introspection/ERC165Checker.test.js +++ b/test/utils/introspection/ERC165Checker.test.js @@ -184,7 +184,7 @@ contract('ERC165Checker', function () { context('ERC165 and many interfaces supported', function () { beforeEach(async function () { - this.supportedInterfaces = [ DUMMY_ID, DUMMY_ID_2, DUMMY_ID_3 ]; + this.supportedInterfaces = [DUMMY_ID, DUMMY_ID_2, DUMMY_ID_3]; this.target = await ERC165Storage.new(); await Promise.all(this.supportedInterfaces.map(interfaceId => this.target.$_registerInterface(interfaceId))); }); @@ -198,7 +198,7 @@ contract('ERC165Checker', function () { for (const interfaceId of this.supportedInterfaces) { const supported = await this.mock.$supportsInterface(this.target.address, interfaceId); expect(supported).to.equal(true); - }; + } }); it('supports all interfaceIds via supportsAllInterfaces', async function () { @@ -252,7 +252,7 @@ contract('ERC165Checker', function () { for (const interfaceId of this.supportedInterfaces) { const supported = await this.mock.$supportsERC165InterfaceUnchecked(this.target.address, interfaceId); expect(supported).to.equal(true); - }; + } }); }); @@ -290,16 +290,13 @@ contract('ERC165Checker', function () { const tx1 = await this.mock.$supportsInterface.sendTransaction(this.target.address, DUMMY_ID); expect(tx1.receipt.gasUsed).to.be.lessThan(120000); // 3*30k + 21k + some margin - const tx2 = await this.mock.$getSupportedInterfaces.sendTransaction( - this.target.address, - [ - DUMMY_ID, - DUMMY_ID_2, - DUMMY_ID_3, - DUMMY_UNSUPPORTED_ID, - DUMMY_UNSUPPORTED_ID_2, - ], - ); + const tx2 = await this.mock.$getSupportedInterfaces.sendTransaction(this.target.address, [ + DUMMY_ID, + DUMMY_ID_2, + DUMMY_ID_3, + DUMMY_UNSUPPORTED_ID, + DUMMY_UNSUPPORTED_ID_2, + ]); expect(tx2.receipt.gasUsed).to.be.lessThan(250000); // (2+5)*30k + 21k + some margin }); }); diff --git a/test/utils/introspection/ERC165Storage.test.js b/test/utils/introspection/ERC165Storage.test.js index 278f4ae18..c78caf812 100644 --- a/test/utils/introspection/ERC165Storage.test.js +++ b/test/utils/introspection/ERC165Storage.test.js @@ -19,7 +19,5 @@ contract('ERC165Storage', function () { await expectRevert(this.mock.$_registerInterface('0xffffffff'), 'ERC165: invalid interface id'); }); - shouldSupportInterfaces([ - 'ERC165', - ]); + shouldSupportInterfaces(['ERC165']); }); diff --git a/test/utils/introspection/ERC1820Implementer.test.js b/test/utils/introspection/ERC1820Implementer.test.js index ba0304625..83d0a6534 100644 --- a/test/utils/introspection/ERC1820Implementer.test.js +++ b/test/utils/introspection/ERC1820Implementer.test.js @@ -6,7 +6,7 @@ const { expect } = require('chai'); const ERC1820Implementer = artifacts.require('$ERC1820Implementer'); contract('ERC1820Implementer', function (accounts) { - const [ registryFunder, implementee, other ] = accounts; + const [registryFunder, implementee, other] = accounts; const ERC1820_ACCEPT_MAGIC = bufferToHex(keccakFromString('ERC1820_ACCEPT_MAGIC')); @@ -20,15 +20,16 @@ contract('ERC1820Implementer', function (accounts) { context('with no registered interfaces', function () { it('returns false when interface implementation is queried', async function () { - expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, implementee)) - .to.not.equal(ERC1820_ACCEPT_MAGIC); + expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, implementee)).to.not.equal( + ERC1820_ACCEPT_MAGIC, + ); }); it('reverts when attempting to set as implementer in the registry', async function () { await expectRevert( - this.registry.setInterfaceImplementer( - implementee, this.interfaceA, this.implementer.address, { from: implementee }, - ), + this.registry.setInterfaceImplementer(implementee, this.interfaceA, this.implementer.address, { + from: implementee, + }), 'Does not implement the interface', ); }); @@ -40,27 +41,31 @@ contract('ERC1820Implementer', function (accounts) { }); it('returns true when interface implementation is queried', async function () { - expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, implementee)) - .to.equal(ERC1820_ACCEPT_MAGIC); + expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, implementee)).to.equal( + ERC1820_ACCEPT_MAGIC, + ); }); it('returns false when interface implementation for non-supported interfaces is queried', async function () { - expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceB, implementee)) - .to.not.equal(ERC1820_ACCEPT_MAGIC); + expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceB, implementee)).to.not.equal( + ERC1820_ACCEPT_MAGIC, + ); }); it('returns false when interface implementation for non-supported addresses is queried', async function () { - expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, other)) - .to.not.equal(ERC1820_ACCEPT_MAGIC); + expect(await this.implementer.canImplementInterfaceForAddress(this.interfaceA, other)).to.not.equal( + ERC1820_ACCEPT_MAGIC, + ); }); it('can be set as an implementer for supported interfaces in the registry', async function () { - await this.registry.setInterfaceImplementer( - implementee, this.interfaceA, this.implementer.address, { from: implementee }, - ); + await this.registry.setInterfaceImplementer(implementee, this.interfaceA, this.implementer.address, { + from: implementee, + }); - expect(await this.registry.getInterfaceImplementer(implementee, this.interfaceA)) - .to.equal(this.implementer.address); + expect(await this.registry.getInterfaceImplementer(implementee, this.interfaceA)).to.equal( + this.implementer.address, + ); }); }); }); diff --git a/test/utils/introspection/SupportsInterface.behavior.js b/test/utils/introspection/SupportsInterface.behavior.js index 78e327248..ba5aca2fc 100644 --- a/test/utils/introspection/SupportsInterface.behavior.js +++ b/test/utils/introspection/SupportsInterface.behavior.js @@ -3,9 +3,7 @@ const { makeInterfaceId } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const INTERFACES = { - ERC165: [ - 'supportsInterface(bytes4)', - ], + ERC165: ['supportsInterface(bytes4)'], ERC721: [ 'balanceOf(address)', 'ownerOf(uint256)', @@ -17,16 +15,8 @@ const INTERFACES = { 'safeTransferFrom(address,address,uint256)', 'safeTransferFrom(address,address,uint256,bytes)', ], - ERC721Enumerable: [ - 'totalSupply()', - 'tokenOfOwnerByIndex(address,uint256)', - 'tokenByIndex(uint256)', - ], - ERC721Metadata: [ - 'name()', - 'symbol()', - 'tokenURI(uint256)', - ], + ERC721Enumerable: ['totalSupply()', 'tokenOfOwnerByIndex(address,uint256)', 'tokenByIndex(uint256)'], + ERC721Metadata: ['name()', 'symbol()', 'tokenURI(uint256)'], ERC1155: [ 'balanceOf(address,uint256)', 'balanceOfBatch(address[],uint256[])', @@ -46,10 +36,7 @@ const INTERFACES = { 'revokeRole(bytes32,address)', 'renounceRole(bytes32,address)', ], - AccessControlEnumerable: [ - 'getRoleMember(bytes32,uint256)', - 'getRoleMemberCount(bytes32)', - ], + AccessControlEnumerable: ['getRoleMember(bytes32,uint256)', 'getRoleMemberCount(bytes32)'], Governor: [ 'name()', 'version()', @@ -91,14 +78,8 @@ const INTERFACES = { 'castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)', 'castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)', ], - GovernorTimelock: [ - 'timelock()', - 'proposalEta(uint256)', - 'queue(address[],uint256[],bytes[],bytes32)', - ], - ERC2981: [ - 'royaltyInfo(uint256,uint256)', - ], + GovernorTimelock: ['timelock()', 'proposalEta(uint256)', 'queue(address[],uint256[],bytes[],bytes32)'], + ERC2981: ['royaltyInfo(uint256,uint256)'], }; const INTERFACE_IDS = {}; @@ -111,7 +92,7 @@ for (const k of Object.getOwnPropertyNames(INTERFACES)) { } } -function shouldSupportInterfaces (interfaces = []) { +function shouldSupportInterfaces(interfaces = []) { describe('ERC165', function () { beforeEach(function () { this.contractUnderTest = this.mock || this.token || this.holder || this.accessControl; diff --git a/test/utils/math/Math.test.js b/test/utils/math/Math.test.js index 63cfa186c..6b97a646f 100644 --- a/test/utils/math/Math.test.js +++ b/test/utils/math/Math.test.js @@ -36,7 +36,7 @@ contract('Math', function () { }); describe('average', function () { - function bnAverage (a, b) { + function bnAverage(a, b) { return a.add(b).divn(2); } @@ -101,40 +101,25 @@ contract('Math', function () { }); it('large values', async function () { - expect(await this.math.$mulDiv( - new BN('42'), - MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Down, - )).to.be.bignumber.equal(new BN('41')); + expect( + await this.math.$mulDiv(new BN('42'), MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down), + ).to.be.bignumber.equal(new BN('41')); - expect(await this.math.$mulDiv( + expect(await this.math.$mulDiv(new BN('17'), MAX_UINT256, MAX_UINT256, Rounding.Down)).to.be.bignumber.equal( new BN('17'), - MAX_UINT256, - MAX_UINT256, - Rounding.Down, - )).to.be.bignumber.equal(new BN('17')); + ); - expect(await this.math.$mulDiv( - MAX_UINT256_SUB1, - MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Down, - )).to.be.bignumber.equal(MAX_UINT256_SUB2); + expect( + await this.math.$mulDiv(MAX_UINT256_SUB1, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down), + ).to.be.bignumber.equal(MAX_UINT256_SUB2); - expect(await this.math.$mulDiv( - MAX_UINT256, - MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Down, - )).to.be.bignumber.equal(MAX_UINT256_SUB1); + expect( + await this.math.$mulDiv(MAX_UINT256, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Down), + ).to.be.bignumber.equal(MAX_UINT256_SUB1); - expect(await this.math.$mulDiv( + expect(await this.math.$mulDiv(MAX_UINT256, MAX_UINT256, MAX_UINT256, Rounding.Down)).to.be.bignumber.equal( MAX_UINT256, - MAX_UINT256, - MAX_UINT256, - Rounding.Down, - )).to.be.bignumber.equal(MAX_UINT256); + ); }); }); @@ -145,40 +130,25 @@ contract('Math', function () { }); it('large values', async function () { - expect(await this.math.$mulDiv( + expect(await this.math.$mulDiv(new BN('42'), MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up)).to.be.bignumber.equal( new BN('42'), - MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Up, - )).to.be.bignumber.equal(new BN('42')); + ); - expect(await this.math.$mulDiv( + expect(await this.math.$mulDiv(new BN('17'), MAX_UINT256, MAX_UINT256, Rounding.Up)).to.be.bignumber.equal( new BN('17'), - MAX_UINT256, - MAX_UINT256, - Rounding.Up, - )).to.be.bignumber.equal(new BN('17')); + ); - expect(await this.math.$mulDiv( - MAX_UINT256_SUB1, - MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Up, - )).to.be.bignumber.equal(MAX_UINT256_SUB1); + expect( + await this.math.$mulDiv(MAX_UINT256_SUB1, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up), + ).to.be.bignumber.equal(MAX_UINT256_SUB1); - expect(await this.math.$mulDiv( - MAX_UINT256, + expect(await this.math.$mulDiv(MAX_UINT256, MAX_UINT256_SUB1, MAX_UINT256, Rounding.Up)).to.be.bignumber.equal( MAX_UINT256_SUB1, - MAX_UINT256, - Rounding.Up, - )).to.be.bignumber.equal(MAX_UINT256_SUB1); + ); - expect(await this.math.$mulDiv( + expect(await this.math.$mulDiv(MAX_UINT256, MAX_UINT256, MAX_UINT256, Rounding.Up)).to.be.bignumber.equal( MAX_UINT256, - MAX_UINT256, - MAX_UINT256, - Rounding.Up, - )).to.be.bignumber.equal(MAX_UINT256); + ); }); }); }); @@ -196,8 +166,9 @@ contract('Math', function () { expect(await this.math.$sqrt('1000001', Rounding.Down)).to.be.bignumber.equal('1000'); expect(await this.math.$sqrt('1002000', Rounding.Down)).to.be.bignumber.equal('1000'); expect(await this.math.$sqrt('1002001', Rounding.Down)).to.be.bignumber.equal('1001'); - expect(await this.math.$sqrt(MAX_UINT256, Rounding.Down)) - .to.be.bignumber.equal('340282366920938463463374607431768211455'); + expect(await this.math.$sqrt(MAX_UINT256, Rounding.Down)).to.be.bignumber.equal( + '340282366920938463463374607431768211455', + ); }); it('rounds up', async function () { @@ -212,8 +183,9 @@ contract('Math', function () { expect(await this.math.$sqrt('1000001', Rounding.Up)).to.be.bignumber.equal('1001'); expect(await this.math.$sqrt('1002000', Rounding.Up)).to.be.bignumber.equal('1001'); expect(await this.math.$sqrt('1002001', Rounding.Up)).to.be.bignumber.equal('1001'); - expect(await this.math.$sqrt(MAX_UINT256, Rounding.Up)) - .to.be.bignumber.equal('340282366920938463463374607431768211456'); + expect(await this.math.$sqrt(MAX_UINT256, Rounding.Up)).to.be.bignumber.equal( + '340282366920938463463374607431768211456', + ); }); }); @@ -231,8 +203,9 @@ contract('Math', function () { expect(await this.math.methods['$log2(uint256,uint8)']('7', Rounding.Down)).to.be.bignumber.equal('2'); expect(await this.math.methods['$log2(uint256,uint8)']('8', Rounding.Down)).to.be.bignumber.equal('3'); expect(await this.math.methods['$log2(uint256,uint8)']('9', Rounding.Down)).to.be.bignumber.equal('3'); - expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Down)) - .to.be.bignumber.equal('255'); + expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Down)).to.be.bignumber.equal( + '255', + ); }); it('rounds up', async function () { @@ -247,8 +220,7 @@ contract('Math', function () { expect(await this.math.methods['$log2(uint256,uint8)']('7', Rounding.Up)).to.be.bignumber.equal('3'); expect(await this.math.methods['$log2(uint256,uint8)']('8', Rounding.Up)).to.be.bignumber.equal('3'); expect(await this.math.methods['$log2(uint256,uint8)']('9', Rounding.Up)).to.be.bignumber.equal('4'); - expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Up)) - .to.be.bignumber.equal('256'); + expect(await this.math.methods['$log2(uint256,uint8)'](MAX_UINT256, Rounding.Up)).to.be.bignumber.equal('256'); }); }); diff --git a/test/utils/math/SafeCast.test.js b/test/utils/math/SafeCast.test.js index 38374e500..63223f5d1 100644 --- a/test/utils/math/SafeCast.test.js +++ b/test/utils/math/SafeCast.test.js @@ -9,7 +9,7 @@ contract('SafeCast', async function () { this.safeCast = await SafeCast.new(); }); - function testToUint (bits) { + function testToUint(bits) { describe(`toUint${bits}`, () => { const maxValue = new BN('2').pow(new BN(bits)).subn(1); @@ -60,21 +60,15 @@ contract('SafeCast', async function () { }); it('reverts when casting -1', async function () { - await expectRevert( - this.safeCast.$toUint256(-1), - 'SafeCast: value must be positive', - ); + await expectRevert(this.safeCast.$toUint256(-1), 'SafeCast: value must be positive'); }); it(`reverts when casting INT256_MIN (${minInt256})`, async function () { - await expectRevert( - this.safeCast.$toUint256(minInt256), - 'SafeCast: value must be positive', - ); + await expectRevert(this.safeCast.$toUint256(minInt256), 'SafeCast: value must be positive'); }); }); - function testToInt (bits) { + function testToInt(bits) { describe(`toInt${bits}`, () => { const minValue = new BN('-2').pow(new BN(bits - 1)); const maxValue = new BN('2').pow(new BN(bits - 1)).subn(1); @@ -148,17 +142,11 @@ contract('SafeCast', async function () { }); it(`reverts when casting INT256_MAX + 1 (${maxInt256.addn(1)})`, async function () { - await expectRevert( - this.safeCast.$toInt256(maxInt256.addn(1)), - 'SafeCast: value doesn\'t fit in an int256', - ); + await expectRevert(this.safeCast.$toInt256(maxInt256.addn(1)), "SafeCast: value doesn't fit in an int256"); }); it(`reverts when casting UINT256_MAX (${maxUint256})`, async function () { - await expectRevert( - this.safeCast.$toInt256(maxUint256), - 'SafeCast: value doesn\'t fit in an int256', - ); + await expectRevert(this.safeCast.$toInt256(maxUint256), "SafeCast: value doesn't fit in an int256"); }); }); }); diff --git a/test/utils/math/SafeMath.test.js b/test/utils/math/SafeMath.test.js index a74d7fb96..9598ac57c 100644 --- a/test/utils/math/SafeMath.test.js +++ b/test/utils/math/SafeMath.test.js @@ -6,7 +6,7 @@ const { expect } = require('chai'); const SafeMath = artifacts.require('$SafeMath'); const SafeMathMemoryCheck = artifacts.require('$SafeMathMemoryCheck'); -function expectStruct (value, expected) { +function expectStruct(value, expected) { for (const key in expected) { if (BN.isBN(value[key])) { expect(value[key]).to.be.bignumber.equal(expected[key]); @@ -21,12 +21,12 @@ contract('SafeMath', function () { this.safeMath = await SafeMath.new(); }); - async function testCommutative (fn, lhs, rhs, expected, ...extra) { + async function testCommutative(fn, lhs, rhs, expected, ...extra) { expect(await fn(lhs, rhs, ...extra)).to.be.bignumber.equal(expected); expect(await fn(rhs, lhs, ...extra)).to.be.bignumber.equal(expected); } - async function testFailsCommutative (fn, lhs, rhs, reason, ...extra) { + async function testFailsCommutative(fn, lhs, rhs, reason, ...extra) { if (reason === undefined) { await expectRevert.unspecified(fn(lhs, rhs, ...extra)); await expectRevert.unspecified(fn(rhs, lhs, ...extra)); @@ -36,7 +36,7 @@ contract('SafeMath', function () { } } - async function testCommutativeIterable (fn, lhs, rhs, expected, ...extra) { + async function testCommutativeIterable(fn, lhs, rhs, expected, ...extra) { expectStruct(await fn(lhs, rhs, ...extra), expected); expectStruct(await fn(rhs, lhs, ...extra), expected); } @@ -47,14 +47,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - testCommutativeIterable(this.safeMath.$tryAdd, a, b, [ true, a.add(b) ]); + testCommutativeIterable(this.safeMath.$tryAdd, a, b, [true, a.add(b)]); }); it('reverts on addition overflow', async function () { const a = MAX_UINT256; const b = new BN('1'); - testCommutativeIterable(this.safeMath.$tryAdd, a, b, [ false, '0' ]); + testCommutativeIterable(this.safeMath.$tryAdd, a, b, [false, '0']); }); }); @@ -63,14 +63,14 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - expectStruct(await this.safeMath.$trySub(a, b), [ true, a.sub(b) ]); + expectStruct(await this.safeMath.$trySub(a, b), [true, a.sub(b)]); }); it('reverts if subtraction result would be negative', async function () { const a = new BN('1234'); const b = new BN('5678'); - expectStruct(await this.safeMath.$trySub(a, b), [ false, '0' ]); + expectStruct(await this.safeMath.$trySub(a, b), [false, '0']); }); }); @@ -79,21 +79,21 @@ contract('SafeMath', function () { const a = new BN('1234'); const b = new BN('5678'); - testCommutativeIterable(this.safeMath.$tryMul, a, b, [ true, a.mul(b) ]); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [true, a.mul(b)]); }); it('multiplies by zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - testCommutativeIterable(this.safeMath.$tryMul, a, b, [ true, a.mul(b) ]); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [true, a.mul(b)]); }); it('reverts on multiplication overflow', async function () { const a = MAX_UINT256; const b = new BN('2'); - testCommutativeIterable(this.safeMath.$tryMul, a, b, [ false, '0' ]); + testCommutativeIterable(this.safeMath.$tryMul, a, b, [false, '0']); }); }); @@ -102,28 +102,28 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); + expectStruct(await this.safeMath.$tryDiv(a, b), [true, a.div(b)]); }); it('divides zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); + expectStruct(await this.safeMath.$tryDiv(a, b), [true, a.div(b)]); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryDiv(a, b), [ true, a.div(b) ]); + expectStruct(await this.safeMath.$tryDiv(a, b), [true, a.div(b)]); }); it('reverts on division by zero', async function () { const a = new BN('5678'); const b = new BN('0'); - expectStruct(await this.safeMath.$tryDiv(a, b), [ false, '0' ]); + expectStruct(await this.safeMath.$tryDiv(a, b), [false, '0']); }); }); @@ -133,28 +133,28 @@ contract('SafeMath', function () { const a = new BN('284'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); + expectStruct(await this.safeMath.$tryMod(a, b), [true, a.mod(b)]); }); it('when the dividend is equal to the divisor', async function () { const a = new BN('5678'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); + expectStruct(await this.safeMath.$tryMod(a, b), [true, a.mod(b)]); }); it('when the dividend is larger than the divisor', async function () { const a = new BN('7000'); const b = new BN('5678'); - expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); + expectStruct(await this.safeMath.$tryMod(a, b), [true, a.mod(b)]); }); it('when the dividend is a multiple of the divisor', async function () { const a = new BN('17034'); // 17034 == 5678 * 3 const b = new BN('5678'); - expectStruct(await this.safeMath.$tryMod(a, b), [ true, a.mod(b) ]); + expectStruct(await this.safeMath.$tryMod(a, b), [true, a.mod(b)]); }); }); @@ -162,7 +162,7 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('0'); - expectStruct(await this.safeMath.$tryMod(a, b), [ false, '0' ]); + expectStruct(await this.safeMath.$tryMod(a, b), [false, '0']); }); }); }); @@ -299,8 +299,9 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('1234'); - expect(await this.safeMath.methods['$sub(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.sub(b)); + expect( + await this.safeMath.methods['$sub(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.sub(b)); }); it('reverts if subtraction result would be negative', async function () { @@ -319,24 +320,27 @@ contract('SafeMath', function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.div(b)); + expect( + await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.div(b)); }); it('divides zero correctly', async function () { const a = new BN('0'); const b = new BN('5678'); - expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal('0'); + expect( + await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal('0'); }); it('returns complete number result on non-even division', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal('1'); + expect( + await this.safeMath.methods['$div(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal('1'); }); it('reverts on division by zero', async function () { @@ -356,32 +360,36 @@ contract('SafeMath', function () { const a = new BN('284'); const b = new BN('5678'); - expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.mod(b)); + expect( + await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is equal to the divisor', async function () { const a = new BN('5678'); const b = new BN('5678'); - expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.mod(b)); + expect( + await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is larger than the divisor', async function () { const a = new BN('7000'); const b = new BN('5678'); - expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.mod(b)); + expect( + await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.mod(b)); }); it('when the dividend is a multiple of the divisor', async function () { const a = new BN('17034'); // 17034 == 5678 * 3 const b = new BN('5678'); - expect(await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage')) - .to.be.bignumber.equal(a.mod(b)); + expect( + await this.safeMath.methods['$mod(uint256,uint256,string)'](a, b, 'MyErrorMessage'), + ).to.be.bignumber.equal(a.mod(b)); }); }); diff --git a/test/utils/math/SignedMath.test.js b/test/utils/math/SignedMath.test.js index bbf492b20..c014e22ba 100644 --- a/test/utils/math/SignedMath.test.js +++ b/test/utils/math/SignedMath.test.js @@ -33,7 +33,7 @@ contract('SignedMath', function () { }); describe('average', function () { - function bnAverage (a, b) { + function bnAverage(a, b) { return a.add(b).divn(2); } @@ -68,8 +68,10 @@ contract('SignedMath', function () { for (const x of valuesX) { for (const y of valuesY) { - expect(await this.math.$average(x, y)) - .to.be.bignumber.equal(bnAverage(x, y), `Bad result for average(${x}, ${y})`); + expect(await this.math.$average(x, y)).to.be.bignumber.equal( + bnAverage(x, y), + `Bad result for average(${x}, ${y})`, + ); } } }); diff --git a/test/utils/math/SignedSafeMath.test.js b/test/utils/math/SignedSafeMath.test.js index 5702a4330..3b6530cf5 100644 --- a/test/utils/math/SignedSafeMath.test.js +++ b/test/utils/math/SignedSafeMath.test.js @@ -10,12 +10,12 @@ contract('SignedSafeMath', function () { this.safeMath = await SignedSafeMath.new(); }); - async function testCommutative (fn, lhs, rhs, expected) { + async function testCommutative(fn, lhs, rhs, expected) { expect(await fn(lhs, rhs)).to.be.bignumber.equal(expected); expect(await fn(rhs, lhs)).to.be.bignumber.equal(expected); } - async function testFailsCommutative (fn, lhs, rhs) { + async function testFailsCommutative(fn, lhs, rhs) { await expectRevert.unspecified(fn(lhs, rhs)); await expectRevert.unspecified(fn(rhs, lhs)); } diff --git a/test/utils/structs/DoubleEndedQueue.test.js b/test/utils/structs/DoubleEndedQueue.test.js index 8900663d8..2fbb8dc25 100644 --- a/test/utils/structs/DoubleEndedQueue.test.js +++ b/test/utils/structs/DoubleEndedQueue.test.js @@ -4,9 +4,14 @@ const { expectRevertCustomError } = require('../../helpers/customError'); const DoubleEndedQueue = artifacts.require('$DoubleEndedQueue'); /** Rebuild the content of the deque as a JS array. */ -const getContent = (deque) => deque.$length(0).then(bn => - Promise.all(Array(bn.toNumber()).fill().map((_, i) => deque.$at(0, i))), -); +const getContent = deque => + deque.$length(0).then(bn => + Promise.all( + Array(bn.toNumber()) + .fill() + .map((_, i) => deque.$at(0, i)), + ), + ); contract('DoubleEndedQueue', function () { const bytesA = '0xdeadbeef'.padEnd(66, '0'); @@ -37,7 +42,7 @@ contract('DoubleEndedQueue', function () { await this.deque.$pushBack(0, bytesB); await this.deque.$pushFront(0, bytesA); await this.deque.$pushBack(0, bytesC); - this.content = [ bytesA, bytesB, bytesC ]; + this.content = [bytesA, bytesB, bytesC]; }); it('getters', async function () { diff --git a/test/utils/structs/EnumerableMap.behavior.js b/test/utils/structs/EnumerableMap.behavior.js index 25ae84215..b4b5ee372 100644 --- a/test/utils/structs/EnumerableMap.behavior.js +++ b/test/utils/structs/EnumerableMap.behavior.js @@ -3,46 +3,39 @@ const { expect } = require('chai'); const zip = require('lodash.zip'); -function shouldBehaveLikeMap ( - keys, - values, - zeroValue, - methods, - events, -) { - const [ keyA, keyB, keyC ] = keys; - const [ valueA, valueB, valueC ] = values; +function shouldBehaveLikeMap(keys, values, zeroValue, methods, events) { + const [keyA, keyB, keyC] = keys; + const [valueA, valueB, valueC] = values; - async function expectMembersMatch (map, keys, values) { + async function expectMembersMatch(map, keys, values) { expect(keys.length).to.equal(values.length); - await Promise.all(keys.map(async key => - expect(await methods.contains(map, key)).to.equal(true), - )); + await Promise.all(keys.map(async key => expect(await methods.contains(map, key)).to.equal(true))); expect(await methods.length(map)).to.bignumber.equal(keys.length.toString()); - expect( - (await Promise.all(keys.map(key => methods.get(map, key)))).map(k => k.toString()), - ).to.have.same.members( + expect((await Promise.all(keys.map(key => methods.get(map, key)))).map(k => k.toString())).to.have.same.members( values.map(value => value.toString()), ); // To compare key-value pairs, we zip keys and values, and convert BNs to // strings to workaround Chai limitations when dealing with nested arrays - expect(await Promise.all([...Array(keys.length).keys()].map(async (index) => { - const entry = await methods.at(map, index); - return [ entry[0].toString(), entry[1].toString() ]; - }))).to.have.same.deep.members( - zip(keys.map(k => k.toString()), values.map(v => v.toString())), + expect( + await Promise.all( + [...Array(keys.length).keys()].map(async index => { + const entry = await methods.at(map, index); + return [entry[0].toString(), entry[1].toString()]; + }), + ), + ).to.have.same.deep.members( + zip( + keys.map(k => k.toString()), + values.map(v => v.toString()), + ), ); // This also checks that both arrays have the same length - expect( - (await methods.keys(map)).map(k => k.toString()), - ).to.have.same.members( - keys.map(key => key.toString()), - ); + expect((await methods.keys(map)).map(k => k.toString())).to.have.same.members(keys.map(key => key.toString())); } it('starts empty', async function () { @@ -154,29 +147,21 @@ function shouldBehaveLikeMap ( describe('get', function () { it('existing value', async function () { - expect( - await methods.get(this.map, keyA).then(r => r.toString()), - ).to.be.equal(valueA.toString()); + expect(await methods.get(this.map, keyA).then(r => r.toString())).to.be.equal(valueA.toString()); }); it('missing value', async function () { - await expectRevert( - methods.get(this.map, keyB), - 'EnumerableMap: nonexistent key', - ); + await expectRevert(methods.get(this.map, keyB), 'EnumerableMap: nonexistent key'); }); }); describe('get with message', function () { it('existing value', async function () { - expect( - await methods.getWithMessage(this.map, keyA, 'custom error string').then(r => r.toString()), - ).to.be.equal(valueA.toString()); + expect(await methods.getWithMessage(this.map, keyA, 'custom error string').then(r => r.toString())).to.be.equal( + valueA.toString(), + ); }); it('missing value', async function () { - await expectRevert( - methods.getWithMessage(this.map, keyB, 'custom error string'), - 'custom error string', - ); + await expectRevert(methods.getWithMessage(this.map, keyB, 'custom error string'), 'custom error string'); }); }); diff --git a/test/utils/structs/EnumerableMap.test.js b/test/utils/structs/EnumerableMap.test.js index 14f31b429..548e73775 100644 --- a/test/utils/structs/EnumerableMap.test.js +++ b/test/utils/structs/EnumerableMap.test.js @@ -5,12 +5,17 @@ const EnumerableMap = artifacts.require('$EnumerableMap'); const { shouldBehaveLikeMap } = require('./EnumerableMap.behavior'); -const getMethods = (ms) => { - return mapValues(ms, m => (self, ...args) => self.methods[m](0, ...args)); +const getMethods = ms => { + return mapValues( + ms, + m => + (self, ...args) => + self.methods[m](0, ...args), + ); }; contract('EnumerableMap', function (accounts) { - const [ accountA, accountB, accountC ] = accounts; + const [accountA, accountB, accountC] = accounts; const keyA = new BN('7891'); const keyB = new BN('451'); @@ -27,8 +32,8 @@ contract('EnumerableMap', function (accounts) { // AddressToUintMap describe('AddressToUintMap', function () { shouldBehaveLikeMap( - [ accountA, accountB, accountC ], - [ keyA, keyB, keyC ], + [accountA, accountB, accountC], + [keyA, keyB, keyC], new BN('0'), getMethods({ set: '$set(uint256,address,uint256)', @@ -51,8 +56,8 @@ contract('EnumerableMap', function (accounts) { // UintToAddressMap describe('UintToAddressMap', function () { shouldBehaveLikeMap( - [ keyA, keyB, keyC ], - [ accountA, accountB, accountC ], + [keyA, keyB, keyC], + [accountA, accountB, accountC], constants.ZERO_ADDRESS, getMethods({ set: '$set(uint256,uint256,address)', @@ -75,8 +80,8 @@ contract('EnumerableMap', function (accounts) { // Bytes32ToBytes32Map describe('Bytes32ToBytes32Map', function () { shouldBehaveLikeMap( - [ keyA, keyB, keyC ].map(k => '0x' + k.toString(16).padEnd(64, '0')), - [ bytesA, bytesB, bytesC ], + [keyA, keyB, keyC].map(k => '0x' + k.toString(16).padEnd(64, '0')), + [bytesA, bytesB, bytesC], constants.ZERO_BYTES32, getMethods({ set: '$set(uint256,bytes32,bytes32)', @@ -99,8 +104,8 @@ contract('EnumerableMap', function (accounts) { // UintToUintMap describe('UintToUintMap', function () { shouldBehaveLikeMap( - [ keyA, keyB, keyC ], - [ keyA, keyB, keyC ].map(k => k.add(new BN('1332'))), + [keyA, keyB, keyC], + [keyA, keyB, keyC].map(k => k.add(new BN('1332'))), new BN('0'), getMethods({ set: '$set(uint256,uint256,uint256)', @@ -123,8 +128,8 @@ contract('EnumerableMap', function (accounts) { // Bytes32ToUintMap describe('Bytes32ToUintMap', function () { shouldBehaveLikeMap( - [ bytesA, bytesB, bytesC ], - [ keyA, keyB, keyC ], + [bytesA, bytesB, bytesC], + [keyA, keyB, keyC], new BN('0'), getMethods({ set: '$set(uint256,bytes32,uint256)', diff --git a/test/utils/structs/EnumerableSet.behavior.js b/test/utils/structs/EnumerableSet.behavior.js index db56a2eca..f80eb8169 100644 --- a/test/utils/structs/EnumerableSet.behavior.js +++ b/test/utils/structs/EnumerableSet.behavior.js @@ -1,14 +1,10 @@ const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -function shouldBehaveLikeSet ( - values, - methods, - events, -) { - const [ valueA, valueB, valueC ] = values; +function shouldBehaveLikeSet(values, methods, events) { + const [valueA, valueB, valueC] = values; - async function expectMembersMatch (set, values) { + async function expectMembersMatch(set, values) { const contains = await Promise.all(values.map(value => methods.contains(set, value))); expect(contains.every(Boolean)).to.be.equal(true); @@ -17,19 +13,15 @@ function shouldBehaveLikeSet ( // To compare values we convert to strings to workaround Chai // limitations when dealing with nested arrays (required for BNs) - const indexedValues = await Promise.all(Array(values.length).fill().map((_, index) => methods.at(set, index))); - expect( - indexedValues.map(v => v.toString()), - ).to.have.same.members( - values.map(v => v.toString()), + const indexedValues = await Promise.all( + Array(values.length) + .fill() + .map((_, index) => methods.at(set, index)), ); + expect(indexedValues.map(v => v.toString())).to.have.same.members(values.map(v => v.toString())); const returnedValues = await methods.values(set); - expect( - returnedValues.map(v => v.toString()), - ).to.have.same.members( - values.map(v => v.toString()), - ); + expect(returnedValues.map(v => v.toString())).to.have.same.members(values.map(v => v.toString())); } it('starts empty', async function () { diff --git a/test/utils/structs/EnumerableSet.test.js b/test/utils/structs/EnumerableSet.test.js index 27f1c731e..862cb6d9e 100644 --- a/test/utils/structs/EnumerableSet.test.js +++ b/test/utils/structs/EnumerableSet.test.js @@ -3,8 +3,13 @@ const { mapValues } = require('../../helpers/map-values'); const { shouldBehaveLikeSet } = require('./EnumerableSet.behavior'); -const getMethods = (ms) => { - return mapValues(ms, m => (self, ...args) => self.methods[m](0, ...args)); +const getMethods = ms => { + return mapValues( + ms, + m => + (self, ...args) => + self.methods[m](0, ...args), + ); }; contract('EnumerableSet', function (accounts) { @@ -15,7 +20,7 @@ contract('EnumerableSet', function (accounts) { // Bytes32Set describe('EnumerableBytes32Set', function () { shouldBehaveLikeSet( - [ '0xdeadbeef', '0x0123456789', '0x42424242' ].map(e => e.padEnd(66, '0')), + ['0xdeadbeef', '0x0123456789', '0x42424242'].map(e => e.padEnd(66, '0')), getMethods({ add: '$add(uint256,bytes32)', remove: '$remove(uint256,bytes32)', @@ -53,7 +58,7 @@ contract('EnumerableSet', function (accounts) { // UintSet describe('EnumerableUintSet', function () { shouldBehaveLikeSet( - [ 1234, 5678, 9101112 ].map(e => web3.utils.toBN(e)), + [1234, 5678, 9101112].map(e => web3.utils.toBN(e)), getMethods({ add: '$add(uint256,uint256)', remove: '$remove(uint256,uint256)', From d59306bd06a241083841c2e4a39db08e1f3722cc Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 6 Jan 2023 10:09:02 -0300 Subject: [PATCH 116/197] Improve ERC20.decimals documentation (#3933) --- contracts/token/ERC20/ERC20.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/token/ERC20/ERC20.sol b/contracts/token/ERC20/ERC20.sol index dfca5a79b..7c53c6962 100644 --- a/contracts/token/ERC20/ERC20.sol +++ b/contracts/token/ERC20/ERC20.sol @@ -18,6 +18,9 @@ import "../../utils/Context.sol"; * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 @@ -45,9 +48,6 @@ contract ERC20 is Context, IERC20, IERC20Metadata { /** * @dev Sets the values for {name} and {symbol}. * - * The default value of {decimals} is 18. To select a different value for - * {decimals} you should overload it. - * * All two of these values are immutable: they can only be set once during * construction. */ @@ -77,8 +77,8 @@ contract ERC20 is Context, IERC20, IERC20Metadata { * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between - * Ether and Wei. This is the value {ERC20} uses, unless this function is - * overridden; + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including From 86de1e8b6c3fa6b4efa4a5435869d2521be0f5f5 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 12 Jan 2023 05:50:06 -0300 Subject: [PATCH 117/197] Pin Slither to 0.9.1 (#3949) --- .github/workflows/checks.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 81b0b8f46..ae660661e 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -78,6 +78,8 @@ jobs: uses: ./.github/actions/setup - run: rm foundry.toml - uses: crytic/slither-action@v0.2.0 + with: + slither-version: 0.9.1 codespell: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' From 5dbde1a5c954a79338959d4eb9c7e716a217d6a1 Mon Sep 17 00:00:00 2001 From: Owen Date: Thu, 12 Jan 2023 05:43:29 -0800 Subject: [PATCH 118/197] Fix governance tutorial contract (#3948) Co-authored-by: Francisco Giordano Co-authored-by: Hadrien Croubois --- docs/modules/ROOT/pages/governance.adoc | 28 +++++-------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index 00a997db5..aa27c0ba8 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -145,11 +145,11 @@ We can optionally set a proposal threshold as well. This restricts proposal crea // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; -import "./governance/Governor.sol"; -import "./governance/compatibility/GovernorCompatibilityBravo.sol"; -import "./governance/extensions/GovernorVotes.sol"; -import "./governance/extensions/GovernorVotesQuorumFraction.sol"; -import "./governance/extensions/GovernorTimelockControl.sol"; +import "@openzeppelin/contracts/governance/Governor.sol"; +import "@openzeppelin/contracts/governance/compatibility/GovernorCompatibilityBravo.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { constructor(IVotes _token, TimelockController _timelock) @@ -173,24 +173,6 @@ contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, Gove // The functions below are overrides required by Solidity. - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function getVotes(address account, uint256 blockNumber) - public - view - override(IGovernor, GovernorVotes) - returns (uint256) - { - return super.getVotes(account, blockNumber); - } - function state(uint256 proposalId) public view From 6b17b334300f8268acdfc88b77b87395f6aa5174 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 12 Jan 2023 16:33:15 +0100 Subject: [PATCH 119/197] Use a staticcall to fetch ERC20.decimals in ERC4626 (#3943) Co-authored-by: Francisco --- CHANGELOG.md | 4 ++++ contracts/token/ERC20/extensions/ERC4626.sol | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f6a9be40..eb23ca8ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ * `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) +## 4.8.1 + + * `ERC4626`: Use staticcall instead of call when fetching underlying ERC-20 decimals. ([#3943](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3943)) + ## 4.8.0 (2022-11-08) * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 9b26aefeb..663377dad 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -45,8 +45,8 @@ abstract contract ERC4626 is ERC20, IERC4626 { /** * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way. */ - function _tryGetAssetDecimals(IERC20 asset_) private returns (bool, uint8) { - (bool success, bytes memory encodedDecimals) = address(asset_).call( + function _tryGetAssetDecimals(IERC20 asset_) private view returns (bool, uint8) { + (bool success, bytes memory encodedDecimals) = address(asset_).staticcall( abi.encodeWithSelector(IERC20Metadata.decimals.selector) ); if (success && encodedDecimals.length >= 32) { From 42fab12584d2f446b7e013dd9f1cf260e5a9d747 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 12 Jan 2023 17:43:43 -0300 Subject: [PATCH 120/197] Remove unnecessary CI cache --- .github/actions/setup/action.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 9e562eb71..680fba0c6 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -6,14 +6,13 @@ runs: - uses: actions/setup-node@v3 with: node-version: 14.x - cache: npm - uses: actions/cache@v3 id: cache with: path: '**/node_modules' key: npm-v3-${{ hashFiles('**/package-lock.json') }} - name: Install dependencies - run: npm ci --prefer-offline + run: npm ci shell: bash if: steps.cache.outputs.cache-hit != 'true' env: From ac30219a6a0eb9f98798da39ddef7fe554e43616 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 12 Jan 2023 20:55:53 -0300 Subject: [PATCH 121/197] Add explicit permissions to docs workflow --- .github/workflows/docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 526fe608c..4b54ea6ee 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,6 +4,9 @@ on: push: branches: [release-v*] +permissions: + contents: write + jobs: build: runs-on: ubuntu-latest From 717fbc45cbc05a034fd98050e6537499a81a25fb Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 13 Jan 2023 07:17:38 -0300 Subject: [PATCH 122/197] Add docs on non-stability of internal function use (#3952) --- docs/modules/ROOT/pages/extending-contracts.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index 6ae68a858..7330fc997 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -126,4 +126,6 @@ That's it! Enjoy simpler code using hooks! The maintainers of OpenZeppelin Contracts are mainly concerned with the correctness and security of the code as published in the library, and the combinations of base contracts with the official extensions from the library. -Custom overrides, and those of hooks in particular, may break some important assumptions and introduce vulnerabilities in otherwise secure code. While we try to ensure the contracts remain secure in the face of a wide range of potential customizations, this is done in a best-effort manner. Similarly, while we try to document all important assumptions, this should not be relied upon. Custom overrides should be carefully reviewed and checked against the source code of the contract they are customizing so as to fully understand their impact and guarantee their security. +Custom overrides, and those of hooks in particular, may break some important assumptions and introduce vulnerabilities in otherwise secure code. While we try to ensure the contracts remain secure in the face of a wide range of potential customizations, this is done in a best-effort manner. While we try to document all important assumptions, this should not be relied upon. Custom overrides should be carefully reviewed and checked against the source code of the contract they are customizing so as to fully understand their impact and guarantee their security. + +The way functions interact internally should not be assumed to stay stable across releases of the library. For example, a function that is used in one context in a particular release may not be used in the same context in the next release. Contracts that override functions should revalidate their assumptions when updating the version of OpenZeppelin Contracts they are built on. From d89e51ac4249eb6ff31451aa191fabc73954d638 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 13 Jan 2023 11:05:13 -0300 Subject: [PATCH 123/197] Use actionlint on GitHub Actions workflows (#3953) --- .github/workflows/actionlint.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/actionlint.yml diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml new file mode 100644 index 000000000..8193109cf --- /dev/null +++ b/.github/workflows/actionlint.yml @@ -0,0 +1,18 @@ +name: lint workflows + +on: + pull_request: + paths: + - '.github/**/*.ya?ml' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Add problem matchers + run: | + # https://github.com/rhysd/actionlint/blob/3a2f2c7/docs/usage.md#problem-matchers + curl -LO https://raw.githubusercontent.com/rhysd/actionlint/main/.github/actionlint-matcher.json + echo "::add-matcher::actionlint-matcher.json" + - uses: docker://rhysd/actionlint:latest From a5af0adce4276cc0931083d612e31c7319a78a1d Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 13 Jan 2023 11:29:53 -0600 Subject: [PATCH 124/197] Ignore reentrancy in`executeBatch` and update Slither config (#3955) Co-authored-by: Francisco --- .github/workflows/checks.yml | 3 --- contracts/governance/TimelockController.sol | 3 +++ slither.config.json | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ae660661e..4e92c1043 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,10 +76,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup - - run: rm foundry.toml - uses: crytic/slither-action@v0.2.0 - with: - slither-version: 0.9.1 codespell: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index da7143499..dac55d858 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -311,6 +311,9 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver * * - the caller must have the 'executor' role. */ + // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending, + // thus any modifications to the operation during reentrancy should be caught. + // slither-disable-next-line reentrancy-eth function executeBatch( address[] calldata targets, uint256[] calldata values, diff --git a/slither.config.json b/slither.config.json index e52e3f5d5..2b618794a 100644 --- a/slither.config.json +++ b/slither.config.json @@ -1,4 +1,5 @@ { "detectors_to_run": "reentrancy-eth,reentrancy-no-eth,reentrancy-unlimited-gas", - "filter_paths": "contracts/mocks" + "filter_paths": "contracts/mocks", + "compile_force_framework": "hardhat" } \ No newline at end of file From 785f65183c3ca6826cb0d4c160f65f4f92e33460 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Fri, 13 Jan 2023 21:23:05 +0100 Subject: [PATCH 125/197] Fix wrong PR `CHANGELOG` link (#3957) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb23ca8ec..df75069f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) - * `MerkleProof`: optimize by using unchecked arithmetic. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) + * `MerkleProof`: optimize by using unchecked arithmetic. ([#3869](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3869)) * `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) ### Deprecations From 18691d1a6f56dd906c175072a97dc5ed93ab968c Mon Sep 17 00:00:00 2001 From: JulissaDantes Date: Mon, 16 Jan 2023 14:04:03 -0500 Subject: [PATCH 126/197] Show if event parameter is indexed in docs (#3958) Co-authored-by: Francisco --- docs/templates/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/templates/helpers.js b/docs/templates/helpers.js index 0d587caa8..65f168eba 100644 --- a/docs/templates/helpers.js +++ b/docs/templates/helpers.js @@ -9,7 +9,7 @@ module.exports['readme-path'] = opts => { module.exports.names = params => params.map(p => p.name).join(', '); module.exports['typed-params'] = params => { - return params.map(p => `${p.type}${p.name ? ' ' + p.name : ''}`).join(', '); + return params?.map(p => `${p.type}${p.indexed ? ' indexed' : ''}${p.name ? ' ' + p.name : ''}`).join(', '); }; const slug = (module.exports.slug = str => { From 88a64a802e70976fe845370404e4eb4a47ab556d Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 17 Jan 2023 23:44:56 -0300 Subject: [PATCH 127/197] Update guidelines and project documentation (#3966) Co-authored-by: Hadrien Croubois --- .github/workflows/checks.yml | 2 +- CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 66 ++++---------- GUIDELINES.md | 138 ++++++++++++++--------------- LICENSE | 2 +- README.md | 24 +++-- SECURITY.md | 44 ++++++--- {audit => audits}/2017-03.md | 2 +- {audit => audits}/2018-10.pdf | Bin audits/2022-10-Checkpoints.pdf | Bin 0 -> 155606 bytes audits/2022-10-ERC4626.pdf | Bin 0 -> 204184 bytes audits/README.md | 15 ++++ certora/reports/2021-10.pdf | Bin 0 -> 92882 bytes certora/reports/2022-03.pdf | Bin 0 -> 199401 bytes certora/reports/2022-05.pdf | Bin 0 -> 132223 bytes DOCUMENTATION.md => docs/README.md | 0 16 files changed, 153 insertions(+), 142 deletions(-) rename {audit => audits}/2017-03.md (98%) rename {audit => audits}/2018-10.pdf (100%) create mode 100644 audits/2022-10-Checkpoints.pdf create mode 100644 audits/2022-10-ERC4626.pdf create mode 100644 audits/README.md create mode 100644 certora/reports/2021-10.pdf create mode 100644 certora/reports/2022-03.pdf create mode 100644 certora/reports/2022-05.pdf rename DOCUMENTATION.md => docs/README.md (100%) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4e92c1043..2fba4415b 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -87,4 +87,4 @@ jobs: uses: codespell-project/actions-codespell@v1.0 with: check_filenames: true - skip: package-lock.json + skip: package-lock.json,*.pdf diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 86c0474cb..cd7770dac 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at maintainers@openzeppelin.org. All +reported by contacting the project team at contact@openzeppelin.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 501284773..ecbc2d400 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,64 +1,34 @@ -Contributing to OpenZeppelin Contracts -======= +# Contributing Guidelines -We really appreciate and value contributions to OpenZeppelin Contracts. Please take 5' to review the items listed below to make sure that your contributions are merged as soon as possible. +There are many ways to contribute to OpenZeppelin Contracts. -## Contribution guidelines +## Troubleshooting -Smart contracts manage value and are highly vulnerable to errors and attacks. We have very strict [guidelines], please make sure to review them! +You can help other users in the community to solve their smart contract issues in the [OpenZeppelin Forum]. -## Creating Pull Requests (PRs) +[OpenZeppelin Forum]: https://forum.openzeppelin.com/ -As a contributor, you are expected to fork this repository, work on your own fork and then submit pull requests. The pull requests will be reviewed and eventually merged into the main repo. See ["Fork-a-Repo"](https://help.github.com/articles/fork-a-repo/) for how this works. +## Opening an issue -## A typical workflow +You can [open an issue] to suggest a feature or report a minor bug. For serious bugs please do not open an issue, instead refer to our [security policy] for appropriate steps. -1) Make sure your fork is up to date with the main repository: +If you believe your issue may be due to user error and not a problem in the library, consider instead posting a question on the [OpenZeppelin Forum]. -``` -cd openzeppelin-contracts -git remote add upstream https://github.com/OpenZeppelin/openzeppelin-contracts.git -git fetch upstream -git pull --rebase upstream master -``` -NOTE: The directory `openzeppelin-contracts` represents your fork's local copy. +Before opening an issue, be sure to search through the existing open and closed issues, and consider posting a comment in one of those instead. -2) Branch out from `master` into `fix/some-bug-#123`: -(Postfixing #123 will associate your PR with the issue #123 and make everyone's life easier =D) -``` -git checkout -b fix/some-bug-#123 -``` +When requesting a new feature, include as many details as you can, especially around the use cases that motivate it. Features are prioritized according to the impact they may have on the ecosystem, so we appreciate information showing that the impact could be high. -3) Make your changes, add your files, commit, and push to your fork. +[security policy]: https://github.com/OpenZeppelin/openzeppelin-contracts/security +[open an issue]: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/new/choose -``` -git add SomeFile.js -git commit "Fix some bug #123" -git push origin fix/some-bug-#123 -``` +## Submitting a pull request -4) Run tests, linter, etc. This can be done by running local continuous integration and make sure it passes. +If you would like to contribute code or documentation you may do so by forking the repository and submitting a pull request. -```bash -npm test -npm run lint -``` +Any non-trivial code contribution must be first discussed with the maintainers in an issue (see [Opening an issue](#opening-an-issue)). Only very minor changes are accepted without prior discussion. -5) Go to [github.com/OpenZeppelin/openzeppelin-contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) in your web browser and issue a new pull request. +Make sure to read and follow the [engineering guidelines](./GUIDELINES.md). Run linter and tests to make sure your pull request is good before submitting it. -*IMPORTANT* Read the PR template very carefully and make sure to follow all the instructions. These instructions -refer to some very important conditions that your PR must meet in order to be accepted, such as making sure that all tests pass, JS linting tests pass, Solidity linting tests pass, etc. +When opening the pull request you will be presented with a template and a series of instructions. Read through it carefully and follow all the steps. Expect a review and feedback from the maintainers afterwards. -6) Maintainers will review your code and possibly ask for changes before your code is pulled in to the main repository. We'll check that all tests pass, review the coding style, and check for general code correctness. If everything is OK, we'll merge your pull request and your code will be part of OpenZeppelin Contracts. - -*IMPORTANT* Please pay attention to the maintainer's feedback, since it's a necessary step to keep up with the standards OpenZeppelin Contracts attains to. - -## All set! - -If you have any questions, feel free to post them to github.com/OpenZeppelin/openzeppelin-contracts/issues. - -Finally, if you're looking to collaborate and want to find easy tasks to start, look at the issues we marked as ["Good first issue"](https://github.com/OpenZeppelin/openzeppelin-contracts/labels/good%20first%20issue). - -Thanks for your time and code! - -[guidelines]: GUIDELINES.md +If you're looking for a good place to start, look for issues labelled ["good first issue"](https://github.com/OpenZeppelin/openzeppelin-contracts/labels/good%20first%20issue)! diff --git a/GUIDELINES.md b/GUIDELINES.md index 97067500f..cdeddb90c 100644 --- a/GUIDELINES.md +++ b/GUIDELINES.md @@ -1,105 +1,103 @@ -Design Guidelines -======= +# Engineering Guidelines -These are some global design goals in OpenZeppelin Contracts. +## Testing -#### D0 - Security in Depth -We strive to provide secure, tested, audited code. To achieve this, we need to match intention with function. Thus, documentation, code clarity, community review and security discussions are fundamental. +Code must be thoroughly tested with quality unit tests. -#### D1 - Simple and Modular -Simpler code means easier audits, and better understanding of what each component does. We look for small files, small contracts, and small functions. If you can separate a contract into two independent functionalities you should probably do it. +We defer to the [Moloch Testing Guide](https://github.com/MolochVentures/moloch/tree/master/test#readme) for specific recommendations, though not all of it is relevant here. Note the introduction: -#### D2 - Naming Matters +> Tests should be written, not only to verify correctness of the target code, but to be comprehensively reviewed by other programmers. Therefore, for mission critical Solidity code, the quality of the tests are just as important (if not more so) than the code itself, and should be written with the highest standards of clarity and elegance. -We take our time with picking names. Code is going to be written once, and read hundreds of times. Renaming for clarity is encouraged. +Every addition or change to the code must come with relevant and comprehensive tests. -#### D3 - Tests +Refactors should avoid simultaneous changes to tests. -Write tests for all your code. We encourage Test Driven Development so we know when our code is right. Even though not all code in the repository is tested at the moment, we aim to test every line of code in the future. +Flaky tests are not acceptable. -#### D4 - Check preconditions and post-conditions +The test suite should run automatically for every change in the repository, and in pull requests tests must pass before merging. -A very important way to prevent vulnerabilities is to catch a contract’s inconsistent state as early as possible. This is why we want functions to check pre- and post-conditions for executing its logic. When writing code, ask yourself what you are expecting to be true before and after the function runs, and express it in code. +The test suite coverage must be kept as close to 100% as possible, enforced in pull requests. -#### D5 - Code Consistency +In some cases unit tests may be insufficient and complementary techniques should be used: -Consistency on the way classes are used is paramount to an easier understanding of the library. The codebase should be as unified as possible. Read existing code and get inspired before you write your own. Follow the style guidelines. Don’t hesitate to ask for help on how to best write a specific piece of code. +1. Property-based tests (aka. fuzzing) for math-heavy code. +2. Formal verification for state machines. -#### D6 - Regular Audits -Following good programming practices is a way to reduce the risk of vulnerabilities, but professional code audits are still needed. We will perform regular code audits on major releases, and hire security professionals to provide independent review. +## Code style -# Style Guidelines +Solidity code should be written in a consistent format enforced by a linter, following the official [Solidity Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html). See below for further [Solidity Conventions](#solidity-conventions). -The design guidelines have quite a high abstraction level. These style guidelines are more concrete and easier to apply, and also more opinionated. We value clean code and consistency, and those are prerequisites for us to include new code in the repository. Before proposing a change, please read these guidelines and take some time to familiarize yourself with the style of the existing codebase. +The code should be simple and straightforward, prioritizing readability and understandability. Consistency and predictability should be maintained across the codebase. In particular, this applies to naming, which should be systematic, clear, and concise. -## Solidity code +Sometimes these guidelines may be broken if doing so brings significant efficiency gains, but explanatory comments should be added. -In order to be consistent with all the other Solidity projects, we follow the -[official recommendations documented in the Solidity style guide](http://solidity.readthedocs.io/en/latest/style-guide.html). +Modularity should be pursued, but not at the cost of the above priorities. -Any exception or additions specific to our project are documented below. +## Documentation -* Try to avoid acronyms and abbreviations. +For contributors, project guidelines and processes must be documented publicly. + +For users, features must be abundantly documented. Documentation should include answers to common questions, solutions to common problems, and recommendations for critical decisions that the user may face. + +All changes to the core codebase (excluding tests, auxiliary scripts, etc.) must be documented in a changelog, except for purely cosmetic or documentation changes. + +## Peer review + +All changes must be submitted through pull requests and go through peer code review. + +The review must be approached by the reviewer in a similar way as if it was an audit of the code in question (but importantly it is not a substitute for and should not be considered an audit). + +Reviewers should enforce code and project guidelines. + +External contributions must be reviewed separately by multiple maintainers. + +## Automation + +Automation should be used as much as possible to reduce the possibility of human error and forgetfulness. + +Automations that make use of sensitive credentials must use secure secret management, and must be strengthened against attacks such as [those on GitHub Actions worklows](https://github.com/nikitastupin/pwnhub). + +Some other examples of automation are: + +- Looking for common security vulnerabilities or errors in our code (eg. reentrancy analysis). +- Keeping dependencies up to date and monitoring for vulnerable dependencies. + +# Solidity Conventions + +In addition to the official Solidity Style Guide we have a number of other conventions that must be followed. * All state variables should be private. -* Private state variables should have an underscore prefix. + Changes to state should be accompanied by events, and in some cases it is not correct to arbitrarily set state. Encapsulating variables as private and only allowing modification via setters enables us to ensure that events and other rules are followed reliably and prevents this kind of user error. - ``` - contract TestContract { +* Internal or private state variables or functions should have an underscore prefix. + + ``` + contract TestContract { uint256 private _privateVar; uint256 internal _internalVar; - } - ``` - -* Parameters must not be prefixed with an underscore. - - ``` - function test(uint256 testParameter1, uint256 testParameter2) { - ... - } - ``` - -* Internal and private functions should have an underscore prefix. - - ``` - function _testInternal() internal { - ... - } - ``` - - ``` - function _testPrivate() private { - ... - } - ``` + function _testInternal() internal { ... } + function _testPrivate() private { ... } + } + ``` * Events should be emitted immediately after the state change that they - represent, and consequently they should be named in past tense. + represent, and should be named in the past tense. - ``` - function _burn(address who, uint256 value) internal { + ``` + function _burn(address who, uint256 value) internal { super._burn(who, value); emit TokensBurned(who, value); - } - ``` + } + ``` Some standards (e.g. ERC20) use present tense, and in those cases the - standard specification prevails. + standard specification is used. * Interface names should have a capital I prefix. - ``` - interface IERC777 { - ``` + ``` + interface IERC777 { + ``` - -## Tests - -* Tests Must be Written Elegantly - - Tests are a good way to show how to use the library, and maintaining them is extremely necessary. Don't write long tests, write helper functions to make them be as short and concise as possible (they should take just a few lines each), and use good variable names. - -* Tests Must not be Random - - Inputs for tests should not be generated randomly. Accounts used to create test contracts are an exception, those can be random. Also, the type and structure of outputs should be checked. +* Unchecked arithmetic blocks should contain comments explaining why overflow is guaranteed not to happen. If the reason is immediately apparent from the line above the unchecked block, the comment may be omitted. diff --git a/LICENSE b/LICENSE index 4f51be0f0..817249a0c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2022 zOS Global Limited and contributors +Copyright (c) 2016-2023 zOS Global Limited and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.md b/README.md index a30fd6c3f..094637ed6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # OpenZeppelin -[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-blue)](https://docs.openzeppelin.com/contracts) [![NPM Package](https://img.shields.io/npm/v/@openzeppelin/contracts.svg)](https://www.npmjs.org/package/@openzeppelin/contracts) [![Coverage Status](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts/graph/badge.svg)](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts) -[![gitpoap badge](https://public-api.gitpoap.io/v1/repo/OpenZeppelin/openzeppelin-contracts/badge)](https://www.gitpoap.io/gh/OpenZeppelin/openzeppelin-contracts) +[![GitPOAPs](https://public-api.gitpoap.io/v1/repo/OpenZeppelin/openzeppelin-contracts/badge)](https://www.gitpoap.io/gh/OpenZeppelin/openzeppelin-contracts) +[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-yellow)](https://docs.openzeppelin.com/contracts) +[![Forum](https://img.shields.io/badge/forum-%F0%9F%92%AC-yellow)](https://docs.openzeppelin.com/contracts) **A library for secure smart contract development.** Build on a solid foundation of community-vetted code. @@ -19,7 +20,7 @@ ### Installation -```console +``` $ npm install @openzeppelin/contracts ``` @@ -52,7 +53,6 @@ The guides in the [documentation site](https://docs.openzeppelin.com/contracts) * [Access Control](https://docs.openzeppelin.com/contracts/access-control): decide who can perform each of the actions on your system. * [Tokens](https://docs.openzeppelin.com/contracts/tokens): create tradeable assets or collectives, and distribute them via [Crowdsales](https://docs.openzeppelin.com/contracts/crowdsales). -* [Gas Station Network](https://docs.openzeppelin.com/contracts/gsn): let your users interact with your contracts without having to pay for gas themselves. * [Utilities](https://docs.openzeppelin.com/contracts/utilities): generic useful tools including non-overflowing math, signature verification, and trustless paying systems. The [full API](https://docs.openzeppelin.com/contracts/api/token/ERC20) is also thoroughly documented, and serves as a great reference when developing your smart contract application. You can also ask for help or follow Contracts's development in the [community forum](https://forum.openzeppelin.com). @@ -65,15 +65,17 @@ Finally, you may want to take a look at the [guides on our blog](https://blog.op ## Security -This project is maintained by [OpenZeppelin](https://openzeppelin.com), and developed following our high standards for code quality and security. OpenZeppelin Contracts is meant to provide tested and community-audited code, but please use common sense when doing anything that deals with real money! We take no responsibility for your implementation decisions and any security problems you might experience. +This project is maintained by [OpenZeppelin](https://openzeppelin.com) with the goal of providing a secure and reliable library of smart contract components for the ecosystem. We address security through risk management in various areas such as engineering and open source best practices, scoping and API design, multi-layered review processes, and incident response preparedness. -The core development principles and strategies that OpenZeppelin Contracts is based on include: security in depth, simple and modular code, clarity-driven naming conventions, comprehensive unit testing, pre-and-post-condition sanity checks, code consistency, and regular audits. +The security policy is detailed in [`SECURITY.md`](./SECURITY.md), and specifies how you can report security vulnerabilities, which versions will receive security patches, and how to stay informed about them. We run a [bug bounty program on Immunefi](https://immunefi.com/bounty/openzeppelin) to reward the responsible disclosure of vulnerabilities. -The latest audit was done on October 2018 on version 2.0.0. +The engineering guidelines we follow to promote project quality can be found in [`GUIDELINES.md`](./GUIDELINES.md). -We have a [**bug bounty program** on Immunefi](https://www.immunefi.com/bounty/openzeppelin). Please report any security issues you find through the Immunefi dashboard, or reach out to security@openzeppelin.com. +Past audits can be found in [`audits/`](./audits). -Critical bug fixes will be backported to past major releases. +Smart contracts are a nascent techology and carry a high level of technical risk and uncertainty. Although OpenZeppelin is well known for its security audits, using OpenZeppelin Contracts is not a substitute for a security audit. + +OpenZeppelin Contracts is made available under the MIT License, which disclaims all warranties in relation to the project and which limits the liability of those that contribute and maintain the project, including OpenZeppelin. As set out further in the Terms, you acknowledge that you are solely responsible for any use of OpenZeppelin Contracts and you assume all risks associated with any such use. ## Contribute @@ -82,3 +84,7 @@ OpenZeppelin Contracts exists thanks to its contributors. There are many ways yo ## License OpenZeppelin Contracts is released under the [MIT License](LICENSE). + +## Legal + +Your use of this Project is governed by the terms found at www.openzeppelin.com/tos (the "Terms"). diff --git a/SECURITY.md b/SECURITY.md index 98701be69..4d6ff96ed 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,20 +1,42 @@ # Security Policy +Security vulnerabilities should be disclosed to the project maintainers through [Immunefi], or alternatively by email to security@openzeppelin.com. + +[Immunefi]: https://immunefi.com/bounty/openzeppelin + ## Bug Bounty -We have a [**bug bounty program** on Immunefi](https://www.immunefi.com/bounty/openzeppelin). Please report any security issues you find through the Immunefi dashboard, or reach out to security@openzeppelin.com. +Responsible disclosure of security vulnerabilities is rewarded through a bug bounty program on [Immunefi]. -Critical bug fixes will be backported to past major releases. +There is a bonus reward for issues introduced in release candidates that are reported before making it into a stable release. -## Supported Versions +## Security Patches -The recommendation is to use the latest version available. +Security vulnerabilities will be patched as soon as responsibly possible, and published as an advisory on this repository (see [advisories]) and on the affected npm packages. -| Version | Supported | -| ------- | ------------------------------------ | -| 4.x | :white_check_mark::white_check_mark: | -| 3.4 | :white_check_mark: | -| 2.5 | :white_check_mark: | -| < 2.0 | :x: | +[advisories]: https://github.com/OpenZeppelin/openzeppelin-contracts/security/advisories -Note that the Solidity language itself only guarantees security updates for the latest release. +Projects that build on OpenZeppelin Contracts are encouraged to clearly state, in their source code and websites, how to be contacted about security issues in the event that a direct notification is considered necessary. We recommend including it in the NatSpec for the contract as `/// @custom:security-contact security@example.com`. + +Additionally, we recommend installing the library through npm and setting up vulnerability alerts such as [Dependabot]. + +[Dependabot]: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-supply-chain-security#what-is-dependabot + +### Supported Versions + +Security patches will be released for the latest minor of a given major release. For example, if an issue is found in versions >=4.6.0 and the latest is 4.8.0, the patch will be released only in version 4.8.1. + +Only critical severity bug fixes will be backported to past major releases. + +| Version | Critical security fixes | Other security fixes | +| ------- | ----------------------- | -------------------- | +| 4.x | :white_check_mark: | :white_check_mark: | +| 3.4 | :white_check_mark: | :x: | +| 2.5 | :white_check_mark: | :x: | +| < 2.0 | :x: | :x: | + +Note as well that the Solidity language itself only guarantees security updates for the latest release. + +## Legal + +Smart contracts are a nascent techology and carry a high level of technical risk and uncertainty. OpenZeppelin Contracts is made available under the MIT License, which disclaims all warranties in relation to the project and which limits the liability of those that contribute and maintain the project, including OpenZeppelin. Your use of the project is also governed by the terms found at www.openzeppelin.com/tos (the "Terms"). As set out in the Terms, you are solely responsible for any use of OpenZeppelin Contracts and you assume all risks associated with any such use. This Security Policy in no way evidences or represents an on-going duty by any contributor, including OpenZeppelin, to correct any flaws or alert you to all or any of the potential risks of utilizing the project. diff --git a/audit/2017-03.md b/audits/2017-03.md similarity index 98% rename from audit/2017-03.md rename to audits/2017-03.md index 5ca874beb..4cd6dbfd3 100644 --- a/audit/2017-03.md +++ b/audits/2017-03.md @@ -1,6 +1,6 @@ # OpenZeppelin Audit -NOTE ON 2021-07-19: This report makes reference to Zeppelin, OpenZeppelin, OpenZeppelin [C]ontracts, the OpenZeppelin team, and OpenZeppelin library. Many of these things have since been renamed and know that this audit applies to what is currently called the OpenZeppelin Contracts which are maintained by the OpenZeppelin Conracts Community. +NOTE ON 2021-07-19: This report makes reference to Zeppelin, OpenZeppelin, OpenZeppelin Contracts, the OpenZeppelin team, and OpenZeppelin library. Many of these things have since been renamed and know that this audit applies to what is currently called the OpenZeppelin Contracts which are maintained by the OpenZeppelin Contracts Community. March, 2017 Authored by Dennis Peterson and Peter Vessenes diff --git a/audit/2018-10.pdf b/audits/2018-10.pdf similarity index 100% rename from audit/2018-10.pdf rename to audits/2018-10.pdf diff --git a/audits/2022-10-Checkpoints.pdf b/audits/2022-10-Checkpoints.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7e0d08387ad3be0a3e74201566eca3167aead1c2 GIT binary patch literal 155606 zcmcFr2V4}%(iagF6c8myMiCTn7j~CjSjiwDIp-`nrzJ-NK@m8KN|Y=a$r%wzB1!Th zK{ApgXZ!~6PVS!Gd%W-7@8>$rbamCgs=8~sr>lov=8iB30%pgh{~8ybgbSf%rM0?e zip#}?%c9_HZ9vN+qibYfhsz>vqHjm5PKyBQRDOpncLf$SXtUJ0;cJ4M27%U6g?Z z!0*>g*dXj+7=i!A4$yw@;eRm{ z9LWYovi{J~(h6l@2h!CCx-y`pt~ubaBYS_>`R54!irxws7cSq&1xU}>K+nwD3b39X z$lT(@(#TE^;CN{Aqapkk zCH^Yj&fdZTkaF1IXz2f&1}NQo<^~`uLlDr-4*J+(r#^}u|E8tArM(?sY-?K+2cSQJ z4DBuT{^%Y@0p>3ZU`Pa@8WM^;7^<4Ing^r%=->A+bD-hxV_e7yB_e;&Q4dG1E(FYa zSkTj@g&Z_u;s5=PApg;wgPSVS_e_DFen@Eof&-%$!O9AUK_O5!Bn*aN<)DSI9mRnp=^wFZON+bt`1d4;!PZ#keEsozv=+hj z(EIrK<7sT`*kLL}NfZg)7_`m~>>06;Wy9R4i>)VY zH(4oeIP}!Dj4X@Gzp?txb4)&KtBtD#N>J(HH1 zMJb~O&;1_Tp4Tg!W0*J8y;GE*=wQt772`w8^S1dCX&p~3YI>N?Q=>mizv5o?MW7?2fpRQ_nRMMuN+Uc>+eV4mg>VCb_LU3q!TI zlnM=?j9EJ!Et>h(vln(Bf7#uTD4WKJh8y2ho2{F!jbnO?c%RstfH80G5~*Qd%dc@M zc%3$Oufwc^gm{lk?4p&ed}q!F{sjNB>iAHB`#EQBTD*mKu+tK)RY=rkZ-xIxbJ~p! zl~f6x^?le*$ajz6Om=pDhIDgK1nI-R37Ydl&h)|}j}c#3aKf)^E9;^gg?fn#@n5Lr zbkA>>*B523F?)WRRUTW##qt)?8`!4!Agd={q?unoZsCgPZZh9+v$J=1T++)mGVU=S zEtusAwDeG4eDVJBEctR|2dwm45BEFr_mve6^E6+CAzlaL;d|%)J~9r%@$Vz!#}wsY z$k_rh=J#i{q=CMPu7H&j5TXx;790r&L)qbQAU<%gLBJdwNOlAp5GH^L$x&#cJ)EiF zvd9_OS=rm_0Z;YAmXN~RgVyibCnlq8^d*LPGeuZQ0uSM_Vi5RfLD_Dw<;PK%t>3x(0%+x2b;@n ze=^@1KU%W!3HQuR%DFa{#67Ffl7QD6O0m^$uG<6heJ*(G!!v#vG*a5%I`(6~Jp%P0 z)I1z$HfFJHX>GBp!lsHnn`&yyz-`-LcX4Xb;~P

2ojH?x0tMLX1p#1!i~6c>Ik8Oj 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 literal 0 HcmV?d00001 diff --git a/audits/2022-10-ERC4626.pdf b/audits/2022-10-ERC4626.pdf new file mode 100644 index 0000000000000000000000000000000000000000..154fe75212e317a87cfa249b9101a04e789281bd GIT binary patch literal 204184 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 P3ADOAJw3B!^LYOO&o2YP literal 0 HcmV?d00001 diff --git a/audits/README.md b/audits/README.md new file mode 100644 index 000000000..40098a44d --- /dev/null +++ b/audits/README.md @@ -0,0 +1,15 @@ +# Audits + +| Date | Version | Commit | Auditor | Scope | Links | +| ------------ | ------- | --------- | ------------ | -------------------- | ----------------------------------------------------------- | +| October 2022 | v4.8.0 | `14f98db` | OpenZeppelin | ERC4626, Checkpoints | [🔗](./2022-10-ERC4626.pdf) [🔗](./2022-10-Checkpoints.pdf) | +| October 2018 | v2.0.0 | `dac5bcc` | LevelK | Everything | [🔗](./2018-10.pdf) | +| March 2017 | v1.0.4 | `9c5975a` | New Alchemy | Everything | [🔗](./2017-03.md) | + +# Formal Verification + +| Date | Version | Commit | Tool | Scope | Links | +| ------------ | ------- | --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | +| May 2022 | v4.7.0 | `109778c` | Certora | Initializable, GovernorPreventLateQuorum, ERC1155Burnable, ERC1155Pausable, ERC1155Supply, ERC1155Holder, ERC1155Receiver | [🔗](../certora/reports/2022-05.pdf) | +| March 2022 | v4.4.0 | `4088540` | Certora | ERC20Votes, ERC20FlashMint, ERC20Wrapper, TimelockController, ERC721Votes, Votes, AccessControl, ERC1155 | [🔗](../certora/reports/2022-03.pdf) | +| October 2021 | v4.4.0 | `4088540` | Certora | Governor, GovernorCountingSimple, GovernorProposalThreshold, GovernorTimelockControl, GovernorVotes, GovernorVotesQuorumFraction | [🔗](../certora/reports/2021-10.pdf) | diff --git a/certora/reports/2021-10.pdf b/certora/reports/2021-10.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22df9c61e6a9f74b29f90b6e36bd3d04f99756f5 GIT binary patch literal 92882 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 aXJ@ZxYwu)>@+&A9#pUoWT@sTO$NL{da>MEX literal 0 HcmV?d00001 diff --git a/certora/reports/2022-03.pdf b/certora/reports/2022-03.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6ff81d1812c808e2f683c1e5fe10abf71ba5438 GIT binary patch literal 199401 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

E02esqZ$^2gTs{2 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 literal 0 HcmV?d00001 diff --git a/certora/reports/2022-05.pdf b/certora/reports/2022-05.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f24a44910c4fba449300987456b5f440e7f99511 GIT binary patch literal 132223 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%0D7|ieYKPVYBX59b!U}f9eB5UvK%HwkWL{dR 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 UVZ$VVhf9Eu51oMlq$-2{KaJIBBLDyZ literal 0 HcmV?d00001 diff --git a/DOCUMENTATION.md b/docs/README.md similarity index 100% rename from DOCUMENTATION.md rename to docs/README.md From c9bc4f82030d6c9db2149c16636a35178a858a75 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 18 Jan 2023 03:57:14 +0100 Subject: [PATCH 128/197] Make `Ownable2Step.acceptOwnership` virtual (#3960) --- CHANGELOG.md | 1 + contracts/access/Ownable2Step.sol | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df75069f9..5d45e9264 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) * `MerkleProof`: optimize by using unchecked arithmetic. ([#3869](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3869)) * `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) + * `Ownable2Step`: make `acceptOwnership` public virtual to enable usecases that require overriding it. ([#3960](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3960)) ### Deprecations diff --git a/contracts/access/Ownable2Step.sol b/contracts/access/Ownable2Step.sol index 221706300..f5a3d8047 100644 --- a/contracts/access/Ownable2Step.sol +++ b/contracts/access/Ownable2Step.sol @@ -49,7 +49,7 @@ abstract contract Ownable2Step is Ownable { /** * @dev The new owner accepts the ownership transfer. */ - function acceptOwnership() external { + function acceptOwnership() public virtual { address sender = _msgSender(); require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); _transferOwnership(sender); From 74b8ae937239f141a812b1d4dc766c9f90c73596 Mon Sep 17 00:00:00 2001 From: JulissaDantes Date: Wed, 18 Jan 2023 14:40:35 -0500 Subject: [PATCH 129/197] Annotate Multicall contract (#3961) Co-authored-by: Francisco --- CHANGELOG.md | 1 + contracts/utils/Multicall.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d45e9264..420888118 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * `MerkleProof`: optimize by using unchecked arithmetic. ([#3869](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3869)) * `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) * `Ownable2Step`: make `acceptOwnership` public virtual to enable usecases that require overriding it. ([#3960](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3960)) + * `Multicall`: annotate `multicall` function as upgrade safe to not raise a flag for its delegatecall. ([#3961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3961)) ### Deprecations diff --git a/contracts/utils/Multicall.sol b/contracts/utils/Multicall.sol index bdb820139..f79af0906 100644 --- a/contracts/utils/Multicall.sol +++ b/contracts/utils/Multicall.sol @@ -14,6 +14,7 @@ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. */ + /// @custom:oz-upgrades-unsafe-allow delegatecall function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { From f81e5f51c17746f08d3287473acebf9e0f1f7020 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 18 Jan 2023 18:07:13 -0300 Subject: [PATCH 130/197] Use allow-reachable delegatecall in Multicall (#3970) --- contracts/utils/Multicall.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Multicall.sol b/contracts/utils/Multicall.sol index f79af0906..7470c5595 100644 --- a/contracts/utils/Multicall.sol +++ b/contracts/utils/Multicall.sol @@ -13,8 +13,8 @@ import "./Address.sol"; abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. + * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ - /// @custom:oz-upgrades-unsafe-allow delegatecall function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { From 0c89a8b771094828fbeeb84f17b475fe4a2d56f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Wed, 18 Jan 2023 17:34:32 -0600 Subject: [PATCH 131/197] Automate release process via Changesets (#3915) Co-authored-by: Francisco --- .changeset/beige-buses-drop.md | 5 + .changeset/config.json | 12 + .changeset/curvy-shrimps-enjoy.md | 5 + .changeset/curvy-suns-sort.md | 5 + .changeset/famous-rules-burn.md | 5 + .changeset/funny-rockets-compete.md | 5 + .changeset/gold-chicken-clean.md | 5 + .changeset/healthy-squids-stare.md | 5 + .changeset/lemon-dogs-kiss.md | 5 + .changeset/little-kiwis-ring.md | 5 + .changeset/pretty-hornets-play.md | 5 + .changeset/tame-ladybugs-sit.md | 5 + .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/changelog.yml | 28 - .github/workflows/changeset.yml | 26 + .github/workflows/release-cycle.yml | 177 + CHANGELOG.md | 694 ++-- certora/scripts/sanity.sh | 2 +- certora/scripts/verifyAll.sh | 4 +- package-lock.json | 3257 ++++++++++++++++- package.json | 4 + scripts/prepare-docs.sh | 2 +- scripts/release/format-changelog.js | 33 + scripts/release/release.sh | 145 - scripts/release/synchronize-versions.js | 13 +- .../release/update-changelog-release-date.js | 33 - scripts/release/update-comment.js | 2 - scripts/release/version.sh | 6 +- scripts/release/workflow/exit-prerelease.sh | 8 + scripts/release/workflow/github-release.js | 47 + scripts/release/workflow/pack.sh | 25 + .../release/workflow/prepare-release-merge.sh | 24 + scripts/release/workflow/publish.sh | 15 + scripts/release/workflow/rerun.js | 7 + .../workflow/set-changesets-pr-title.js | 17 + scripts/release/workflow/start.sh | 32 + scripts/release/workflow/state.js | 104 + 37 files changed, 4123 insertions(+), 651 deletions(-) create mode 100644 .changeset/beige-buses-drop.md create mode 100644 .changeset/config.json create mode 100644 .changeset/curvy-shrimps-enjoy.md create mode 100644 .changeset/curvy-suns-sort.md create mode 100644 .changeset/famous-rules-burn.md create mode 100644 .changeset/funny-rockets-compete.md create mode 100644 .changeset/gold-chicken-clean.md create mode 100644 .changeset/healthy-squids-stare.md create mode 100644 .changeset/lemon-dogs-kiss.md create mode 100644 .changeset/little-kiwis-ring.md create mode 100644 .changeset/pretty-hornets-play.md create mode 100644 .changeset/tame-ladybugs-sit.md delete mode 100644 .github/workflows/changelog.yml create mode 100644 .github/workflows/changeset.yml create mode 100644 .github/workflows/release-cycle.yml create mode 100755 scripts/release/format-changelog.js delete mode 100755 scripts/release/release.sh delete mode 100755 scripts/release/update-changelog-release-date.js create mode 100644 scripts/release/workflow/exit-prerelease.sh create mode 100644 scripts/release/workflow/github-release.js create mode 100644 scripts/release/workflow/pack.sh create mode 100644 scripts/release/workflow/prepare-release-merge.sh create mode 100644 scripts/release/workflow/publish.sh create mode 100644 scripts/release/workflow/rerun.js create mode 100644 scripts/release/workflow/set-changesets-pr-title.js create mode 100644 scripts/release/workflow/start.sh create mode 100644 scripts/release/workflow/state.js diff --git a/.changeset/beige-buses-drop.md b/.changeset/beige-buses-drop.md new file mode 100644 index 000000000..4566eccb0 --- /dev/null +++ b/.changeset/beige-buses-drop.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 000000000..66794faef --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", + "changelog": [ + "@changesets/changelog-github", + { + "repo": "OpenZeppelin/openzeppelin-contracts" + } + ], + "commit": false, + "access": "public", + "baseBranch": "master" +} diff --git a/.changeset/curvy-shrimps-enjoy.md b/.changeset/curvy-shrimps-enjoy.md new file mode 100644 index 000000000..4bc410abf --- /dev/null +++ b/.changeset/curvy-shrimps-enjoy.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) diff --git a/.changeset/curvy-suns-sort.md b/.changeset/curvy-suns-sort.md new file mode 100644 index 000000000..97b51fed7 --- /dev/null +++ b/.changeset/curvy-suns-sort.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`Ownable2Step`: make `acceptOwnership` public virtual to enable usecases that require overriding it. ([#3960](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3960)) diff --git a/.changeset/famous-rules-burn.md b/.changeset/famous-rules-burn.md new file mode 100644 index 000000000..a746dc21d --- /dev/null +++ b/.changeset/famous-rules-burn.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) diff --git a/.changeset/funny-rockets-compete.md b/.changeset/funny-rockets-compete.md new file mode 100644 index 000000000..a8c77c619 --- /dev/null +++ b/.changeset/funny-rockets-compete.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +Reformatted codebase with latest version of Prettier Solidity. ([#3898](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3898)) diff --git a/.changeset/gold-chicken-clean.md b/.changeset/gold-chicken-clean.md new file mode 100644 index 000000000..0d64fde6d --- /dev/null +++ b/.changeset/gold-chicken-clean.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) diff --git a/.changeset/healthy-squids-stare.md b/.changeset/healthy-squids-stare.md new file mode 100644 index 000000000..fad0872e2 --- /dev/null +++ b/.changeset/healthy-squids-stare.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) diff --git a/.changeset/lemon-dogs-kiss.md b/.changeset/lemon-dogs-kiss.md new file mode 100644 index 000000000..976949d2c --- /dev/null +++ b/.changeset/lemon-dogs-kiss.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) diff --git a/.changeset/little-kiwis-ring.md b/.changeset/little-kiwis-ring.md new file mode 100644 index 000000000..a1cb7bb95 --- /dev/null +++ b/.changeset/little-kiwis-ring.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`Multicall`: annotate `multicall` function as upgrade safe to not raise a flag for its delegatecall. ([#3961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3961)) diff --git a/.changeset/pretty-hornets-play.md b/.changeset/pretty-hornets-play.md new file mode 100644 index 000000000..230a53bb2 --- /dev/null +++ b/.changeset/pretty-hornets-play.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) diff --git a/.changeset/tame-ladybugs-sit.md b/.changeset/tame-ladybugs-sit.md new file mode 100644 index 000000000..8a1e416de --- /dev/null +++ b/.changeset/tame-ladybugs-sit.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`MerkleProof`: optimize by using unchecked arithmetic. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 469c645b4..239451830 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -17,4 +17,4 @@ Fixes #???? - [ ] Tests - [ ] Documentation -- [ ] Changelog entry +- [ ] Changeset entry (run `npx changeset add`) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml deleted file mode 100644 index 9f2503bfd..000000000 --- a/.github/workflows/changelog.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: changelog - -on: - pull_request: - types: - - opened - - synchronize - - labeled - - unlabeled - -concurrency: - group: changelog-${{ github.ref }} - cancel-in-progress: true - -jobs: - check: - runs-on: ubuntu-latest - if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changelog') }} - steps: - - uses: actions/checkout@v3 - - name: Check diff - run: | - git fetch origin ${{ github.base_ref }} --depth=1 - if git diff --exit-code origin/${{ github.base_ref }} -- CHANGELOG.md ; then - echo 'Missing changelog entry' - exit 1 - fi - diff --git a/.github/workflows/changeset.yml b/.github/workflows/changeset.yml new file mode 100644 index 000000000..38fe3f70e --- /dev/null +++ b/.github/workflows/changeset.yml @@ -0,0 +1,26 @@ +name: changeset + +on: + pull_request: + branches: + - master + types: + - opened + - synchronize + - labeled + - unlabeled + +concurrency: + group: changeset-${{ github.ref }} + cancel-in-progress: true + +jobs: + check: + runs-on: ubuntu-latest + if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changeset') }} + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Check changeset + run: npx changeset status --since=${{ github.base_ref }} diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml new file mode 100644 index 000000000..06d12690d --- /dev/null +++ b/.github/workflows/release-cycle.yml @@ -0,0 +1,177 @@ +name: Release Cycle + +on: + push: + branches: + - release-v* + workflow_dispatch: {} + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + state: + name: Check state + permissions: + pull-requests: read + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - id: state + name: Get state + uses: actions/github-script@v6 + env: + TRIGGERING_ACTOR: ${{ github.triggering_actor }} + with: + result-encoding: string + script: await require('./scripts/release/workflow/state.js')({ github, context, core }) + outputs: + # Job Flags + start: ${{ steps.state.outputs.start }} + changesets: ${{ steps.state.outputs.changesets }} + promote: ${{ steps.state.outputs.promote }} + publish: ${{ steps.state.outputs.publish }} + merge: ${{ steps.state.outputs.merge }} + + # Global variables + is_prerelease: ${{ steps.state.outputs.is_prerelease }} + + start: + needs: state + name: Start new release candidate + permissions: + contents: write + actions: write + if: needs.state.outputs.start == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - run: bash scripts/git-user-config.sh + - id: start + name: Create branch with release candidate + run: bash scripts/release/workflow/start.sh + - name: Re-run workflow + uses: actions/github-script@v6 + env: + REF: ${{ steps.start.outputs.branch }} + with: + script: await require('./scripts/release/workflow/rerun.js')({ github, context }) + + promote: + needs: state + name: Promote to final release + permissions: + contents: write + actions: write + if: needs.state.outputs.promote == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - run: bash scripts/git-user-config.sh + - name: Exit prerelease state + if: needs.state.outputs.is_prerelease == 'true' + run: bash scripts/release/workflow/exit-prerelease.sh + - name: Re-run workflow + uses: actions/github-script@v6 + with: + script: await require('./scripts/release/workflow/rerun.js')({ github, context }) + + changesets: + needs: state + name: Changesets PR + permissions: + contents: write + pull-requests: write + if: needs.state.outputs.changesets == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # To get all tags + - name: Set up environment + uses: ./.github/actions/setup + - name: Set release title + uses: actions/github-script@v6 + with: + result-encoding: string + script: await require('./scripts/release/workflow/set-changesets-pr-title.js')({ core }) + - name: Create PR + uses: changesets/action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PRERELEASE: ${{ needs.state.outputs.is_prerelease }} + with: + version: npm run version + title: ${{ env.TITLE }} + commit: ${{ env.TITLE }} + body: | # Wait for support on this https://github.com/changesets/action/pull/250 + This is an automated PR for releasing ${{ github.repository }} + Check [CHANGELOG.md](${{ github.repository }}/CHANGELOG.md) + + publish: + needs: state + name: Publish to npm + environment: npm + permissions: + contents: write + if: needs.state.outputs.publish == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - id: pack + name: Pack + run: bash scripts/release/workflow/pack.sh + env: + PRERELEASE: ${{ needs.state.outputs.is_prerelease }} + - name: Tag + run: npx changeset tag + - name: Publish + run: bash scripts/release/workflow/publish.sh + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + TARBALL: ${{ steps.pack.outputs.tarball }} + TAG: ${{ steps.pack.outputs.tag }} + - name: Push tags + run: git push --tags + - name: Create Github Release + uses: actions/github-script@v6 + env: + PRERELEASE: ${{ needs.state.outputs.is_prerelease }} + with: + script: await require('./scripts/release/workflow/github-release.js')({ github, context }) + + merge: + needs: state + name: Release PR back to master + permissions: + contents: write + pull-requests: write + if: needs.state.outputs.merge == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # All branches + - name: Set up environment + uses: ./.github/actions/setup + - run: bash scripts/git-user-config.sh + - name: Create branch to merge + run: bash scripts/release/workflow/prepare-release-merge.sh + - name: Create PR back to master + uses: actions/github-script@v6 + with: + script: | + await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + head: 'merge/${{ github.ref_name }}', + base: 'master', + title: '${{ format('Merge {0} branch', github.ref_name) }}' + }); diff --git a/CHANGELOG.md b/CHANGELOG.md index 420888118..e60161db0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,66 +1,52 @@ # Changelog -## Unreleased - - * Reformatted codebase with latest version of Prettier Solidity. ([#3898](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3898)) - * `ReentrancyGuard`: Add a `_reentrancyGuardEntered` function to expose the guard status. ([#3714](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3714)) - * `ERC20Votes`: optimize by using unchecked arithmetic. ([#3748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3748)) - * `Initializable`: optimize `_disableInitializers` by using `!=` instead of `<`. ([#3787](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3787)) - * `Math`: optimize `log256` rounding check. ([#3745](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3745)) - * `Strings`: add `equal` method. ([#3774](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3774)) - * `Strings`: add `toString` method for signed integers. ([#3773](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3773)) - * `MerkleProof`: optimize by using unchecked arithmetic. ([#3869](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3869)) - * `EnumerableMap`: add a `keys()` function that returns an array containing all the keys. ([#3920](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3920)) - * `Ownable2Step`: make `acceptOwnership` public virtual to enable usecases that require overriding it. ([#3960](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3960)) - * `Multicall`: annotate `multicall` function as upgrade safe to not raise a flag for its delegatecall. ([#3961](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3961)) - ### Deprecations - * `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) +- `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) -## 4.8.1 +## 4.8.1 (2023-01-12) - * `ERC4626`: Use staticcall instead of call when fetching underlying ERC-20 decimals. ([#3943](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3943)) +- `ERC4626`: Use staticcall instead of call when fetching underlying ERC-20 decimals. ([#3943](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3943)) ## 4.8.0 (2022-11-08) - * `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) - * `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) - * `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) - * `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) - * `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469)) - * `Governor`: make the `relay` function payable, and add support for EOA payments. ([#3730](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3730)) - * `GovernorCompatibilityBravo`: remove unused `using` statements. ([#3506](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3506)) - * `ERC20`: optimize `_transfer`, `_mint` and `_burn` by using `unchecked` arithmetic when possible. ([#3513](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3513)) - * `ERC20Votes`, `ERC721Votes`: optimize `getPastVotes` for looking up recent checkpoints. ([#3673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3673)) - * `ERC20FlashMint`: add an internal `_flashFee` function for overriding. ([#3551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3551)) - * `ERC4626`: use the same `decimals()` as the underlying asset by default (if available). ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639)) - * `ERC4626`: add internal `_initialConvertToShares` and `_initialConvertToAssets` functions to customize empty vaults behavior. ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639)) - * `ERC721`: optimize transfers by making approval clearing implicit instead of emitting an event. ([#3481](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3481)) - * `ERC721`: optimize burn by making approval clearing implicit instead of emitting an event. ([#3538](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3538)) - * `ERC721`: Fix balance accounting when a custom `_beforeTokenTransfer` hook results in a transfer of the token under consideration. ([#3611](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3611)) - * `ERC721`: use unchecked arithmetic for balance updates. ([#3524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3524)) - * `ERC721Consecutive`: Implementation of EIP-2309 that allows batch minting of ERC721 tokens during construction. ([#3311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3311)) - * `ReentrancyGuard`: Reduce code size impact of the modifier by using internal functions. ([#3515](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3515)) - * `SafeCast`: optimize downcasting of signed integers. ([#3565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3565)) - * `ECDSA`: Remove redundant check on the `v` value. ([#3591](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3591)) - * `VestingWallet`: add `releasable` getters. ([#3580](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3580)) - * `VestingWallet`: remove unused library `Math.sol`. ([#3605](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3605)) - * `VestingWallet`: make constructor payable. ([#3665](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3665)) - * `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600)) - * `Clones`: optimized the assembly to use only the scratch space during deployments, and optimized `predictDeterministicAddress` to use fewer operations. ([#3640](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3640)) - * `Checkpoints`: Use procedural generation to support multiple key/value lengths. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) - * `Checkpoints`: Add new lookup mechanisms. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) - * `Arrays`: Add `unsafeAccess` functions that allow reading and writing to an element in a storage array bypassing Solidity's "out-of-bounds" check. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) - * `Strings`: optimize `toString`. ([#3573](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3573)) - * `Ownable2Step`: extension of `Ownable` that makes the ownership transfers a two step process. ([#3620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3620)) - * `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679)) - * `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670)) - * Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692)) +- `TimelockController`: Added a new `admin` constructor parameter that is assigned the admin role instead of the deployer account. ([#3722](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3722)) +- `Initializable`: add internal functions `_getInitializedVersion` and `_isInitializing` ([#3598](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3598)) +- `ERC165Checker`: add `supportsERC165InterfaceUnchecked` for consulting individual interfaces without the full ERC165 protocol. ([#3339](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3339)) +- `Address`: optimize `functionCall` by calling `functionCallWithValue` directly. ([#3468](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3468)) +- `Address`: optimize `functionCall` functions by checking contract size only if there is no returned data. ([#3469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3469)) +- `Governor`: make the `relay` function payable, and add support for EOA payments. ([#3730](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3730)) +- `GovernorCompatibilityBravo`: remove unused `using` statements. ([#3506](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3506)) +- `ERC20`: optimize `_transfer`, `_mint` and `_burn` by using `unchecked` arithmetic when possible. ([#3513](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3513)) +- `ERC20Votes`, `ERC721Votes`: optimize `getPastVotes` for looking up recent checkpoints. ([#3673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3673)) +- `ERC20FlashMint`: add an internal `_flashFee` function for overriding. ([#3551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3551)) +- `ERC4626`: use the same `decimals()` as the underlying asset by default (if available). ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639)) +- `ERC4626`: add internal `_initialConvertToShares` and `_initialConvertToAssets` functions to customize empty vaults behavior. ([#3639](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3639)) +- `ERC721`: optimize transfers by making approval clearing implicit instead of emitting an event. ([#3481](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3481)) +- `ERC721`: optimize burn by making approval clearing implicit instead of emitting an event. ([#3538](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3538)) +- `ERC721`: Fix balance accounting when a custom `_beforeTokenTransfer` hook results in a transfer of the token under consideration. ([#3611](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3611)) +- `ERC721`: use unchecked arithmetic for balance updates. ([#3524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3524)) +- `ERC721Consecutive`: Implementation of EIP-2309 that allows batch minting of ERC721 tokens during construction. ([#3311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3311)) +- `ReentrancyGuard`: Reduce code size impact of the modifier by using internal functions. ([#3515](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3515)) +- `SafeCast`: optimize downcasting of signed integers. ([#3565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3565)) +- `ECDSA`: Remove redundant check on the `v` value. ([#3591](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3591)) +- `VestingWallet`: add `releasable` getters. ([#3580](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3580)) +- `VestingWallet`: remove unused library `Math.sol`. ([#3605](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3605)) +- `VestingWallet`: make constructor payable. ([#3665](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3665)) +- `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600)) +- `Clones`: optimized the assembly to use only the scratch space during deployments, and optimized `predictDeterministicAddress` to use fewer operations. ([#3640](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3640)) +- `Checkpoints`: Use procedural generation to support multiple key/value lengths. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) +- `Checkpoints`: Add new lookup mechanisms. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) +- `Arrays`: Add `unsafeAccess` functions that allow reading and writing to an element in a storage array bypassing Solidity's "out-of-bounds" check. ([#3589](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3589)) +- `Strings`: optimize `toString`. ([#3573](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3573)) +- `Ownable2Step`: extension of `Ownable` that makes the ownership transfers a two step process. ([#3620](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3620)) +- `Math` and `SignedMath`: optimize function `max` by using `>` instead of `>=`. ([#3679](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3679)) +- `Math`: Add `log2`, `log10` and `log256`. ([#3670](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3670)) +- Arbitrum: Update the vendored arbitrum contracts to match the nitro upgrade. ([#3692](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3692)) ### Breaking changes - * `ERC721`: In order to add support for batch minting via `ERC721Consecutive` it was necessary to make a minor breaking change in the internal interface of `ERC721`. Namely, the hooks `_beforeTokenTransfer` and `_afterTokenTransfer` have one additional argument that may need to be added to overrides: +- `ERC721`: In order to add support for batch minting via `ERC721Consecutive` it was necessary to make a minor breaking change in the internal interface of `ERC721`. Namely, the hooks `_beforeTokenTransfer` and `_afterTokenTransfer` have one additional argument that may need to be added to overrides: ```diff function _beforeTokenTransfer( @@ -71,20 +57,20 @@ ) internal virtual override ``` - * `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. +- `ERC4626`: Conversion from shares to assets (and vice-versa) in an empty vault used to consider the possible mismatch between the underlying asset's and the vault's decimals. This initial conversion rate is now set to 1-to-1 irrespective of decimals, which are meant for usability purposes only. The vault now uses the assets decimals by default, so off-chain the numbers should appear the same. Developers overriding the vault decimals to a value that does not match the underlying asset may want to override the `_initialConvertToShares` and `_initialConvertToAssets` to replicate the previous behavior. - * `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. +- `TimelockController`: During deployment, the TimelockController used to grant the `TIMELOCK_ADMIN_ROLE` to the deployer and to the timelock itself. The deployer was then expected to renounce this role once configuration of the timelock is over. Failing to renounce that role allows the deployer to change the timelock permissions (but not to bypass the delay for any time-locked actions). The role is no longer given to the deployer by default. A new parameter `admin` can be set to a non-zero address to grant the admin role during construction (to the deployer or any other address). Just like previously, this admin role should be renounced after configuration. If this param is given `address(0)`, the role is not allocated and doesn't need to be revoked. In any case, the timelock itself continues to have this role. ### Deprecations - * `EIP712`: Added the file `EIP712.sol` and deprecated `draft-EIP712.sol` since the EIP is no longer a Draft. Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3621)) +- `EIP712`: Added the file `EIP712.sol` and deprecated `draft-EIP712.sol` since the EIP is no longer a Draft. Developers are encouraged to update their imports. ([#3621](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3621)) ```diff -import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; +import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; ``` - * `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3699](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) +- `ERC721Votes`: Added the file `ERC721Votes.sol` and deprecated `draft-ERC721Votes.sol` since it no longer depends on a Draft EIP (EIP-712). Developers are encouraged to update their imports. ([#3699](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3699)) ```diff -import "@openzeppelin/contracts/token/ERC721/extensions/draft-ERC721Votes.sol"; @@ -105,123 +91,124 @@ Existing `ERC4626` contracts that are upgraded to 4.8 must initialize a new vari ```solidity function migrateToV48() public reinitializer(2) { - __ERC4626_init(IERC20Upgradeable(asset())); + __ERC4626_init(IERC20Upgradeable(asset())); } ``` -## 4.7.3 +## 4.7.3 (2022-08-10) ### Breaking changes - * `ECDSA`: `recover(bytes32,bytes)` and `tryRecover(bytes32,bytes)` no longer accept compact signatures to prevent malleability. Compact signature support remains available using `recover(bytes32,bytes32,bytes32)` and `tryRecover(bytes32,bytes32,bytes32)`. +- `ECDSA`: `recover(bytes32,bytes)` and `tryRecover(bytes32,bytes)` no longer accept compact signatures to prevent malleability. Compact signature support remains available using `recover(bytes32,bytes32,bytes32)` and `tryRecover(bytes32,bytes32,bytes32)`. -## 4.7.2 +## 4.7.2 (2022-07-25) - * `LibArbitrumL2`, `CrossChainEnabledArbitrumL2`: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. ([#3578](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3578)) - * `GovernorVotesQuorumFraction`: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. ([#3561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3561)) - * `ERC165Checker`: Added protection against large returndata. ([#3587](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3587)) +- `LibArbitrumL2`, `CrossChainEnabledArbitrumL2`: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. ([#3578](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3578)) +- `GovernorVotesQuorumFraction`: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. ([#3561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3561)) +- `ERC165Checker`: Added protection against large returndata. ([#3587](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3587)) -## 4.7.1 +## 4.7.1 (2022-07-18) - * `SignatureChecker`: Fix an issue that causes `isValidSignatureNow` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552)) - * `ERC165Checker`: Fix an issue that causes `supportsInterface` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552)) +- `SignatureChecker`: Fix an issue that causes `isValidSignatureNow` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552)) +- `ERC165Checker`: Fix an issue that causes `supportsInterface` to revert when the target contract returns ill-encoded data. ([#3552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3552)) ## 4.7.0 (2022-06-29) - * `TimelockController`: Migrate `_call` to `_execute` and allow inheritance and overriding similar to `Governor`. ([#3317](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3317)) - * `CrossChainEnabledPolygonChild`: replace the `require` statement with the custom error `NotCrossChainCall`. ([#3380](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3380)) - * `ERC20FlashMint`: Add customizable flash fee receiver. ([#3327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3327)) - * `ERC4626`: add an extension of `ERC20` that implements the ERC4626 Tokenized Vault Standard. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) - * `SafeERC20`: add `safePermit` as mitigation against phantom permit functions. ([#3280](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3280)) - * `Math`: add a `mulDiv` function that can round the result either up or down. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) - * `Math`: Add a `sqrt` function to compute square roots of integers, rounding either up or down. ([#3242](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3242)) - * `Strings`: add a new overloaded function `toHexString` that converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. ([#3403](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3403)) - * `EnumerableMap`: add new `UintToUintMap` map type. ([#3338](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3338)) - * `EnumerableMap`: add new `Bytes32ToUintMap` map type. ([#3416](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3416)) - * `SafeCast`: add support for many more types, using procedural code generation. ([#3245](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3245)) - * `MerkleProof`: add `multiProofVerify` to prove multiple values are part of a Merkle tree. ([#3276](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3276)) - * `MerkleProof`: add calldata versions of the functions to avoid copying input arrays to memory and save gas. ([#3200](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3200)) - * `ERC721`, `ERC1155`: simplified revert reasons. ([#3254](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3254), ([#3438](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3438))) - * `ERC721`: removed redundant require statement. ([#3434](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3434)) - * `PaymentSplitter`: add `releasable` getters. ([#3350](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3350)) - * `Initializable`: refactored implementation of modifiers for easier understanding. ([#3450](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3450)) - * `Proxies`: remove runtime check of ERC1967 storage slots. ([#3455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3455)) +- `TimelockController`: Migrate `_call` to `_execute` and allow inheritance and overriding similar to `Governor`. ([#3317](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3317)) +- `CrossChainEnabledPolygonChild`: replace the `require` statement with the custom error `NotCrossChainCall`. ([#3380](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3380)) +- `ERC20FlashMint`: Add customizable flash fee receiver. ([#3327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3327)) +- `ERC4626`: add an extension of `ERC20` that implements the ERC4626 Tokenized Vault Standard. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) +- `SafeERC20`: add `safePermit` as mitigation against phantom permit functions. ([#3280](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3280)) +- `Math`: add a `mulDiv` function that can round the result either up or down. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) +- `Math`: Add a `sqrt` function to compute square roots of integers, rounding either up or down. ([#3242](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3242)) +- `Strings`: add a new overloaded function `toHexString` that converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. ([#3403](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3403)) +- `EnumerableMap`: add new `UintToUintMap` map type. ([#3338](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3338)) +- `EnumerableMap`: add new `Bytes32ToUintMap` map type. ([#3416](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3416)) +- `SafeCast`: add support for many more types, using procedural code generation. ([#3245](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3245)) +- `MerkleProof`: add `multiProofVerify` to prove multiple values are part of a Merkle tree. ([#3276](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3276)) +- `MerkleProof`: add calldata versions of the functions to avoid copying input arrays to memory and save gas. ([#3200](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3200)) +- `ERC721`, `ERC1155`: simplified revert reasons. ([#3254](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3254), ([#3438](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3438))) +- `ERC721`: removed redundant require statement. ([#3434](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3434)) +- `PaymentSplitter`: add `releasable` getters. ([#3350](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3350)) +- `Initializable`: refactored implementation of modifiers for easier understanding. ([#3450](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3450)) +- `Proxies`: remove runtime check of ERC1967 storage slots. ([#3455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3455)) ### Breaking changes - * `Initializable`: functions decorated with the modifier `reinitializer(1)` may no longer invoke each other. +- `Initializable`: functions decorated with the modifier `reinitializer(1)` may no longer invoke each other. ## 4.6.0 (2022-04-26) - * `crosschain`: Add a new set of contracts for cross-chain applications. `CrossChainEnabled` is a base contract with instantiations for several chains and bridges, and `AccessControlCrossChain` is an extension of access control that allows cross-chain operation. ([#3183](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3183)) - * `AccessControl`: add a virtual `_checkRole(bytes32)` function that can be overridden to alter the `onlyRole` modifier behavior. ([#3137](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3137)) - * `EnumerableMap`: add new `AddressToUintMap` map type. ([#3150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3150)) - * `EnumerableMap`: add new `Bytes32ToBytes32Map` map type. ([#3192](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3192)) - * `ERC20FlashMint`: support infinite allowance when paying back a flash loan. ([#3226](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3226)) - * `ERC20Wrapper`: the `decimals()` function now tries to fetch the value from the underlying token instance. If that calls revert, then the default value is used. ([#3259](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3259)) - * `draft-ERC20Permit`: replace `immutable` with `constant` for `_PERMIT_TYPEHASH` since the `keccak256` of string literals is treated specially and the hash is evaluated at compile time. ([#3196](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3196)) - * `ERC1155`: Add a `_afterTokenTransfer` hook for improved extensibility. ([#3166](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3166)) - * `ERC1155URIStorage`: add a new extension that implements a `_setURI` behavior similar to ERC721's `_setTokenURI`. ([#3210](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3210)) - * `DoubleEndedQueue`: a new data structure that supports efficient push and pop to both front and back, useful for FIFO and LIFO queues. ([#3153](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3153)) - * `Governor`: improved security of `onlyGovernance` modifier when using an external executor contract (e.g. a timelock) that can operate without necessarily going through the governance protocol. ([#3147](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3147)) - * `Governor`: Add a way to parameterize votes. This can be used to implement voting systems such as fractionalized voting, ERC721 based voting, or any number of other systems. The `params` argument added to `_countVote` method, and included in the newly added `_getVotes` method, can be used by counting and voting modules respectively for such purposes. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) - * `Governor`: rewording of revert reason for consistency. ([#3275](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3275)) - * `Governor`: fix an inconsistency in data locations that could lead to invalid bytecode being produced. ([#3295](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3295)) - * `Governor`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by governors. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230)) - * `TimelockController`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by timelocks. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230)) - * `TimelockController`: Add a separate canceller role for the ability to cancel. ([#3165](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3165)) - * `Initializable`: add a reinitializer modifier that enables the initialization of new modules, added to already initialized contracts through upgradeability. ([#3232](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3232)) - * `Initializable`: add an Initialized event that tracks initialized version numbers. ([#3294](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3294)) - * `ERC2981`: make `royaltyInfo` public to allow super call in overrides. ([#3305](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3305)) +- `crosschain`: Add a new set of contracts for cross-chain applications. `CrossChainEnabled` is a base contract with instantiations for several chains and bridges, and `AccessControlCrossChain` is an extension of access control that allows cross-chain operation. ([#3183](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3183)) +- `AccessControl`: add a virtual `_checkRole(bytes32)` function that can be overridden to alter the `onlyRole` modifier behavior. ([#3137](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3137)) +- `EnumerableMap`: add new `AddressToUintMap` map type. ([#3150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3150)) +- `EnumerableMap`: add new `Bytes32ToBytes32Map` map type. ([#3192](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3192)) +- `ERC20FlashMint`: support infinite allowance when paying back a flash loan. ([#3226](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3226)) +- `ERC20Wrapper`: the `decimals()` function now tries to fetch the value from the underlying token instance. If that calls revert, then the default value is used. ([#3259](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3259)) +- `draft-ERC20Permit`: replace `immutable` with `constant` for `_PERMIT_TYPEHASH` since the `keccak256` of string literals is treated specially and the hash is evaluated at compile time. ([#3196](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3196)) +- `ERC1155`: Add a `_afterTokenTransfer` hook for improved extensibility. ([#3166](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3166)) +- `ERC1155URIStorage`: add a new extension that implements a `_setURI` behavior similar to ERC721's `_setTokenURI`. ([#3210](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3210)) +- `DoubleEndedQueue`: a new data structure that supports efficient push and pop to both front and back, useful for FIFO and LIFO queues. ([#3153](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3153)) +- `Governor`: improved security of `onlyGovernance` modifier when using an external executor contract (e.g. a timelock) that can operate without necessarily going through the governance protocol. ([#3147](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3147)) +- `Governor`: Add a way to parameterize votes. This can be used to implement voting systems such as fractionalized voting, ERC721 based voting, or any number of other systems. The `params` argument added to `_countVote` method, and included in the newly added `_getVotes` method, can be used by counting and voting modules respectively for such purposes. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) +- `Governor`: rewording of revert reason for consistency. ([#3275](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3275)) +- `Governor`: fix an inconsistency in data locations that could lead to invalid bytecode being produced. ([#3295](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3295)) +- `Governor`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by governors. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230)) +- `TimelockController`: Implement `IERC721Receiver` and `IERC1155Receiver` to improve token custody by timelocks. ([#3230](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3230)) +- `TimelockController`: Add a separate canceller role for the ability to cancel. ([#3165](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3165)) +- `Initializable`: add a reinitializer modifier that enables the initialization of new modules, added to already initialized contracts through upgradeability. ([#3232](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3232)) +- `Initializable`: add an Initialized event that tracks initialized version numbers. ([#3294](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3294)) +- `ERC2981`: make `royaltyInfo` public to allow super call in overrides. ([#3305](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3305)) ### Upgradeability notice -* `TimelockController`: **(Action needed)** The upgrade from <4.6 to >=4.6 introduces a new `CANCELLER_ROLE` that requires set up to be assignable. After the upgrade, only addresses with this role will have the ability to cancel. Proposers will no longer be able to cancel. Assigning cancellers can be done by an admin (including the timelock itself) once the role admin is set up. To do this, we recommend upgrading to the `TimelockControllerWith46MigrationUpgradeable` contract and then calling the `migrateTo46` function. +- `TimelockController`: **(Action needed)** The upgrade from <4.6 to >=4.6 introduces a new `CANCELLER_ROLE` that requires set up to be assignable. After the upgrade, only addresses with this role will have the ability to cancel. Proposers will no longer be able to cancel. Assigning cancellers can be done by an admin (including the timelock itself) once the role admin is set up. To do this, we recommend upgrading to the `TimelockControllerWith46MigrationUpgradeable` contract and then calling the `migrateTo46` function. ### Breaking changes -* `Governor`: Adds internal virtual `_getVotes` method that must be implemented; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing voting module extension, rename `getVotes` to `_getVotes` and add a `bytes memory` argument. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) -* `Governor`: Adds `params` parameter to internal virtual `_countVote` method; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing counting module extension, add a `bytes memory` argument to `_countVote`. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) -* `Governor`: Does not emit `VoteCast` event when params data is non-empty; instead emits `VoteCastWithParams` event. To fix this on an integration that consumes the `VoteCast` event, also fetch/monitor `VoteCastWithParams` events. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) -* `Votes`: The internal virtual function `_getVotingUnits` was made `view` (which was accidentally missing). Any overrides should now be updated so they are `view` as well. +- `Governor`: Adds internal virtual `_getVotes` method that must be implemented; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing voting module extension, rename `getVotes` to `_getVotes` and add a `bytes memory` argument. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) +- `Governor`: Adds `params` parameter to internal virtual `_countVote` method; this is a breaking change for existing concrete extensions to `Governor`. To fix this on an existing counting module extension, add a `bytes memory` argument to `_countVote`. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) +- `Governor`: Does not emit `VoteCast` event when params data is non-empty; instead emits `VoteCastWithParams` event. To fix this on an integration that consumes the `VoteCast` event, also fetch/monitor `VoteCastWithParams` events. ([#3043](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3043)) +- `Votes`: The internal virtual function `_getVotingUnits` was made `view` (which was accidentally missing). Any overrides should now be updated so they are `view` as well. ## 4.5.0 (2022-02-09) - * `ERC2981`: add implementation of the royalty standard, and the respective extensions for `ERC721` and `ERC1155`. ([#3012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3012)) - * `GovernorTimelockControl`: improve the `state()` function to have it reflect cases where a proposal has been canceled directly on the timelock. ([#2977](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2977)) - * Preset contracts are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com). ([#2986](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2986)) - * `Governor`: add a relay function to help recover assets sent to a governor that is not its own executor (e.g. when using a timelock). ([#2926](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2926)) - * `GovernorPreventLateQuorum`: add new module to ensure a minimum voting duration is available after the quorum is reached. ([#2973](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2973)) - * `ERC721`: improved revert reason when transferring from wrong owner. ([#2975](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2975)) - * `Votes`: Added a base contract for vote tracking with delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944)) - * `ERC721Votes`: Added an extension of ERC721 enabled with vote tracking and delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944)) - * `ERC2771Context`: use immutable storage to store the forwarder address, no longer an issue since Solidity >=0.8.8 allows reading immutable variables in the constructor. ([#2917](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2917)) - * `Base64`: add a library to parse bytes into base64 strings using `encode(bytes memory)` function, and provide examples to show how to use to build URL-safe `tokenURIs`. ([#2884](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2884)) - * `ERC20`: reduce allowance before triggering transfer. ([#3056](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3056)) - * `ERC20`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085)) - * `ERC20`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) - * `ERC20Burnable`: do not update allowance on `burnFrom` when allowance is `type(uint256).max`. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) - * `ERC777`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085)) - * `ERC777`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) - * `SignedMath`: a new signed version of the Math library with `max`, `min`, and `average`. ([#2686](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2686)) - * `SignedMath`: add an `abs(int256)` method that returns the unsigned absolute value of a signed value. ([#2984](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2984)) - * `ERC1967Upgrade`: Refactor the secure upgrade to use `ERC1822` instead of the previous rollback mechanism. This reduces code complexity and attack surface with similar security guarantees. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021)) - * `UUPSUpgradeable`: Add `ERC1822` compliance to support the updated secure upgrade mechanism. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021)) - * Some more functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior. +- `ERC2981`: add implementation of the royalty standard, and the respective extensions for `ERC721` and `ERC1155`. ([#3012](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3012)) +- `GovernorTimelockControl`: improve the `state()` function to have it reflect cases where a proposal has been canceled directly on the timelock. ([#2977](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2977)) +- Preset contracts are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com). ([#2986](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2986)) +- `Governor`: add a relay function to help recover assets sent to a governor that is not its own executor (e.g. when using a timelock). ([#2926](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2926)) +- `GovernorPreventLateQuorum`: add new module to ensure a minimum voting duration is available after the quorum is reached. ([#2973](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2973)) +- `ERC721`: improved revert reason when transferring from wrong owner. ([#2975](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2975)) +- `Votes`: Added a base contract for vote tracking with delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944)) +- `ERC721Votes`: Added an extension of ERC721 enabled with vote tracking and delegation. ([#2944](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2944)) +- `ERC2771Context`: use immutable storage to store the forwarder address, no longer an issue since Solidity >=0.8.8 allows reading immutable variables in the constructor. ([#2917](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2917)) +- `Base64`: add a library to parse bytes into base64 strings using `encode(bytes memory)` function, and provide examples to show how to use to build URL-safe `tokenURIs`. ([#2884](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2884)) +- `ERC20`: reduce allowance before triggering transfer. ([#3056](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3056)) +- `ERC20`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085)) +- `ERC20`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) +- `ERC20Burnable`: do not update allowance on `burnFrom` when allowance is `type(uint256).max`. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) +- `ERC777`: do not update allowance on `transferFrom` when allowance is `type(uint256).max`. ([#3085](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3085)) +- `ERC777`: add a `_spendAllowance` internal function. ([#3170](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3170)) +- `SignedMath`: a new signed version of the Math library with `max`, `min`, and `average`. ([#2686](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2686)) +- `SignedMath`: add an `abs(int256)` method that returns the unsigned absolute value of a signed value. ([#2984](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2984)) +- `ERC1967Upgrade`: Refactor the secure upgrade to use `ERC1822` instead of the previous rollback mechanism. This reduces code complexity and attack surface with similar security guarantees. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021)) +- `UUPSUpgradeable`: Add `ERC1822` compliance to support the updated secure upgrade mechanism. ([#3021](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3021)) +- Some more functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior. ### Breaking changes -* `ERC1967Upgrade`: The function `_upgradeToAndCallSecure` was renamed to `_upgradeToAndCallUUPS`, along with the change in security mechanism described above. -* `Address`: The Solidity pragma is increased from `^0.8.0` to `^0.8.1`. This is required by the `account.code.length` syntax that replaces inline assembly. This may require users to bump their compiler version from `0.8.0` to `0.8.1` or later. Note that other parts of the code already include stricter requirements. +- `ERC1967Upgrade`: The function `_upgradeToAndCallSecure` was renamed to `_upgradeToAndCallUUPS`, along with the change in security mechanism described above. +- `Address`: The Solidity pragma is increased from `^0.8.0` to `^0.8.1`. This is required by the `account.code.length` syntax that replaces inline assembly. This may require users to bump their compiler version from `0.8.0` to `0.8.1` or later. Note that other parts of the code already include stricter requirements. ## 4.4.2 (2022-01-11) ### Bugfixes - * `GovernorCompatibilityBravo`: Fix error in the encoding of calldata for proposals submitted through the compatibility interface with explicit signatures. ([#3100](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3100)) + +- `GovernorCompatibilityBravo`: Fix error in the encoding of calldata for proposals submitted through the compatibility interface with explicit signatures. ([#3100](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3100)) ## 4.4.1 (2021-12-14) - * `Initializable`: change the existing `initializer` modifier and add a new `onlyInitializing` modifier to prevent reentrancy risk. ([#3006](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3006)) +- `Initializable`: change the existing `initializer` modifier and add a new `onlyInitializing` modifier to prevent reentrancy risk. ([#3006](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3006)) ### Breaking change @@ -241,59 +228,59 @@ It is no longer possible to call an `initializer`-protected function from within ## 4.4.0 (2021-11-25) - * `Ownable`: add an internal `_transferOwnership(address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) - * `AccessControl`: add internal `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) - * `AccessControl`: mark `_setupRole(bytes32,address)` as deprecated in favor of `_grantRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) - * `AccessControlEnumerable`: hook into `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2946](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2946)) - * `EIP712`: cache `address(this)` to immutable storage to avoid potential issues if a vanilla contract is used in a delegatecall context. ([#2852](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2852)) - * Add internal `_setApprovalForAll` to `ERC721` and `ERC1155`. ([#2834](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2834)) - * `Governor`: shift vote start and end by one block to better match Compound's GovernorBravo and prevent voting at the Governor level if the voting snapshot is not ready. ([#2892](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2892)) - * `GovernorCompatibilityBravo`: consider quorum an inclusive rather than exclusive minimum to match Compound's GovernorBravo. ([#2974](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2974)) - * `GovernorSettings`: a new governor module that manages voting settings updatable through governance actions. ([#2904](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2904)) - * `PaymentSplitter`: now supports ERC20 assets in addition to Ether. ([#2858](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2858)) - * `ECDSA`: add a variant of `toEthSignedMessageHash` for arbitrary length message hashing. ([#2865](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2865)) - * `MerkleProof`: add a `processProof` function that returns the rebuilt root hash given a leaf and a proof. ([#2841](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2841)) - * `VestingWallet`: new contract that handles the vesting of Ether and ERC20 tokens following a customizable vesting schedule. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2748)) - * `Governor`: enable receiving Ether when a Timelock contract is not used. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) - * `GovernorTimelockCompound`: fix ability to use Ether stored in the Timelock contract. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) +- `Ownable`: add an internal `_transferOwnership(address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) +- `AccessControl`: add internal `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) +- `AccessControl`: mark `_setupRole(bytes32,address)` as deprecated in favor of `_grantRole(bytes32,address)`. ([#2568](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2568)) +- `AccessControlEnumerable`: hook into `_grantRole(bytes32,address)` and `_revokeRole(bytes32,address)`. ([#2946](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2946)) +- `EIP712`: cache `address(this)` to immutable storage to avoid potential issues if a vanilla contract is used in a delegatecall context. ([#2852](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2852)) +- Add internal `_setApprovalForAll` to `ERC721` and `ERC1155`. ([#2834](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2834)) +- `Governor`: shift vote start and end by one block to better match Compound's GovernorBravo and prevent voting at the Governor level if the voting snapshot is not ready. ([#2892](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2892)) +- `GovernorCompatibilityBravo`: consider quorum an inclusive rather than exclusive minimum to match Compound's GovernorBravo. ([#2974](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2974)) +- `GovernorSettings`: a new governor module that manages voting settings updatable through governance actions. ([#2904](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2904)) +- `PaymentSplitter`: now supports ERC20 assets in addition to Ether. ([#2858](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2858)) +- `ECDSA`: add a variant of `toEthSignedMessageHash` for arbitrary length message hashing. ([#2865](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2865)) +- `MerkleProof`: add a `processProof` function that returns the rebuilt root hash given a leaf and a proof. ([#2841](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2841)) +- `VestingWallet`: new contract that handles the vesting of Ether and ERC20 tokens following a customizable vesting schedule. ([#2748](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2748)) +- `Governor`: enable receiving Ether when a Timelock contract is not used. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) +- `GovernorTimelockCompound`: fix ability to use Ether stored in the Timelock contract. ([#2849](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2849)) -## 4.3.3 +## 4.3.3 (2021-11-08) - * `ERC1155Supply`: Handle `totalSupply` changes by hooking into `_beforeTokenTransfer` to ensure consistency of balances and supply during `IERC1155Receiver.onERC1155Received` calls. +- `ERC1155Supply`: Handle `totalSupply` changes by hooking into `_beforeTokenTransfer` to ensure consistency of balances and supply during `IERC1155Receiver.onERC1155Received` calls. ## 4.3.2 (2021-09-14) - * `UUPSUpgradeable`: Add modifiers to prevent `upgradeTo` and `upgradeToAndCall` being executed on any contract that is not the active ERC1967 proxy. This prevents these functions being called on implementation contracts or minimal ERC1167 clones, in particular. +- `UUPSUpgradeable`: Add modifiers to prevent `upgradeTo` and `upgradeToAndCall` being executed on any contract that is not the active ERC1967 proxy. This prevents these functions being called on implementation contracts or minimal ERC1167 clones, in particular. ## 4.3.1 (2021-08-26) - * `TimelockController`: Add additional isOperationReady check. +- `TimelockController`: Add additional isOperationReady check. ## 4.3.0 (2021-08-17) - * `ERC2771Context`: use private variable from storage to store the forwarder address. Fixes issues where `_msgSender()` was not callable from constructors. ([#2754](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2754)) - * `EnumerableSet`: add `values()` functions that returns an array containing all values in a single call. ([#2768](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2768)) - * `Governor`: added a modular system of `Governor` contracts based on `GovernorAlpha` and `GovernorBravo`. ([#2672](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2672)) - * Add an `interfaces` folder containing solidity interfaces to final ERCs. ([#2517](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2517)) - * `ECDSA`: add `tryRecover` functions that will not throw if the signature is invalid, and will return an error flag instead. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661)) - * `SignatureChecker`: Reduce gas usage of the `isValidSignatureNow` function for the "signature by EOA" case. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661)) +- `ERC2771Context`: use private variable from storage to store the forwarder address. Fixes issues where `_msgSender()` was not callable from constructors. ([#2754](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2754)) +- `EnumerableSet`: add `values()` functions that returns an array containing all values in a single call. ([#2768](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2768)) +- `Governor`: added a modular system of `Governor` contracts based on `GovernorAlpha` and `GovernorBravo`. ([#2672](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2672)) +- Add an `interfaces` folder containing solidity interfaces to final ERCs. ([#2517](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2517)) +- `ECDSA`: add `tryRecover` functions that will not throw if the signature is invalid, and will return an error flag instead. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661)) +- `SignatureChecker`: Reduce gas usage of the `isValidSignatureNow` function for the "signature by EOA" case. ([#2661](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2661)) ## 4.2.0 (2021-06-30) - * `ERC20Votes`: add a new extension of the `ERC20` token with support for voting snapshots and delegation. ([#2632](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2632)) - * `ERC20VotesComp`: Variant of `ERC20Votes` that is compatible with Compound's `Comp` token interface but restricts supply to `uint96`. ([#2706](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2706)) - * `ERC20Wrapper`: add a new extension of the `ERC20` token which wraps an underlying token. Deposit and withdraw guarantee that the total supply is backed by a corresponding amount of underlying token. ([#2633](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2633)) - * Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`. - * Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`. - * `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678)) - * Tokens: Wrap definitely safe subtractions in `unchecked` blocks. - * `Math`: Add a `ceilDiv` method for performing ceiling division. - * `ERC1155Supply`: add a new `ERC1155` extension that keeps track of the totalSupply of each tokenId. ([#2593](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2593)) - * `BitMaps`: add a new `BitMaps` library that provides a storage efficient datastructure for `uint256` to `bool` mapping with contiguous keys. ([#2710](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2710)) +- `ERC20Votes`: add a new extension of the `ERC20` token with support for voting snapshots and delegation. ([#2632](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2632)) +- `ERC20VotesComp`: Variant of `ERC20Votes` that is compatible with Compound's `Comp` token interface but restricts supply to `uint96`. ([#2706](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2706)) +- `ERC20Wrapper`: add a new extension of the `ERC20` token which wraps an underlying token. Deposit and withdraw guarantee that the total supply is backed by a corresponding amount of underlying token. ([#2633](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2633)) +- Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`. +- Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`. +- `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678)) +- Tokens: Wrap definitely safe subtractions in `unchecked` blocks. +- `Math`: Add a `ceilDiv` method for performing ceiling division. +- `ERC1155Supply`: add a new `ERC1155` extension that keeps track of the totalSupply of each tokenId. ([#2593](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2593)) +- `BitMaps`: add a new `BitMaps` library that provides a storage efficient datastructure for `uint256` to `bool` mapping with contiguous keys. ([#2710](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2710)) ### Breaking Changes - * `ERC20FlashMint` is no longer a Draft ERC. ([#2673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2673))) +- `ERC20FlashMint` is no longer a Draft ERC. ([#2673](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2673))) **How to update:** Change your import paths by removing the `draft-` prefix from `@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20FlashMint.sol`. @@ -301,16 +288,16 @@ It is no longer possible to call an `initializer`-protected function from within ## 4.1.0 (2021-04-29) - * `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561)) - * `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552)) - * `ERC20Permit`: add a `_useNonce` to enable further usage of ERC712 signatures. ([#2565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2565)) - * `ERC20FlashMint`: add an implementation of the ERC3156 extension for flash-minting ERC20 tokens. ([#2543](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2543)) - * `SignatureChecker`: add a signature verification library that supports both EOA and ERC1271 compliant contracts as signers. ([#2532](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2532)) - * `Multicall`: add abstract contract with `multicall(bytes[] calldata data)` function to bundle multiple calls together ([#2608](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2608)) - * `ECDSA`: add support for ERC2098 short-signatures. ([#2582](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2582)) - * `AccessControl`: add an `onlyRole` modifier to restrict specific function to callers bearing a specific role. ([#2609](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2609)) - * `StorageSlot`: add a library for reading and writing primitive types to specific storage slots. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542)) - * UUPS Proxies: add `UUPSUpgradeable` to implement the UUPS proxy pattern together with `EIP1967Proxy`. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542)) +- `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561)) +- `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552)) +- `ERC20Permit`: add a `_useNonce` to enable further usage of ERC712 signatures. ([#2565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2565)) +- `ERC20FlashMint`: add an implementation of the ERC3156 extension for flash-minting ERC20 tokens. ([#2543](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2543)) +- `SignatureChecker`: add a signature verification library that supports both EOA and ERC1271 compliant contracts as signers. ([#2532](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2532)) +- `Multicall`: add abstract contract with `multicall(bytes[] calldata data)` function to bundle multiple calls together ([#2608](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2608)) +- `ECDSA`: add support for ERC2098 short-signatures. ([#2582](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2582)) +- `AccessControl`: add an `onlyRole` modifier to restrict specific function to callers bearing a specific role. ([#2609](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2609)) +- `StorageSlot`: add a library for reading and writing primitive types to specific storage slots. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542)) +- UUPS Proxies: add `UUPSUpgradeable` to implement the UUPS proxy pattern together with `EIP1967Proxy`. ([#2542](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2542)) ### Breaking changes @@ -327,28 +314,28 @@ This release includes two small breaking changes in `TimelockController`. ## 4.0.0 (2021-03-23) - * Now targeting the 0.8.x line of Solidity compilers. For 0.6.x (resp 0.7.x) support, use version 3.4.0 (resp 3.4.0-solc-0.7) of OpenZeppelin. - * `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492)) - * `ERC20`: removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502)) - * `Strings`: addition of a `toHexString` function. ([#2504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2504)) - * `EnumerableMap`: change implementation to optimize for `key → value` lookups instead of enumeration. ([#2518](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2518)) - * `GSN`: deprecate GSNv1 support in favor of upcoming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521)) - * `ERC165`: remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behavior remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505)) - * `Initializable`: make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531)) - * `ERC721`: remove enumerability of tokens from the base implementation. This feature is now provided separately through the `ERC721Enumerable` extension. ([#2511](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2511)) - * `AccessControl`: removed enumerability by default for a more lightweight contract. It is now opt-in through `AccessControlEnumerable`. ([#2512](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2512)) - * Meta Transactions: add `ERC2771Context` and a `MinimalForwarder` for meta-transactions. ([#2508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2508)) - * Overall reorganization of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503)) - * `ERC20Capped`: optimize gas usage by enforcing the check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524)) - * Rename `UpgradeableProxy` to `ERC1967Proxy`. ([#2547](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2547)) - * `ERC777`: optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551)) - * `ERC721URIStorage`: add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555)) - * `AccessControl`: added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562)) - * `ERC1155`: make `uri` public so overloading function can call it using super. ([#2576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2576)) +- Now targeting the 0.8.x line of Solidity compilers. For 0.6.x (resp 0.7.x) support, use version 3.4.0 (resp 3.4.0-solc-0.7) of OpenZeppelin. +- `Context`: making `_msgData` return `bytes calldata` instead of `bytes memory` ([#2492](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2492)) +- `ERC20`: removed the `_setDecimals` function and the storage slot associated to decimals. ([#2502](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2502)) +- `Strings`: addition of a `toHexString` function. ([#2504](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2504)) +- `EnumerableMap`: change implementation to optimize for `key → value` lookups instead of enumeration. ([#2518](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2518)) +- `GSN`: deprecate GSNv1 support in favor of upcoming support for GSNv2. ([#2521](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2521)) +- `ERC165`: remove uses of storage in the base ERC165 implementation. ERC165 based contracts now use storage-less virtual functions. Old behavior remains available in the `ERC165Storage` extension. ([#2505](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2505)) +- `Initializable`: make initializer check stricter during construction. ([#2531](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2531)) +- `ERC721`: remove enumerability of tokens from the base implementation. This feature is now provided separately through the `ERC721Enumerable` extension. ([#2511](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2511)) +- `AccessControl`: removed enumerability by default for a more lightweight contract. It is now opt-in through `AccessControlEnumerable`. ([#2512](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2512)) +- Meta Transactions: add `ERC2771Context` and a `MinimalForwarder` for meta-transactions. ([#2508](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2508)) +- Overall reorganization of the contract folder to improve clarity and discoverability. ([#2503](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2503)) +- `ERC20Capped`: optimize gas usage by enforcing the check directly in `_mint`. ([#2524](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2524)) +- Rename `UpgradeableProxy` to `ERC1967Proxy`. ([#2547](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2547)) +- `ERC777`: optimize the gas costs of the constructor. ([#2551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2551)) +- `ERC721URIStorage`: add a new extension that implements the `_setTokenURI` behavior as it was available in 3.4.0. ([#2555](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2555)) +- `AccessControl`: added ERC165 interface detection. ([#2562](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2562)) +- `ERC1155`: make `uri` public so overloading function can call it using super. ([#2576](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2576)) ### Bug fixes for beta releases - * `AccessControlEnumerable`: Fixed `renounceRole` not updating enumerable set of addresses for a role. ([#2572](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2572)) +- `AccessControlEnumerable`: Fixed `renounceRole` not updating enumerable set of addresses for a role. ([#2572](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2572)) ### How to upgrade from 3.x @@ -362,56 +349,59 @@ Make sure you're using git or another version control system to be able to recov ### How to upgrade from 4.0-beta.x -Some further changes have been done between the different beta iterations. Transitions made during this period are configured in the `migrate-imports` script. Consequently, you can upgrade from any previous 4.0-beta.x version using the same script as described in the *How to upgrade from 3.x* section. +Some further changes have been done between the different beta iterations. Transitions made during this period are configured in the `migrate-imports` script. Consequently, you can upgrade from any previous 4.0-beta.x version using the same script as described in the _How to upgrade from 3.x_ section. -## 3.4.2 +## 3.4.2 (2021-07-24) - * `TimelockController`: Add additional isOperationReady check. +- `TimelockController`: Add additional isOperationReady check. ## 3.4.1 (2021-03-03) - * `ERC721`: made `_approve` an internal function (was private). +- `ERC721`: made `_approve` an internal function (was private). ## 3.4.0 (2021-02-02) - * `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411)) - * `EIP712`: added helpers to verify EIP712 typed data signatures on chain. ([#2418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2418)) - * `ERC20Permit`: added an implementation of the ERC20 permit extension for gasless token approvals. ([#2237](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237)) - * Presets: added token presets with preminted fixed supply `ERC20PresetFixedSupply` and `ERC777PresetFixedSupply`. ([#2399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2399)) - * `Address`: added `functionDelegateCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333)) - * `Clones`: added a library for deploying EIP 1167 minimal proxies. ([#2449](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2449)) - * `Context`: moved from `contracts/GSN` to `contracts/utils`. ([#2453](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2453)) - * `PaymentSplitter`: replace usage of `.transfer()` with `Address.sendValue` for improved compatibility with smart wallets. ([#2455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2455)) - * `UpgradeableProxy`: bubble revert reasons from initialization calls. ([#2454](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2454)) - * `SafeMath`: fix a memory allocation issue by adding new `SafeMath.tryOp(uint,uint)→(bool,uint)` functions. `SafeMath.op(uint,uint,string)→uint` are now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462)) - * `EnumerableMap`: fix a memory allocation issue by adding new `EnumerableMap.tryGet(uint)→(bool,address)` functions. `EnumerableMap.get(uint)→string` is now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462)) - * `ERC165Checker`: added batch `getSupportedInterfaces`. ([#2469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2469)) - * `RefundEscrow`: `beneficiaryWithdraw` will forward all available gas to the beneficiary. ([#2480](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2480)) - * Many view and pure functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior. +- `BeaconProxy`: added new kind of proxy that allows simultaneous atomic upgrades. ([#2411](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2411)) +- `EIP712`: added helpers to verify EIP712 typed data signatures on chain. ([#2418](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2418)) +- `ERC20Permit`: added an implementation of the ERC20 permit extension for gasless token approvals. ([#2237](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237)) +- Presets: added token presets with preminted fixed supply `ERC20PresetFixedSupply` and `ERC777PresetFixedSupply`. ([#2399](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2399)) +- `Address`: added `functionDelegateCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333)) +- `Clones`: added a library for deploying EIP 1167 minimal proxies. ([#2449](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2449)) +- `Context`: moved from `contracts/GSN` to `contracts/utils`. ([#2453](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2453)) +- `PaymentSplitter`: replace usage of `.transfer()` with `Address.sendValue` for improved compatibility with smart wallets. ([#2455](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2455)) +- `UpgradeableProxy`: bubble revert reasons from initialization calls. ([#2454](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2454)) +- `SafeMath`: fix a memory allocation issue by adding new `SafeMath.tryOp(uint,uint)→(bool,uint)` functions. `SafeMath.op(uint,uint,string)→uint` are now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462)) +- `EnumerableMap`: fix a memory allocation issue by adding new `EnumerableMap.tryGet(uint)→(bool,address)` functions. `EnumerableMap.get(uint)→string` is now deprecated. ([#2462](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2462)) +- `ERC165Checker`: added batch `getSupportedInterfaces`. ([#2469](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2469)) +- `RefundEscrow`: `beneficiaryWithdraw` will forward all available gas to the beneficiary. ([#2480](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2480)) +- Many view and pure functions have been made virtual to customize them via overrides. In many cases this will not imply that other functions in the contract will automatically adapt to the overridden definitions. People who wish to override should consult the source code to understand the impact and if they need to override any additional functions to achieve the desired behavior. ### Security Fixes - * `ERC777`: fix potential reentrancy issues for custom extensions to `ERC777`. ([#2483](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2483)) +- `ERC777`: fix potential reentrancy issues for custom extensions to `ERC777`. ([#2483](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2483)) If you're using our implementation of ERC777 from version 3.3.0 or earlier, and you define a custom `_beforeTokenTransfer` function that writes to a storage variable, you may be vulnerable to a reentrancy attack. If you're affected and would like assistance please write to security@openzeppelin.com. [Read more in the pull request.](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2483) ## 3.3.0 (2020-11-26) - * Now supports both Solidity 0.6 and 0.7. Compiling with solc 0.7 will result in warnings. Install the `solc-0.7` tag to compile without warnings. - * `Address`: added `functionStaticCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333)) - * `TimelockController`: added a contract to augment access control schemes with a delay. ([#2354](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2354)) - * `EnumerableSet`: added `Bytes32Set`, for sets of `bytes32`. ([#2395](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2395)) +- Now supports both Solidity 0.6 and 0.7. Compiling with solc 0.7 will result in warnings. Install the `solc-0.7` tag to compile without warnings. +- `Address`: added `functionStaticCall`, similar to the existing `functionCall`. ([#2333](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2333)) +- `TimelockController`: added a contract to augment access control schemes with a delay. ([#2354](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2354)) +- `EnumerableSet`: added `Bytes32Set`, for sets of `bytes32`. ([#2395](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2395)) ## 3.2.2-solc-0.7 (2020-10-28) - * Resolve warnings introduced by Solidity 0.7.4. ([#2396](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2396)) + +- Resolve warnings introduced by Solidity 0.7.4. ([#2396](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2396)) ## 3.2.1-solc-0.7 (2020-09-15) - * `ERC777`: Remove a warning about function state visibility in Solidity 0.7. ([#2327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2327)) + +- `ERC777`: Remove a warning about function state visibility in Solidity 0.7. ([#2327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2327)) ## 3.2.0 (2020-09-10) ### New features - * Proxies: added the proxy contracts from OpenZeppelin SDK. ([#2335](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2335)) + +- Proxies: added the proxy contracts from OpenZeppelin SDK. ([#2335](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2335)) #### Proxy changes with respect to OpenZeppelin SDK @@ -423,10 +413,12 @@ Aside from upgrading them from Solidity 0.5 to 0.6, we've changed a few minor th - `UpgradeabilityProxy._setImplementation` and `AdminUpgradeabilityProxy._setAdmin` were made private. ### Improvements - * `Address.isContract`: switched from `extcodehash` to `extcodesize` for less gas usage. ([#2311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2311)) + +- `Address.isContract`: switched from `extcodehash` to `extcodesize` for less gas usage. ([#2311](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2311)) ### Breaking changes - * `ERC20Snapshot`: switched to using `_beforeTokenTransfer` hook instead of overriding ERC20 operations. ([#2312](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2312)) + +- `ERC20Snapshot`: switched to using `_beforeTokenTransfer` hook instead of overriding ERC20 operations. ([#2312](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2312)) This small change in the way we implemented `ERC20Snapshot` may affect users who are combining this contract with other ERC20 flavors, since it no longer overrides `_transfer`, `_mint`, and `_burn`. This can result in having to remove Solidity `override(...)` specifiers in derived contracts for these functions, and to instead have to add it for `_beforeTokenTransfer`. See [Using Hooks](https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks) in the documentation. @@ -434,119 +426,134 @@ other ERC20 flavors, since it no longer overrides `_transfer`, `_mint`, and `_bu ## 3.1.0 (2020-06-23) ### New features - * `SafeCast`: added functions to downcast signed integers (e.g. `toInt32`), improving usability of `SignedSafeMath`. ([#2243](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2243)) - * `functionCall`: new helpers that replicate Solidity's function call semantics, reducing the need to rely on `call`. ([#2264](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2264)) - * `ERC1155`: added support for a base implementation, non-standard extensions and a preset contract. ([#2014](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2014), [#2230](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2230)) + +- `SafeCast`: added functions to downcast signed integers (e.g. `toInt32`), improving usability of `SignedSafeMath`. ([#2243](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2243)) +- `functionCall`: new helpers that replicate Solidity's function call semantics, reducing the need to rely on `call`. ([#2264](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2264)) +- `ERC1155`: added support for a base implementation, non-standard extensions and a preset contract. ([#2014](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2014), [#2230](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2230)) ### Improvements - * `ReentrancyGuard`: reduced overhead of using the `nonReentrant` modifier. ([#2171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2171)) - * `AccessControl`: added a `RoleAdminChanged` event to `_setAdminRole`. ([#2214](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2214)) - * Made all `public` functions in the token preset contracts `virtual`. ([#2257](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2257)) + +- `ReentrancyGuard`: reduced overhead of using the `nonReentrant` modifier. ([#2171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2171)) +- `AccessControl`: added a `RoleAdminChanged` event to `_setAdminRole`. ([#2214](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2214)) +- Made all `public` functions in the token preset contracts `virtual`. ([#2257](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2257)) ### Deprecations - * `SafeERC20`: deprecated `safeApprove`. ([#2268](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2268)) + +- `SafeERC20`: deprecated `safeApprove`. ([#2268](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2268)) ## 3.0.2 (2020-06-08) ### Improvements - * Added SPX license identifier to all contracts. ([#2235](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2235)) + +- Added SPX license identifier to all contracts. ([#2235](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2235)) ## 3.0.1 (2020-04-27) ### Bugfixes - * `ERC777`: fixed the `_approve` internal function not validating some of their arguments for non-zero addresses. ([#2213](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2213)) + +- `ERC777`: fixed the `_approve` internal function not validating some of their arguments for non-zero addresses. ([#2213](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2213)) ## 3.0.0 (2020-04-20) ### New features - * `AccessControl`: new contract for managing permissions in a system, replacement for `Ownable` and `Roles`. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112)) - * `SafeCast`: new functions to convert to and from signed and unsigned values: `toUint256` and `toInt256`. ([#2123](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2123)) - * `EnumerableMap`: a new data structure for key-value pairs (like `mapping`) that can be iterated over. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) + +- `AccessControl`: new contract for managing permissions in a system, replacement for `Ownable` and `Roles`. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112)) +- `SafeCast`: new functions to convert to and from signed and unsigned values: `toUint256` and `toInt256`. ([#2123](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2123)) +- `EnumerableMap`: a new data structure for key-value pairs (like `mapping`) that can be iterated over. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) ### Breaking changes - * `ERC721`: `burn(owner, tokenId)` was removed, use `burn(tokenId)` instead. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) - * `ERC721`: `_checkOnERC721Received` was removed. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) - * `ERC721`: `_transferFrom` and `_safeTransferFrom` were renamed to `_transfer` and `_safeTransfer`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162)) - * `Ownable`: removed `_transferOwnership`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162)) - * `PullPayment`, `Escrow`: `withdrawWithGas` was removed. The old `withdraw` function now forwards all gas. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) - * `Roles` was removed, use `AccessControl` as a replacement. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112)) - * `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114)) - * `Create2`: added an `amount` argument to `deploy` for contracts with `payable` constructors. ([#2117](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2117)) - * `Pausable`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) - * `Strings`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) - * `Counters`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) - * `SignedSafeMath`: moved to the `math` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) - * `ERC20Snapshot`: moved to the `token/ERC20` directory. `snapshot` was changed into an `internal` function. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) - * `Ownable`: moved to the `access` directory. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) - * `Ownable`: removed `isOwner`. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) - * `Secondary`: removed from the library, use `Ownable` instead. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) - * `Escrow`, `ConditionalEscrow`, `RefundEscrow`: these now use `Ownable` instead of `Secondary`, their external API changed accordingly. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) - * `ERC20`: removed `_burnFrom`. ([#2119](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2119)) - * `Address`: removed `toPayable`, use `payable(address)` instead. ([#2133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2133)) - * `ERC777`: `_send`, `_mint` and `_burn` now use the caller as the operator. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134)) - * `ERC777`: removed `_callsTokensToSend` and `_callTokensReceived`. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134)) - * `EnumerableSet`: renamed `get` to `at`. ([#2151](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2151)) - * `ERC165Checker`: functions no longer have a leading underscore. ([#2150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2150)) - * `ERC721Metadata`, `ERC721Enumerable`: these contracts were removed, and their functionality merged into `ERC721`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) - * `ERC721`: added a constructor for `name` and `symbol`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) - * `ERC20Detailed`: this contract was removed and its functionality merged into `ERC20`. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161)) - * `ERC20`: added a constructor for `name` and `symbol`. `decimals` now defaults to 18. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161)) - * `Strings`: renamed `fromUint256` to `toString` ([#2188](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2188)) + +- `ERC721`: `burn(owner, tokenId)` was removed, use `burn(tokenId)` instead. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) +- `ERC721`: `_checkOnERC721Received` was removed. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) +- `ERC721`: `_transferFrom` and `_safeTransferFrom` were renamed to `_transfer` and `_safeTransfer`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162)) +- `Ownable`: removed `_transferOwnership`. ([#2162](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2162)) +- `PullPayment`, `Escrow`: `withdrawWithGas` was removed. The old `withdraw` function now forwards all gas. ([#2125](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2125)) +- `Roles` was removed, use `AccessControl` as a replacement. ([#2112](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2112)) +- `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114)) +- `Create2`: added an `amount` argument to `deploy` for contracts with `payable` constructors. ([#2117](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2117)) +- `Pausable`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) +- `Strings`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) +- `Counters`: moved to the `utils` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) +- `SignedSafeMath`: moved to the `math` directory. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) +- `ERC20Snapshot`: moved to the `token/ERC20` directory. `snapshot` was changed into an `internal` function. ([#2122](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2122)) +- `Ownable`: moved to the `access` directory. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) +- `Ownable`: removed `isOwner`. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) +- `Secondary`: removed from the library, use `Ownable` instead. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) +- `Escrow`, `ConditionalEscrow`, `RefundEscrow`: these now use `Ownable` instead of `Secondary`, their external API changed accordingly. ([#2120](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2120)) +- `ERC20`: removed `_burnFrom`. ([#2119](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2119)) +- `Address`: removed `toPayable`, use `payable(address)` instead. ([#2133](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2133)) +- `ERC777`: `_send`, `_mint` and `_burn` now use the caller as the operator. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134)) +- `ERC777`: removed `_callsTokensToSend` and `_callTokensReceived`. ([#2134](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2134)) +- `EnumerableSet`: renamed `get` to `at`. ([#2151](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2151)) +- `ERC165Checker`: functions no longer have a leading underscore. ([#2150](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2150)) +- `ERC721Metadata`, `ERC721Enumerable`: these contracts were removed, and their functionality merged into `ERC721`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) +- `ERC721`: added a constructor for `name` and `symbol`. ([#2160](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2160)) +- `ERC20Detailed`: this contract was removed and its functionality merged into `ERC20`. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161)) +- `ERC20`: added a constructor for `name` and `symbol`. `decimals` now defaults to 18. ([#2161](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2161)) +- `Strings`: renamed `fromUint256` to `toString` ([#2188](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2188)) ## 2.5.1 (2020-04-24) ### Bugfixes - * `ERC777`: fixed the `_send` and `_approve` internal functions not validating some of their arguments for non-zero addresses. ([#2212](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2212)) + +- `ERC777`: fixed the `_send` and `_approve` internal functions not validating some of their arguments for non-zero addresses. ([#2212](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2212)) ## 2.5.0 (2020-02-04) ### New features - * `SafeCast.toUintXX`: new library for integer downcasting, which allows for safe operation on smaller types (e.g. `uint32`) when combined with `SafeMath`. ([#1926](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1926)) - * `ERC721Metadata`: added `baseURI`, which can be used for dramatic gas savings when all token URIs share a prefix (e.g. `http://api.myapp.com/tokens/`). ([#1970](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1970)) - * `EnumerableSet`: new library for storing enumerable sets of values. Only `AddressSet` is supported in this release. ([#2061](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/2061)) - * `Create2`: simple library to make usage of the `CREATE2` opcode easier. ([#1744](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1744)) + +- `SafeCast.toUintXX`: new library for integer downcasting, which allows for safe operation on smaller types (e.g. `uint32`) when combined with `SafeMath`. ([#1926](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1926)) +- `ERC721Metadata`: added `baseURI`, which can be used for dramatic gas savings when all token URIs share a prefix (e.g. `http://api.myapp.com/tokens/`). ([#1970](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1970)) +- `EnumerableSet`: new library for storing enumerable sets of values. Only `AddressSet` is supported in this release. ([#2061](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/2061)) +- `Create2`: simple library to make usage of the `CREATE2` opcode easier. ([#1744](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1744)) ### Improvements - * `ERC777`: `_burn` is now internal, providing more flexibility and making it easier to create tokens that deflate. ([#1908](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1908)) - * `ReentrancyGuard`: greatly improved gas efficiency by using the net gas metering mechanism introduced in the Istanbul hardfork. ([#1992](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1992), [#1996](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1996)) - * `ERC777`: improve extensibility by making `_send` and related functions `internal`. ([#2027](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2027)) - * `ERC721`: improved revert reason when transferring tokens to a non-recipient contract. ([#2018](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2018)) + +- `ERC777`: `_burn` is now internal, providing more flexibility and making it easier to create tokens that deflate. ([#1908](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1908)) +- `ReentrancyGuard`: greatly improved gas efficiency by using the net gas metering mechanism introduced in the Istanbul hardfork. ([#1992](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1992), [#1996](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1996)) +- `ERC777`: improve extensibility by making `_send` and related functions `internal`. ([#2027](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2027)) +- `ERC721`: improved revert reason when transferring tokens to a non-recipient contract. ([#2018](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2018)) ### Breaking changes - * `ERC165Checker` now requires a minimum Solidity compiler version of 0.5.10. ([#1829](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1829)) + +- `ERC165Checker` now requires a minimum Solidity compiler version of 0.5.10. ([#1829](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1829)) ## 2.4.0 (2019-10-29) ### New features - * `Address.toPayable`: added a helper to convert between address types without having to resort to low-level casting. ([#1773](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1773)) - * Facilities to make metatransaction-enabled contracts through the Gas Station Network. ([#1844](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1844)) - * `Address.sendValue`: added a replacement to Solidity's `transfer`, removing the fixed gas stipend. ([#1962](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1962)) - * Added replacement for functions that don't forward all gas (which have been deprecated): ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976)) - * `PullPayment.withdrawPaymentsWithGas(address payable payee)` - * `Escrow.withdrawWithGas(address payable payee)` - * `SafeMath`: added support for custom error messages to `sub`, `div` and `mod` functions. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828)) + +- `Address.toPayable`: added a helper to convert between address types without having to resort to low-level casting. ([#1773](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1773)) +- Facilities to make metatransaction-enabled contracts through the Gas Station Network. ([#1844](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1844)) +- `Address.sendValue`: added a replacement to Solidity's `transfer`, removing the fixed gas stipend. ([#1962](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1962)) +- Added replacement for functions that don't forward all gas (which have been deprecated): ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976)) + - `PullPayment.withdrawPaymentsWithGas(address payable payee)` + - `Escrow.withdrawWithGas(address payable payee)` +- `SafeMath`: added support for custom error messages to `sub`, `div` and `mod` functions. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828)) ### Improvements - * `Address.isContract`: switched from `extcodesize` to `extcodehash` for less gas usage. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802)) - * `ERC20` and `ERC777` updated to throw custom errors on subtraction overflows. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828)) + +- `Address.isContract`: switched from `extcodesize` to `extcodehash` for less gas usage. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802)) +- `ERC20` and `ERC777` updated to throw custom errors on subtraction overflows. ([#1828](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1828)) ### Deprecations - * Deprecated functions that don't forward all gas: ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976)) - * `PullPayment.withdrawPayments(address payable payee)` - * `Escrow.withdraw(address payable payee)` + +- Deprecated functions that don't forward all gas: ([#1976](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1976)) + - `PullPayment.withdrawPayments(address payable payee)` + - `Escrow.withdraw(address payable payee)` ### Breaking changes - * `Address` now requires a minimum Solidity compiler version of 0.5.5. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802)) - * `SignatureBouncer` has been removed from drafts, both to avoid confusions with the GSN and `GSNRecipientSignature` (previously called `GSNBouncerSignature`) and because the API was not very clear. ([#1879](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1879)) + +- `Address` now requires a minimum Solidity compiler version of 0.5.5. ([#1802](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1802)) +- `SignatureBouncer` has been removed from drafts, both to avoid confusions with the GSN and `GSNRecipientSignature` (previously called `GSNBouncerSignature`) and because the API was not very clear. ([#1879](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/1879)) ### How to upgrade from 2.4.0-beta The final 2.4.0 release includes a refactor of the GSN contracts that will be a breaking change for 2.4.0-beta users. - * The default empty implementations of `_preRelayedCall` and `_postRelayedCall` were removed and must now be explicitly implemented always in custom recipients. If your custom recipient didn't include an implementation, you can provide an empty one. - * `GSNRecipient`, `GSNBouncerBase`, and `GSNContext` were all merged into `GSNRecipient`. - * `GSNBouncerSignature` and `GSNBouncerERC20Fee` were renamed to `GSNRecipientSignature` and `GSNRecipientERC20Fee`. - * It is no longer necessary to inherit from `GSNRecipient` when using `GSNRecipientSignature` and `GSNRecipientERC20Fee`. +- The default empty implementations of `_preRelayedCall` and `_postRelayedCall` were removed and must now be explicitly implemented always in custom recipients. If your custom recipient didn't include an implementation, you can provide an empty one. +- `GSNRecipient`, `GSNBouncerBase`, and `GSNContext` were all merged into `GSNRecipient`. +- `GSNBouncerSignature` and `GSNBouncerERC20Fee` were renamed to `GSNRecipientSignature` and `GSNRecipientERC20Fee`. +- It is no longer necessary to inherit from `GSNRecipient` when using `GSNRecipientSignature` and `GSNRecipientERC20Fee`. For example, a contract using `GSNBouncerSignature` would have to be changed in the following way. @@ -557,81 +564,94 @@ For example, a contract using `GSNBouncerSignature` would have to be changed in Refer to the table below to adjust your inheritance list. -| 2.4.0-beta | 2.4.0 | -| ---------------------------------- | ---------------------------- | -| `GSNRecipient, GSNBouncerSignature`| `GSNRecipientSignature` | -| `GSNRecipient, GSNBouncerERC20Fee` | `GSNRecipientERC20Fee` | -| `GSNBouncerBase` | `GSNRecipient` | +| 2.4.0-beta | 2.4.0 | +| ----------------------------------- | ----------------------- | +| `GSNRecipient, GSNBouncerSignature` | `GSNRecipientSignature` | +| `GSNRecipient, GSNBouncerERC20Fee` | `GSNRecipientERC20Fee` | +| `GSNBouncerBase` | `GSNRecipient` | ## 2.3.0 (2019-05-27) ### New features - * `ERC1820`: added support for interacting with the [ERC1820](https://eips.ethereum.org/EIPS/eip-1820) registry contract (`IERC1820Registry`), as well as base contracts that can be registered as implementers there. ([#1677](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1677)) - * `ERC777`: support for the [ERC777 token](https://eips.ethereum.org/EIPS/eip-777), which has multiple improvements over `ERC20` (but is backwards compatible with it) such as built-in burning, a more straightforward permission system, and optional sender and receiver hooks on transfer (mandatory for contracts!). ([#1684](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1684)) - * All contracts now have revert reason strings, which give insight into error conditions, and help debug failing transactions. ([#1704](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1704)) + +- `ERC1820`: added support for interacting with the [ERC1820](https://eips.ethereum.org/EIPS/eip-1820) registry contract (`IERC1820Registry`), as well as base contracts that can be registered as implementers there. ([#1677](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1677)) +- `ERC777`: support for the [ERC777 token](https://eips.ethereum.org/EIPS/eip-777), which has multiple improvements over `ERC20` (but is backwards compatible with it) such as built-in burning, a more straightforward permission system, and optional sender and receiver hooks on transfer (mandatory for contracts!). ([#1684](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1684)) +- All contracts now have revert reason strings, which give insight into error conditions, and help debug failing transactions. ([#1704](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1704)) ### Improvements - * Reverted the Solidity version bump done in v2.2.0, setting the minimum compiler version to v0.5.0, to prevent unexpected build breakage. Users are encouraged however to stay on top of new compiler releases, which usually include bugfixes. ([#1729](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1729)) + +- Reverted the Solidity version bump done in v2.2.0, setting the minimum compiler version to v0.5.0, to prevent unexpected build breakage. Users are encouraged however to stay on top of new compiler releases, which usually include bugfixes. ([#1729](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1729)) ### Bugfixes - * `PostDeliveryCrowdsale`: some validations where skipped when paired with other crowdsale flavors, such as `AllowanceCrowdsale`, or `MintableCrowdsale` and `ERC20Capped`, which could cause buyers to not be able to claim their purchased tokens. ([#1721](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1721)) - * `ERC20._transfer`: the `from` argument was allowed to be the zero address, so it was possible to internally trigger a transfer of 0 tokens from the zero address. This address is not a valid destinatary of transfers, nor can it give or receive allowance, so this behavior was inconsistent. It now reverts. ([#1752](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1752)) + +- `PostDeliveryCrowdsale`: some validations where skipped when paired with other crowdsale flavors, such as `AllowanceCrowdsale`, or `MintableCrowdsale` and `ERC20Capped`, which could cause buyers to not be able to claim their purchased tokens. ([#1721](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1721)) +- `ERC20._transfer`: the `from` argument was allowed to be the zero address, so it was possible to internally trigger a transfer of 0 tokens from the zero address. This address is not a valid destinatary of transfers, nor can it give or receive allowance, so this behavior was inconsistent. It now reverts. ([#1752](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1752)) ## 2.2.0 (2019-03-14) ### New features - * `ERC20Snapshot`: create snapshots on demand of the token balances and total supply, to later retrieve and e.g. calculate dividends at a past time. ([#1617](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1617)) - * `SafeERC20`: `ERC20` contracts with no return value (i.e. that revert on failure) are now supported. ([#1655](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1655)) - * `ERC20`: added internal `_approve(address owner, address spender, uint256 value)`, allowing derived contracts to set the allowance of arbitrary accounts. ([#1609](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1609)) - * `ERC20Metadata`: added internal `_setTokenURI(string memory tokenURI)`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618)) - * `TimedCrowdsale`: added internal `_extendTime(uint256 newClosingTime)` as well as `TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime)` event allowing to extend the crowdsale, as long as it hasn't already closed. + +- `ERC20Snapshot`: create snapshots on demand of the token balances and total supply, to later retrieve and e.g. calculate dividends at a past time. ([#1617](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1617)) +- `SafeERC20`: `ERC20` contracts with no return value (i.e. that revert on failure) are now supported. ([#1655](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1655)) +- `ERC20`: added internal `_approve(address owner, address spender, uint256 value)`, allowing derived contracts to set the allowance of arbitrary accounts. ([#1609](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1609)) +- `ERC20Metadata`: added internal `_setTokenURI(string memory tokenURI)`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618)) +- `TimedCrowdsale`: added internal `_extendTime(uint256 newClosingTime)` as well as `TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime)` event allowing to extend the crowdsale, as long as it hasn't already closed. ### Improvements - * Upgraded the minimum compiler version to v0.5.2: this removes many Solidity warnings that were false positives. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606)) - * `ECDSA`: `recover` no longer accepts malleable signatures (those using upper-range values for `s`, or 0/1 for `v`). ([#1622](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1622)) - * ``ERC721``'s transfers are now more gas efficient due to removal of unnecessary `SafeMath` calls. ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610)) - * Fixed variable shadowing issues. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606)) + +- Upgraded the minimum compiler version to v0.5.2: this removes many Solidity warnings that were false positives. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606)) +- `ECDSA`: `recover` no longer accepts malleable signatures (those using upper-range values for `s`, or 0/1 for `v`). ([#1622](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1622)) +- `ERC721`'s transfers are now more gas efficient due to removal of unnecessary `SafeMath` calls. ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610)) +- Fixed variable shadowing issues. ([#1606](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1606)) ### Bugfixes - * (minor) `SafeERC20`: `safeApprove` wasn't properly checking for a zero allowance when attempting to set a non-zero allowance. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647)) + +- (minor) `SafeERC20`: `safeApprove` wasn't properly checking for a zero allowance when attempting to set a non-zero allowance. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647)) ### Breaking changes in drafts - * `TokenMetadata` has been renamed to `ERC20Metadata`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618)) - * The library `Counter` has been renamed to `Counters` and its API has been improved. See an example in `ERC721`, lines [17](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L17) and [204](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L204). ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610)) + +- `TokenMetadata` has been renamed to `ERC20Metadata`. ([#1618](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1618)) +- The library `Counter` has been renamed to `Counters` and its API has been improved. See an example in `ERC721`, lines [17](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L17) and [204](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/3cb4a00fce1da76196ac0ac3a0ae9702b99642b5/contracts/token/ERC721/ERC721.sol#L204). ([#1610](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1610)) ## 2.1.3 (2019-02-26) - * Backported `SafeERC20.safeApprove` bugfix. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647)) + +- Backported `SafeERC20.safeApprove` bugfix. ([#1647](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1647)) ## 2.1.2 (2019-01-17) - * Removed most of the test suite from the npm package, except `PublicRole.behavior.js`, which may be useful to users testing their own `Roles`. + +- Removed most of the test suite from the npm package, except `PublicRole.behavior.js`, which may be useful to users testing their own `Roles`. ## 2.1.1 (2019-01-04) - * Version bump to avoid conflict in the npm registry. + +- Version bump to avoid conflict in the npm registry. ## 2.1.0 (2019-01-04) ### New features - * Now targeting the 0.5.x line of Solidity compilers. For 0.4.24 support, use version 2.0 of OpenZeppelin. - * `WhitelistCrowdsale`: a crowdsale where only whitelisted accounts (`WhitelistedRole`) can purchase tokens. Adding or removing accounts from the whitelist is done by whitelist admins (`WhitelistAdminRole`). Similar to the pre-2.0 `WhitelistedCrowdsale`. ([#1525](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1525), [#1589](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1589)) - * `RefundablePostDeliveryCrowdsale`: replacement for `RefundableCrowdsale` (deprecated, see below) where tokens are only granted once the crowdsale ends (if it meets its goal). ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543)) - * `PausableCrowdsale`: allows for pausers (`PauserRole`) to pause token purchases. Other crowdsale operations (e.g. withdrawals and refunds, if applicable) are not affected. ([#832](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/832)) - * `ERC20`: `transferFrom` and `_burnFrom ` now emit `Approval` events, to represent the token's state comprehensively through events. ([#1524](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1524)) - * `ERC721`: added `_burn(uint256 tokenId)`, replacing the similar deprecated function (see below). ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550)) - * `ERC721`: added `_tokensOfOwner(address owner)`, allowing to internally retrieve the array of an account's owned tokens. ([#1522](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1522)) - * Crowdsales: all constructors are now `public`, meaning it is not necessary to extend these contracts in order to deploy them. The exception is `FinalizableCrowdsale`, since it is meaningless unless extended. ([#1564](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1564)) - * `SignedSafeMath`: added overflow-safe operations for signed integers (`int256`). ([#1559](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1559), [#1588](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1588)) + +- Now targeting the 0.5.x line of Solidity compilers. For 0.4.24 support, use version 2.0 of OpenZeppelin. +- `WhitelistCrowdsale`: a crowdsale where only whitelisted accounts (`WhitelistedRole`) can purchase tokens. Adding or removing accounts from the whitelist is done by whitelist admins (`WhitelistAdminRole`). Similar to the pre-2.0 `WhitelistedCrowdsale`. ([#1525](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1525), [#1589](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1589)) +- `RefundablePostDeliveryCrowdsale`: replacement for `RefundableCrowdsale` (deprecated, see below) where tokens are only granted once the crowdsale ends (if it meets its goal). ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543)) +- `PausableCrowdsale`: allows for pausers (`PauserRole`) to pause token purchases. Other crowdsale operations (e.g. withdrawals and refunds, if applicable) are not affected. ([#832](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/832)) +- `ERC20`: `transferFrom` and `_burnFrom ` now emit `Approval` events, to represent the token's state comprehensively through events. ([#1524](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1524)) +- `ERC721`: added `_burn(uint256 tokenId)`, replacing the similar deprecated function (see below). ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550)) +- `ERC721`: added `_tokensOfOwner(address owner)`, allowing to internally retrieve the array of an account's owned tokens. ([#1522](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1522)) +- Crowdsales: all constructors are now `public`, meaning it is not necessary to extend these contracts in order to deploy them. The exception is `FinalizableCrowdsale`, since it is meaningless unless extended. ([#1564](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1564)) +- `SignedSafeMath`: added overflow-safe operations for signed integers (`int256`). ([#1559](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1559), [#1588](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1588)) ### Improvements - * The compiler version required by `Array` was behind the rest of the library so it was updated to `v0.4.24`. ([#1553](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1553)) - * Now conforming to a 4-space indentation code style. ([1508](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1508)) - * `ERC20`: more gas efficient due to removed redundant `require`s. ([#1409](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1409)) - * `ERC721`: fixed a bug that prevented internal data structures from being properly cleaned, missing potential gas refunds. ([#1539](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1539) and [#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549)) - * `ERC721`: general gas savings on `transferFrom`, `_mint` and `_burn`, due to redundant `require`s and `SSTORE`s. ([#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549)) + +- The compiler version required by `Array` was behind the rest of the library so it was updated to `v0.4.24`. ([#1553](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1553)) +- Now conforming to a 4-space indentation code style. ([1508](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1508)) +- `ERC20`: more gas efficient due to removed redundant `require`s. ([#1409](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1409)) +- `ERC721`: fixed a bug that prevented internal data structures from being properly cleaned, missing potential gas refunds. ([#1539](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1539) and [#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549)) +- `ERC721`: general gas savings on `transferFrom`, `_mint` and `_burn`, due to redundant `require`s and `SSTORE`s. ([#1549](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1549)) ### Bugfixes ### Breaking changes ### Deprecations - * `ERC721._burn(address owner, uint256 tokenId)`: due to the `owner` parameter being unnecessary. ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550)) - * `RefundableCrowdsale`: due to trading abuse potential on crowdsales that miss their goal. ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543)) + +- `ERC721._burn(address owner, uint256 tokenId)`: due to the `owner` parameter being unnecessary. ([#1550](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1550)) +- `RefundableCrowdsale`: due to trading abuse potential on crowdsales that miss their goal. ([#1543](https://github.com/OpenZeppelin/openzeppelin-solidity/pull/1543)) diff --git a/certora/scripts/sanity.sh b/certora/scripts/sanity.sh index b6cdb4ec3..1c42bf67b 100644 --- a/certora/scripts/sanity.sh +++ b/certora/scripts/sanity.sh @@ -3,7 +3,7 @@ make -C certora munged for f in certora/harnesses/Wizard*.sol do echo "Processing $f" - file=$(basename $f) + file="$(basename $f)" echo ${file%.*} certoraRun certora/harnesses/$file \ --verify ${file%.*}:certora/specs/sanity.spec "$@" \ diff --git a/certora/scripts/verifyAll.sh b/certora/scripts/verifyAll.sh index 90d76912c..9b2f11c8c 100644 --- a/certora/scripts/verifyAll.sh +++ b/certora/scripts/verifyAll.sh @@ -6,8 +6,8 @@ for contract in certora/harnesses/Wizard*.sol; do for spec in certora/specs/*.spec; do - contractFile=$(basename $contract) - specFile=$(basename $spec) + contractFile="$(basename $contract)" + specFile="$(basename $spec)" if [[ "${specFile%.*}" != "RulesInProgress" ]]; then echo "Processing ${contractFile%.*} with $specFile" diff --git a/package-lock.json b/package-lock.json index c847f2c92..51a71854c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,10 @@ "openzeppelin-contracts-migrate-imports": "scripts/migrate-imports.js" }, "devDependencies": { + "@changesets/changelog-github": "^0.4.8", + "@changesets/cli": "^2.26.0", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", @@ -164,6 +168,611 @@ "node": ">=6.9.0" } }, + "node_modules/@changesets/apply-release-plan": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", + "integrity": "sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/config": "^2.3.0", + "@changesets/get-version-range-type": "^0.3.2", + "@changesets/git": "^2.0.0", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^5.4.1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz", + "integrity": "sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "semver": "^5.4.1" + } + }, + "node_modules/@changesets/assemble-release-plan/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", + "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==", + "dev": true, + "dependencies": { + "@changesets/types": "^5.2.1" + } + }, + "node_modules/@changesets/changelog-github": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.4.8.tgz", + "integrity": "sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==", + "dev": true, + "dependencies": { + "@changesets/get-github-info": "^0.5.2", + "@changesets/types": "^5.2.1", + "dotenv": "^8.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.0.tgz", + "integrity": "sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.3", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.0", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-release-plan": "^3.0.16", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^6.0.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^5.4.1", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@changesets/cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/cli/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": ">=4" + } + }, + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/cli/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@changesets/cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/config": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz", + "integrity": "sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/logger": "^0.0.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" + } + }, + "node_modules/@changesets/errors": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz", + "integrity": "sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==", + "dev": true, + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz", + "integrity": "sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==", + "dev": true, + "dependencies": { + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^5.4.1" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/get-dependents-graph/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/get-dependents-graph/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": ">=4" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/get-github-info": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.5.2.tgz", + "integrity": "sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==", + "dev": true, + "dependencies": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz", + "integrity": "sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/config": "^2.3.0", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz", + "integrity": "sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==", + "dev": true + }, + "node_modules/@changesets/git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz", + "integrity": "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" + } + }, + "node_modules/@changesets/logger": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz", + "integrity": "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==", + "dev": true, + "dependencies": { + "chalk": "^2.1.0" + } + }, + "node_modules/@changesets/logger/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/logger/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/logger/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/logger/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": ">=4" + } + }, + "node_modules/@changesets/logger/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/parse": { + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz", + "integrity": "sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==", + "dev": true, + "dependencies": { + "@changesets/types": "^5.2.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@changesets/pre": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz", + "integrity": "sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz", + "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/parse": "^0.3.16", + "@changesets/types": "^5.2.1", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + } + }, + "node_modules/@changesets/read/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@changesets/read/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@changesets/read/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@changesets/read/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": ">=4" + } + }, + "node_modules/@changesets/read/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@changesets/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", + "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", + "dev": true + }, + "node_modules/@changesets/write": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz", + "integrity": "sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^5.2.1", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, "node_modules/@ensdomains/address-encoder": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", @@ -1108,6 +1717,92 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@manypkg/find-root/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": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true + }, + "node_modules/@manypkg/get-packages/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": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages/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/@metamask/eth-sig-util": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", @@ -2284,6 +2979,30 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.0" + } + }, + "node_modules/@types/is-ci/node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -2305,12 +3024,24 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", @@ -2344,6 +3075,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz", + "integrity": "sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==", + "dev": true + }, "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -2637,6 +3374,24 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", @@ -2656,6 +3411,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2829,6 +3593,18 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/big-integer": { "version": "1.6.36", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", @@ -2975,6 +3751,15 @@ "node": ">=8" } }, + "node_modules/breakword": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz", + "integrity": "sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==", + "dev": true, + "dependencies": { + "wcwidth": "^1.0.1" + } + }, "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -3302,6 +4087,41 @@ "node": ">=4" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -3670,6 +4490,15 @@ "node": ">=8" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -4058,6 +4887,39 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/csv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", + "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", + "dev": true, + "dependencies": { + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" + }, + "engines": { + "node": ">= 0.1.90" + } + }, + "node_modules/csv-generate": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", + "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", + "dev": true + }, + "node_modules/csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "node_modules/csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", + "dev": true + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -4080,6 +4942,12 @@ "node": ">=0.10" } }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", @@ -4115,6 +4983,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -4169,6 +5071,18 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4381,6 +5295,15 @@ "no-case": "^2.2.0" } }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4550,6 +5473,15 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "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", @@ -6015,6 +6947,12 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6194,6 +7132,16 @@ "node": ">=8" } }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -6830,6 +7778,15 @@ "node": ">=6" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/hardhat": { "version": "2.12.5", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", @@ -7493,6 +8450,12 @@ "node": ">= 6" } }, + "node_modules/human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7880,6 +8843,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -8080,6 +9070,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -8159,6 +9161,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -8230,6 +9241,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -8370,6 +9387,15 @@ "graceful-fs": "^4.1.9" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -8458,6 +9484,12 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -8495,6 +9527,30 @@ "node": ">=0.10.0" } }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -8626,6 +9682,18 @@ "yallist": "^3.0.2" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -8684,6 +9752,142 @@ "node": ">= 0.10.0" } }, + "node_modules/meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -8819,6 +10023,15 @@ "dom-walk": "^0.1.0" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8852,6 +10065,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -8871,6 +10107,15 @@ "minipass": "^2.9.0" } }, + "node_modules/mixme": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", + "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -9658,6 +10903,12 @@ "node": ">=0.10.0" } }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -9667,6 +10918,27 @@ "node": ">=12.20" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -9963,6 +11235,94 @@ "node": ">=0.10.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/preferred-pm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", + "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preferred-pm/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/preferred-pm/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": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/preferred-pm/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": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/preferred-pm/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": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10004,24 +11364,6 @@ "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/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, - "engines": { - "node": ">=8" - } - }, "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", @@ -10049,38 +11391,6 @@ "node": ">=10" } }, - "node_modules/prettier-plugin-solidity/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prettier-plugin-solidity/node_modules/string-width/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/prettier-plugin-solidity/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/prettier-plugin-solidity/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -10133,6 +11443,12 @@ "node": ">= 0.10" } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -10367,6 +11683,30 @@ "node": ">=0.10.0" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -10417,6 +11757,31 @@ "node": ">=6.0.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -11351,6 +12716,154 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/smartwrap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", + "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", + "dev": true, + "dependencies": { + "array.prototype.flat": "^1.2.3", + "breakword": "^1.0.5", + "grapheme-splitter": "^1.0.4", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1", + "yargs": "^15.1.0" + }, + "bin": { + "smartwrap": "src/terminal-adapter.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/smartwrap/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/smartwrap/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/smartwrap/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/smartwrap/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/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/smartwrap/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smartwrap/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -12822,6 +14335,76 @@ "node": ">=0.10.0" } }, + "node_modules/spawndamnit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", + "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", + "dev": true, + "dependencies": { + "cross-spawn": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/spawndamnit/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/spawndamnit/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/spawndamnit/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawndamnit/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawndamnit/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/spawndamnit/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -12930,6 +14513,15 @@ "node": ">=0.10.0" } }, + "node_modules/stream-transform": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", + "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", + "dev": true, + "dependencies": { + "mixme": "^0.5.1" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -13282,6 +14874,18 @@ "node": ">=4.5" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/testrpc": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", @@ -13418,6 +15022,15 @@ "node": ">=0.6" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -13430,6 +15043,64 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, + "node_modules/tty-table": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz", + "integrity": "sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "csv": "^5.5.0", + "kleur": "^4.1.4", + "smartwrap": "^2.0.2", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1", + "yargs": "^17.1.1" + }, + "bin": { + "tty-table": "adapters/terminal-adapter.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tty-table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tty-table/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/tty-table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -13716,6 +15387,15 @@ "extsprintf": "^1.2.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web3": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", @@ -14198,6 +15878,19 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, + "node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dev": true, + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -14652,6 +16345,536 @@ "regenerator-runtime": "^0.13.11" } }, + "@changesets/apply-release-plan": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", + "integrity": "sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/config": "^2.3.0", + "@changesets/get-version-range-type": "^0.3.2", + "@changesets/git": "^2.0.0", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@changesets/assemble-release-plan": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz", + "integrity": "sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@changesets/changelog-git": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.1.14.tgz", + "integrity": "sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1" + } + }, + "@changesets/changelog-github": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.4.8.tgz", + "integrity": "sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==", + "dev": true, + "requires": { + "@changesets/get-github-info": "^0.5.2", + "@changesets/types": "^5.2.1", + "dotenv": "^8.1.0" + } + }, + "@changesets/cli": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.26.0.tgz", + "integrity": "sha512-0cbTiDms+ICTVtEwAFLNW0jBNex9f5+fFv3I771nBvdnV/mOjd1QJ4+f8KtVSOrwD9SJkk9xbDkWFb0oXd8d1Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.3", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.0", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-release-plan": "^3.0.16", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^6.0.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^5.4.1", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "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 + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@changesets/config": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz", + "integrity": "sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==", + "dev": true, + "requires": { + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/logger": "^0.0.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" + } + }, + "@changesets/errors": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz", + "integrity": "sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==", + "dev": true, + "requires": { + "extendable-error": "^0.1.5" + } + }, + "@changesets/get-dependents-graph": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz", + "integrity": "sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^5.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "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 + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@changesets/get-github-info": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.5.2.tgz", + "integrity": "sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==", + "dev": true, + "requires": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "@changesets/get-release-plan": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz", + "integrity": "sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/config": "^2.3.0", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3" + } + }, + "@changesets/get-version-range-type": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz", + "integrity": "sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==", + "dev": true + }, + "@changesets/git": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz", + "integrity": "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" + } + }, + "@changesets/logger": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz", + "integrity": "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==", + "dev": true, + "requires": { + "chalk": "^2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@changesets/parse": { + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz", + "integrity": "sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==", + "dev": true, + "requires": { + "@changesets/types": "^5.2.1", + "js-yaml": "^3.13.1" + } + }, + "@changesets/pre": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.14.tgz", + "integrity": "sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "@changesets/read": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz", + "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/parse": "^0.3.16", + "@changesets/types": "^5.2.1", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@changesets/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", + "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", + "dev": true + }, + "@changesets/write": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.2.3.tgz", + "integrity": "sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^5.2.1", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, "@ensdomains/address-encoder": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", @@ -15259,6 +17482,84 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "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, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + }, + "dependencies": { + "@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true + }, + "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, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + } + } + } + }, "@metamask/eth-sig-util": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", @@ -16186,6 +18487,23 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.0" + }, + "dependencies": { + "ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true + } + } + }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -16207,12 +18525,24 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", @@ -16246,6 +18576,12 @@ "@types/node": "*" } }, + "@types/semver": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz", + "integrity": "sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==", + "dev": true + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -16460,6 +18796,18 @@ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, "array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", @@ -16473,6 +18821,12 @@ "is-string": "^1.0.7" } }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -16616,6 +18970,15 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "requires": { + "is-windows": "^1.0.0" + } + }, "big-integer": { "version": "1.6.36", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", @@ -16735,6 +19098,15 @@ "fill-range": "^7.0.1" } }, + "breakword": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz", + "integrity": "sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -17013,6 +19385,31 @@ "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -17307,6 +19704,12 @@ } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, "clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -17636,6 +20039,36 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "csv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", + "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", + "dev": true, + "requires": { + "csv-generate": "^3.4.3", + "csv-parse": "^4.16.3", + "csv-stringify": "^5.6.5", + "stream-transform": "^2.1.3" + } + }, + "csv-generate": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", + "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", + "dev": true + }, + "csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", + "dev": true + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -17655,6 +20088,12 @@ "assert-plus": "^1.0.0" } }, + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, "death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", @@ -17676,6 +20115,30 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "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 + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -17714,6 +20177,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -17870,6 +20342,12 @@ "no-case": "^2.2.0" } }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -18013,6 +20491,15 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "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, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -19215,6 +21702,12 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -19364,6 +21857,16 @@ "path-exists": "^4.0.0" } }, + "find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "requires": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -19851,6 +22354,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "hardhat": { "version": "2.12.5", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", @@ -20382,6 +22891,12 @@ "debug": "4" } }, + "human-id": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", + "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -20656,6 +23171,23 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + }, + "dependencies": { + "ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true + } + } + }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -20789,6 +23321,15 @@ "has-tostringtag": "^1.0.0" } }, + "is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "requires": { + "better-path-resolve": "1.0.0" + } + }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -20847,6 +23388,12 @@ "call-bind": "^1.0.2" } }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -20911,6 +23458,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -21026,6 +23579,12 @@ "graceful-fs": "^4.1.9" } }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -21083,6 +23642,12 @@ "type-check": "~0.4.0" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -21113,6 +23678,26 @@ } } }, + "load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -21225,6 +23810,12 @@ "yallist": "^3.0.2" } }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -21271,6 +23862,106 @@ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true }, + "meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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 + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -21372,6 +24063,12 @@ "dom-walk": "^0.1.0" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -21399,6 +24096,25 @@ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + } + } + }, "minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -21418,6 +24134,12 @@ "minipass": "^2.9.0" } }, + "mixme": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", + "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", + "dev": true + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -22037,12 +24759,35 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, + "outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true + }, "p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -22273,6 +25018,66 @@ "pinkie": "^2.0.0" } }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "preferred-pm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", + "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "dependencies": { + "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, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -22293,22 +25098,9 @@ "requires": { "@solidity-parser/parser": "^0.14.5", "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7", - "string-width": "^4.2.3" + "solidity-comments-extractor": "^0.0.7" }, "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "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 - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -22327,34 +25119,6 @@ "lru-cache": "^6.0.0" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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 - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -22400,6 +25164,12 @@ "ipaddr.js": "1.9.1" } }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -22572,6 +25342,26 @@ } } }, + "read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -22610,6 +25400,27 @@ "minimatch": "^3.0.5" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + } + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -23320,6 +26131,123 @@ } } }, + "smartwrap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", + "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.3", + "breakword": "^1.0.5", + "grapheme-splitter": "^1.0.4", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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 + }, + "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 + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "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 + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -24433,6 +27361,69 @@ } } }, + "spawndamnit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", + "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", + "dev": true, + "requires": { + "cross-spawn": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -24525,6 +27516,15 @@ "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true }, + "stream-transform": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", + "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", + "dev": true, + "requires": { + "mixme": "^0.5.1" + } + }, "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -24805,6 +27805,12 @@ "yallist": "^3.1.1" } }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, "testrpc": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", @@ -24920,6 +27926,12 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -24932,6 +27944,48 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, + "tty-table": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz", + "integrity": "sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "csv": "^5.5.0", + "kleur": "^4.1.4", + "smartwrap": "^2.0.2", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1", + "yargs": "^17.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -25166,6 +28220,15 @@ "extsprintf": "^1.2.0" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "web3": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", @@ -25578,6 +28641,16 @@ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, + "which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dev": true, + "requires": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + } + }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", diff --git a/package.json b/package.json index 41d1131bb..45db40433 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,10 @@ }, "homepage": "https://openzeppelin.com/contracts/", "devDependencies": { + "@changesets/changelog-github": "^0.4.8", + "@changesets/cli": "^2.26.0", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", "@nomicfoundation/hardhat-network-helpers": "^1.0.3", "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", diff --git a/scripts/prepare-docs.sh b/scripts/prepare-docs.sh index 53a996b17..4fc0c957a 100755 --- a/scripts/prepare-docs.sh +++ b/scripts/prepare-docs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -set -o errexit +set -euo pipefail OUTDIR="$(node -p 'require("./docs/config.js").outputDir')" diff --git a/scripts/release/format-changelog.js b/scripts/release/format-changelog.js new file mode 100755 index 000000000..b8bcc8c71 --- /dev/null +++ b/scripts/release/format-changelog.js @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +// Adjusts the format of the changelog that changesets generates. +// This is run automatically when npm version is run. + +const fs = require('fs'); +const changelog = fs.readFileSync('CHANGELOG.md', 'utf8'); + +// Groups: +// - 1: Pull Request Number and URL +// - 2: Changeset entry +const RELEASE_LINE_REGEX = /^- (\[#.*?\]\(.*?\))?.*?! - (.*)$/gm; + +// Captures vX.Y.Z or vX.Y.Z-rc.W +const VERSION_TITLE_REGEX = /^## (\d+\.\d+\.\d+(-rc\.\d+)?)$/gm; + +const isPrerelease = process.env.PRERELEASE === 'true'; + +const formatted = changelog + // Remove titles + .replace(/^### Major Changes\n\n/gm, '') + .replace(/^### Minor Changes\n\n/gm, '') + .replace(/^### Patch Changes\n\n/gm, '') + // Remove extra whitespace between items + .replace(/^(- \[.*\n)\n(?=-)/gm, '$1') + // Format each release line + .replace(RELEASE_LINE_REGEX, (_, pr, entry) => (pr ? `- ${entry} (${pr})` : `- ${entry}`)) + // Add date to new version + .replace(VERSION_TITLE_REGEX, `\n## $1 (${new Date().toISOString().split('T')[0]})`) + // Conditionally allow vX.Y.Z.rc-.W sections only in prerelease + .replace(/^## \d\.\d\.\d-rc\S+[^]+?(?=^#)/gm, section => (isPrerelease ? section : '')); + +fs.writeFileSync('CHANGELOG.md', formatted); diff --git a/scripts/release/release.sh b/scripts/release/release.sh deleted file mode 100755 index af5091b62..000000000 --- a/scripts/release/release.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -o errexit - -# Default the prerelease version suffix to rc -: ${PRERELEASE_SUFFIX:=rc} - -log() { - # Print to stderr to prevent this from being 'returned' - echo "$@" > /dev/stderr -} - -current_version() { - echo "v$(node --print --eval "require('./package.json').version")" -} - -current_release_branch() { - v="$(current_version)" # 3.3.0-rc.0 - vf="${v%-"$PRERELEASE_SUFFIX".*}" # 3.3.0 - r="${vf%.*}" # 3.3 - echo "release-$r" -} - -assert_current_branch() { - current_branch="$(git symbolic-ref --short HEAD)" - expected_branch="$1" - if [[ "$current_branch" != "$expected_branch" ]]; then - log "Current branch '$current_branch' is not '$expected_branch'" - exit 1 - fi -} - -push_release_branch_and_tag() { - git push upstream "$(current_release_branch)" "$(current_version)" -} - -publish() { - dist_tag="$1" - - log "Publishing @openzeppelin/contracts on npm" - cd contracts - npm publish --tag "$dist_tag" --otp "$(prompt_otp)" - cd .. - - if [[ "$dist_tag" == "latest" ]]; then - npm dist-tag rm --otp "$(prompt_otp)" @openzeppelin/contracts next - fi -} - -push_and_publish() { - dist_tag="$1" - - log "Pushing release branch and tags to upstream" - push_release_branch_and_tag - - publish "$dist_tag" -} - -prompt_otp() { - log -n "Enter npm 2FA token: " - read -r otp - echo "$otp" -} - -environment_check() { - if ! git remote get-url upstream &> /dev/null; then - log "No 'upstream' remote found" - exit 1 - fi - - if npm whoami &> /dev/null; then - log "Will publish as '$(npm whoami)'" - else - log "Not logged in into npm, run 'npm login' first" - exit 1 - fi -} - -environment_check - -if [[ "$*" == "push" ]]; then - push_and_publish next - -elif [[ "$*" == "start minor" ]]; then - log "Creating new minor pre-release" - - assert_current_branch master - - # Create temporary release branch - git checkout -b release-temp - - # This bumps minor and adds prerelease suffix, commits the changes, and tags the commit - npm version preminor --preid="$PRERELEASE_SUFFIX" - - # Rename the release branch - git branch --move "$(current_release_branch)" - - push_and_publish next - -elif [[ "$*" == "start major" ]]; then - log "Creating new major pre-release" - - assert_current_branch master - - # Create temporary release branch - git checkout -b release-temp - - # This bumps major and adds prerelease suffix, commits the changes, and tags the commit - npm version premajor --preid="$PRERELEASE_SUFFIX" - - # Rename the release branch - git branch --move "$(current_release_branch)" - - push_and_publish next - -elif [[ "$*" == "rc" ]]; then - log "Bumping pre-release" - - assert_current_branch "$(current_release_branch)" - - # Bumps prerelease number, commits and tags - npm version prerelease - - push_and_publish next - -elif [[ "$*" == "final" ]]; then - # Update changelog release date, remove prerelease suffix, tag, push to git, publish in npm, remove next dist-tag - log "Creating final release" - - assert_current_branch "$(current_release_branch)" - - # This will remove the prerelease suffix from the version - npm version patch - - push_release_branch_and_tag - - push_and_publish latest - - log "Remember to merge the release branch into master and push upstream" - -else - log "Unknown command: '$*'" - exit 1 -fi diff --git a/scripts/release/synchronize-versions.js b/scripts/release/synchronize-versions.js index c17ad614d..15aa25993 100755 --- a/scripts/release/synchronize-versions.js +++ b/scripts/release/synchronize-versions.js @@ -4,13 +4,12 @@ // This is run automatically when npm version is run. const fs = require('fs'); -const cp = require('child_process'); -setVersion('contracts/package.json'); +setVersion('package.json', 'contracts/package.json'); -function setVersion(file) { - const json = JSON.parse(fs.readFileSync(file)); - json.version = process.env.npm_package_version; - fs.writeFileSync(file, JSON.stringify(json, null, 2) + '\n'); - cp.execFileSync('git', ['add', file]); +function setVersion(from, to) { + const fromJson = JSON.parse(fs.readFileSync(from)); + const toJson = JSON.parse(fs.readFileSync(to)); + toJson.version = fromJson.version; + fs.writeFileSync(to, JSON.stringify(toJson, null, 2) + '\n'); } diff --git a/scripts/release/update-changelog-release-date.js b/scripts/release/update-changelog-release-date.js deleted file mode 100755 index b1a4a177f..000000000 --- a/scripts/release/update-changelog-release-date.js +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node - -// Sets the release date of the current release in the changelog. -// This is run automatically when npm version is run. - -const fs = require('fs'); -const cp = require('child_process'); - -const suffix = process.env.PRERELEASE_SUFFIX || 'rc'; - -const changelog = fs.readFileSync('CHANGELOG.md', 'utf8'); - -// The changelog entry to be updated looks like this: -// ## Unreleased -// We need to add the version and release date in a YYYY-MM-DD format, so that it looks like this: -// ## 2.5.3 (2019-04-25) - -const pkg = require('../../package.json'); -const version = pkg.version.replace(new RegExp('-' + suffix + '\\..*'), ''); - -const header = new RegExp(`^## (Unreleased|${version})$`, 'm'); - -if (!header.test(changelog)) { - console.error('Missing changelog entry'); - process.exit(1); -} - -const newHeader = - pkg.version.indexOf(suffix) === -1 ? `## ${version} (${new Date().toISOString().split('T')[0]})` : `## ${version}`; - -fs.writeFileSync('CHANGELOG.md', changelog.replace(header, newHeader)); - -cp.execSync('git add CHANGELOG.md', { stdio: 'inherit' }); diff --git a/scripts/release/update-comment.js b/scripts/release/update-comment.js index da2028c68..eb9f937ca 100755 --- a/scripts/release/update-comment.js +++ b/scripts/release/update-comment.js @@ -32,5 +32,3 @@ for (const file of files) { ); fs.writeFileSync(file, updated); } - -run('git', 'add', '--update', 'contracts'); diff --git a/scripts/release/version.sh b/scripts/release/version.sh index 73d3026d9..7b0ddead3 100755 --- a/scripts/release/version.sh +++ b/scripts/release/version.sh @@ -1,8 +1,10 @@ #!/usr/bin/env bash -set -o errexit +set -euo pipefail -scripts/release/update-changelog-release-date.js +changeset version + +scripts/release/format-changelog.js scripts/release/synchronize-versions.js scripts/release/update-comment.js diff --git a/scripts/release/workflow/exit-prerelease.sh b/scripts/release/workflow/exit-prerelease.sh new file mode 100644 index 000000000..bcf9b9ae9 --- /dev/null +++ b/scripts/release/workflow/exit-prerelease.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail + +npx changeset pre exit rc +git add . +git commit -m "Exit release candidate" +git push origin diff --git a/scripts/release/workflow/github-release.js b/scripts/release/workflow/github-release.js new file mode 100644 index 000000000..92a47d9d7 --- /dev/null +++ b/scripts/release/workflow/github-release.js @@ -0,0 +1,47 @@ +const { readFileSync } = require('fs'); +const { join } = require('path'); +const { version } = require(join(__dirname, '../../../package.json')); + +module.exports = async ({ github, context }) => { + const changelog = readFileSync('CHANGELOG.md', 'utf8'); + + await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: `v${version}`, + body: extractSection(changelog, version), + prerelease: process.env.PRERELEASE === 'true', + }); +}; + +// From https://github.com/frangio/extract-changelog/blob/master/src/utils/word-regexp.ts +function makeWordRegExp(word) { + const start = word.length > 0 && /\b/.test(word[0]) ? '\\b' : ''; + const end = word.length > 0 && /\b/.test(word[word.length - 1]) ? '\\b' : ''; + return new RegExp(start + [...word].map(c => (/[a-z0-9]/i.test(c) ? c : '\\' + c)).join('') + end); +} + +// From https://github.com/frangio/extract-changelog/blob/master/src/core.ts +function extractSection(document, wantedHeading) { + // ATX Headings as defined in GitHub Flavored Markdown (https://github.github.com/gfm/#atx-headings) + const heading = /^ {0,3}(?#{1,6})(?: [ \t\v\f]*(?.*?)[ \t\v\f]*)?(?:[\n\r]+|$)/gm; + + const wantedHeadingRe = makeWordRegExp(wantedHeading); + + let start, end; + + for (const m of document.matchAll(heading)) { + if (!start) { + if (m.groups.text.search(wantedHeadingRe) === 0) { + start = m; + } + } else if (m.groups.lead.length <= start.groups.lead.length) { + end = m; + break; + } + } + + if (start) { + return document.slice(start.index + start[0].length, end?.index); + } +} diff --git a/scripts/release/workflow/pack.sh b/scripts/release/workflow/pack.sh new file mode 100644 index 000000000..798417d3d --- /dev/null +++ b/scripts/release/workflow/pack.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -euo pipefail + +dist_tag() { + PACKAGE_JSON_NAME="$(jq -r .name ./package.json)" + LATEST_NPM_VERSION="$(npm info "$PACKAGE_JSON_NAME" version)" + PACKAGE_JSON_VERSION="$(jq -r .version ./package.json)" + + if [ "$PRERELEASE" = "true" ]; then + echo "next" + elif npx semver -r ">$LATEST_NPM_VERSION" "$PACKAGE_JSON_VERSION" > /dev/null; then + echo "latest" + else + # This is a patch for an older version + # npm can't publish without a tag + echo "tmp" + fi +} + +cd contracts +TARBALL="$(npm pack | tee /dev/stderr | tail -1)" +echo "tarball=$(pwd)/$TARBALL" >> $GITHUB_OUTPUT +echo "tag=$(dist_tag)" >> $GITHUB_OUTPUT +cd .. diff --git a/scripts/release/workflow/prepare-release-merge.sh b/scripts/release/workflow/prepare-release-merge.sh new file mode 100644 index 000000000..8be96922c --- /dev/null +++ b/scripts/release/workflow/prepare-release-merge.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Define merge branch name +MERGE_BRANCH=merge/$GITHUB_REF_NAME + +# Create the branch and force to start from ref +git checkout -B "$MERGE_BRANCH" "$GITHUB_REF_NAME" + +# Get deleted changesets in this branch that might conflict with master +readarray -t DELETED_CHANGESETS < <(git diff origin/master --name-only -- '.changeset/*.md') + +# Merge master, which will take those files cherry-picked. Auto-resolve conflicts favoring master. +git merge origin/master -m "Merge master to $GITHUB_REF_NAME" -X theirs + +# Remove the originally deleted changesets to correctly sync with master +rm -f "${DELETED_CHANGESETS[@]}" + +git add .changeset/ + +# Allow empty here since there may be no changes if `rm -f` failed for all changesets +git commit --allow-empty -m "Sync changesets with master" +git push -f origin "$MERGE_BRANCH" diff --git a/scripts/release/workflow/publish.sh b/scripts/release/workflow/publish.sh new file mode 100644 index 000000000..89a0aed3c --- /dev/null +++ b/scripts/release/workflow/publish.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Intentionally escape $ to avoid interpolation and writing the token to disk +echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc + +# Actual publish +npm publish "$TARBALL" --tag "$TAG" + +if [ "$TAG" = "tmp" ]; then + # Remove tmp tag + PACKAGE_JSON_NAME="$(tar xfO "$TARBALL" package/package.json | jq -r .name)" + npm dist-tag rm "$PACKAGE_JSON_NAME" "$TAG" +fi diff --git a/scripts/release/workflow/rerun.js b/scripts/release/workflow/rerun.js new file mode 100644 index 000000000..f48ce6ea2 --- /dev/null +++ b/scripts/release/workflow/rerun.js @@ -0,0 +1,7 @@ +module.exports = ({ github, context }) => + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'release-cycle.yml', + ref: process.env.REF || process.env.GITHUB_REF_NAME, + }); diff --git a/scripts/release/workflow/set-changesets-pr-title.js b/scripts/release/workflow/set-changesets-pr-title.js new file mode 100644 index 000000000..59b03b22a --- /dev/null +++ b/scripts/release/workflow/set-changesets-pr-title.js @@ -0,0 +1,17 @@ +const { coerce, inc, rsort } = require('semver'); +const { join } = require('path'); +const { version } = require(join(__dirname, '../../../package.json')); + +module.exports = async ({ core }) => { + // Variables not in the context + const refName = process.env.GITHUB_REF_NAME; + + // Compare package.json version's next patch vs. first version patch + // A recently opened branch will give the next patch for the previous minor + // So, we get the max against the patch 0 of the release branch's version + const branchPatch0 = coerce(refName.replace('release-v', '')).version; + const packageJsonNextPatch = inc(version, 'patch'); + const [nextVersion] = rsort([branchPatch0, packageJsonNextPatch], false); + + core.exportVariable('TITLE', `Release v${nextVersion}`); +}; diff --git a/scripts/release/workflow/start.sh b/scripts/release/workflow/start.sh new file mode 100644 index 000000000..6e5d78b82 --- /dev/null +++ b/scripts/release/workflow/start.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Set changeset status location +# This is needed because `changeset status --output` only works with relative routes +CHANGESETS_STATUS_JSON="$(realpath --relative-to=. "$RUNNER_TEMP/status.json")" + +# Save changeset status to temp file +npx changeset status --output="$CHANGESETS_STATUS_JSON" + +# Defensive assertion. SHOULD NOT BE REACHED +if [ "$(jq '.releases | length' "$CHANGESETS_STATUS_JSON")" != 1 ]; then + echo "::error file=$CHANGESETS_STATUS_JSON::The status doesn't contain only 1 release" + exit 1; +fi; + +# Create branch +BRANCH_SUFFIX="$(jq -r '.releases[0].newVersion | gsub("\\.\\d+$"; "")' $CHANGESETS_STATUS_JSON)" +RELEASE_BRANCH="release-v$BRANCH_SUFFIX" +git checkout -b "$RELEASE_BRANCH" + +# Output branch +echo "branch=$RELEASE_BRANCH" >> $GITHUB_OUTPUT + +# Enter in prerelease state +npx changeset pre enter rc +git add . +git commit -m "Start release candidate" + +# Push branch +git push origin "$RELEASE_BRANCH" diff --git a/scripts/release/workflow/state.js b/scripts/release/workflow/state.js new file mode 100644 index 000000000..4d905e260 --- /dev/null +++ b/scripts/release/workflow/state.js @@ -0,0 +1,104 @@ +const { readPreState } = require('@changesets/pre'); +const { default: readChangesets } = require('@changesets/read'); +const { join } = require('path'); +const { version } = require(join(__dirname, '../../../package.json')); + +module.exports = async ({ github, context, core }) => { + const state = await getState({ github, context, core }); + + function setOutput(key, value) { + core.info(`State ${key} = ${value}`); + core.setOutput(key, value); + } + + // Jobs to trigger + setOutput('start', shouldRunStart(state)); + setOutput('promote', shouldRunPromote(state)); + setOutput('changesets', shouldRunChangesets(state)); + setOutput('publish', shouldRunPublish(state)); + setOutput('merge', shouldRunMerge(state)); + + // Global Variables + setOutput('is_prerelease', state.prerelease); +}; + +function shouldRunStart({ isMaster, isWorkflowDispatch, botRun }) { + return isMaster && isWorkflowDispatch && !botRun; +} + +function shouldRunPromote({ isReleaseBranch, isWorkflowDispatch, botRun }) { + return isReleaseBranch && isWorkflowDispatch && !botRun; +} + +function shouldRunChangesets({ isReleaseBranch, isPush, isWorkflowDispatch, botRun }) { + return (isReleaseBranch && isPush) || (isReleaseBranch && isWorkflowDispatch && botRun); +} + +function shouldRunPublish({ isReleaseBranch, isPush, hasPendingChangesets }) { + return isReleaseBranch && isPush && !hasPendingChangesets; +} + +function shouldRunMerge({ + isReleaseBranch, + isPush, + prerelease, + isCurrentFinalVersion, + hasPendingChangesets, + prBackExists, +}) { + return isReleaseBranch && isPush && !prerelease && isCurrentFinalVersion && !hasPendingChangesets && prBackExists; +} + +async function getState({ github, context, core }) { + // Variables not in the context + const refName = process.env.GITHUB_REF_NAME; + const botRun = process.env.TRIGGERING_ACTOR === 'github-actions[bot]'; + + const { changesets, preState } = await readChangesetState(); + + // Static vars + const state = { + refName, + hasPendingChangesets: changesets.length > 0, + prerelease: preState?.mode === 'pre', + isMaster: refName === 'master', + isReleaseBranch: refName.startsWith('release-v'), + isWorkflowDispatch: context.eventName === 'workflow_dispatch', + isPush: context.eventName === 'push', + isCurrentFinalVersion: !version.includes('-rc.'), + botRun, + }; + + // Async vars + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:merge/${state.refName}`, + base: 'master', + state: 'open', + }); + + state.prBackExists = prs.length === 0; + + // Log every state value in debug mode + if (core.isDebug()) for (const [key, value] of Object.entries(state)) core.debug(`${key}: ${value}`); + + return state; +} + +// From https://github.com/changesets/action/blob/v1.4.1/src/readChangesetState.ts +async function readChangesetState(cwd = process.cwd()) { + const preState = await readPreState(cwd); + const isInPreMode = preState !== undefined && preState.mode === 'pre'; + + let changesets = await readChangesets(cwd); + + if (isInPreMode) { + changesets = changesets.filter(x => !preState.changesets.includes(x.id)); + } + + return { + preState: isInPreMode ? preState : undefined, + changesets, + }; +} From 5a0863ccf07f177057025508607e9486e922a002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Wed, 18 Jan 2023 20:14:40 -0600 Subject: [PATCH 132/197] Change job titles in `release-cycle.yml` (#3972) --- .github/workflows/release-cycle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index 06d12690d..4fe09a4eb 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -83,7 +83,7 @@ jobs: changesets: needs: state - name: Changesets PR + name: Update PR to release permissions: contents: write pull-requests: write @@ -149,7 +149,7 @@ jobs: merge: needs: state - name: Release PR back to master + name: Create PR back to master permissions: contents: write pull-requests: write From c8b466b7b55aee3967af21cb3c659ec07e93021d Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 6 Dec 2022 11:55:49 -0300 Subject: [PATCH 133/197] Disable Foundry for slither-action (cherry picked from commit 4072e853fe759122056a32e2b006d2c3968e0f28) --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 2fba4415b..17d9e3578 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -76,6 +76,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up environment uses: ./.github/actions/setup + - run: rm foundry.toml - uses: crytic/slither-action@v0.2.0 codespell: From dc1ffa79e7a553824cb23531f0f0e05d6161c173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Thu, 19 Jan 2023 13:36:54 -0600 Subject: [PATCH 134/197] Fix changeset action access to ref branch (#3978) Co-authored-by: Francisco Giordano --- .github/workflows/changeset.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/changeset.yml b/.github/workflows/changeset.yml index 38fe3f70e..5fe70cfcc 100644 --- a/.github/workflows/changeset.yml +++ b/.github/workflows/changeset.yml @@ -20,7 +20,9 @@ jobs: if: ${{ !contains(github.event.pull_request.labels.*.name, 'ignore-changeset') }} steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Include history so Changesets finds merge-base - name: Set up environment uses: ./.github/actions/setup - name: Check changeset - run: npx changeset status --since=${{ github.base_ref }} + run: npx changeset status --since=origin/${{ github.base_ref }} From afcdc58419c0771a2ab822fe368aa591229cbeee Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 19 Jan 2023 17:21:17 -0300 Subject: [PATCH 135/197] Delete tag next once latest is published (#3973) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ernesto García --- scripts/release/workflow/publish.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/release/workflow/publish.sh b/scripts/release/workflow/publish.sh index 89a0aed3c..f9e2802d9 100644 --- a/scripts/release/workflow/publish.sh +++ b/scripts/release/workflow/publish.sh @@ -8,8 +8,13 @@ echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc # Actual publish npm publish "$TARBALL" --tag "$TAG" -if [ "$TAG" = "tmp" ]; then - # Remove tmp tag +delete_tag() { PACKAGE_JSON_NAME="$(tar xfO "$TARBALL" package/package.json | jq -r .name)" - npm dist-tag rm "$PACKAGE_JSON_NAME" "$TAG" + npm dist-tag rm "$PACKAGE_JSON_NAME" "$1" +} + +if [ "$TAG" = tmp ]; then + delete_tag "$TAG" +elif ["$TAG" = latest ]; then + delete_tag next fi From 2a62fb4a2d9b9248aa15bba9c89d75a7ddc8cfc6 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 19 Jan 2023 22:34:15 +0100 Subject: [PATCH 136/197] Improve TransparentUpgradeableProxy's transparency (#3977) Co-authored-by: Francisco --- .changeset/many-panthers-hide.md | 5 +++++ .../mocks/proxy/ClashingImplementation.sol | 7 +++---- .../TransparentUpgradeableProxy.sol | 20 +++++++++++++++---- .../TransparentUpgradeableProxy.behaviour.js | 15 +++++++++++--- 4 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 .changeset/many-panthers-hide.md diff --git a/.changeset/many-panthers-hide.md b/.changeset/many-panthers-hide.md new file mode 100644 index 000000000..5f04c99df --- /dev/null +++ b/.changeset/many-panthers-hide.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`TransparentUpgradeableProxy`: support value passthrough for all ifAdmin function. diff --git a/contracts/mocks/proxy/ClashingImplementation.sol b/contracts/mocks/proxy/ClashingImplementation.sol index 80aca0c29..5c272a89d 100644 --- a/contracts/mocks/proxy/ClashingImplementation.sol +++ b/contracts/mocks/proxy/ClashingImplementation.sol @@ -3,12 +3,11 @@ pragma solidity ^0.8.0; /** - * @dev Implementation contract with an admin() function made to clash with - * @dev TransparentUpgradeableProxy's to test correct functioning of the - * @dev Transparent Proxy feature. + * @dev Implementation contract with a payable admin() function made to clash with TransparentUpgradeableProxy's to + * test correct functioning of the Transparent Proxy feature. */ contract ClashingImplementation { - function admin() external pure returns (address) { + function admin() external payable returns (address) { return 0x0000000000000000000000000000000011111142; } diff --git a/contracts/proxy/transparent/TransparentUpgradeableProxy.sol b/contracts/proxy/transparent/TransparentUpgradeableProxy.sol index 3685360e7..155a22e01 100644 --- a/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +++ b/contracts/proxy/transparent/TransparentUpgradeableProxy.sol @@ -55,7 +55,8 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ - function admin() external ifAdmin returns (address admin_) { + function admin() external payable ifAdmin returns (address admin_) { + _requireZeroValue(); admin_ = _getAdmin(); } @@ -68,7 +69,8 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` */ - function implementation() external ifAdmin returns (address implementation_) { + function implementation() external payable ifAdmin returns (address implementation_) { + _requireZeroValue(); implementation_ = _implementation(); } @@ -79,7 +81,8 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { * * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}. */ - function changeAdmin(address newAdmin) external virtual ifAdmin { + function changeAdmin(address newAdmin) external payable virtual ifAdmin { + _requireZeroValue(); _changeAdmin(newAdmin); } @@ -88,7 +91,8 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { * * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}. */ - function upgradeTo(address newImplementation) external ifAdmin { + function upgradeTo(address newImplementation) external payable ifAdmin { + _requireZeroValue(); _upgradeToAndCall(newImplementation, bytes(""), false); } @@ -117,4 +121,12 @@ contract TransparentUpgradeableProxy is ERC1967Proxy { require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target"); super._beforeFallback(); } + + /** + * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to + * emulate some proxy functions being non-payable while still allowing value to pass through. + */ + function _requireZeroValue() private { + require(msg.value == 0); + } } diff --git a/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js b/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js index da8f21bee..3a10357a9 100644 --- a/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js +++ b/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js @@ -330,14 +330,23 @@ module.exports = function shouldBehaveLikeTransparentUpgradeableProxy(createProx ); }); - context('when function names clash', function () { + describe('when function names clash', function () { it('when sender is proxy admin should run the proxy function', async function () { - const value = await this.proxy.admin.call({ from: proxyAdminAddress }); + const value = await this.proxy.admin.call({ from: proxyAdminAddress, value: 0 }); expect(value).to.be.equal(proxyAdminAddress); }); it('when sender is other should delegate to implementation', async function () { - const value = await this.proxy.admin.call({ from: anotherAccount }); + const value = await this.proxy.admin.call({ from: anotherAccount, value: 0 }); + expect(value).to.be.equal('0x0000000000000000000000000000000011111142'); + }); + + it('when sender is proxy admin value should not be accepted', async function () { + await expectRevert.unspecified(this.proxy.admin.call({ from: proxyAdminAddress, value: 1 })); + }); + + it('when sender is other value should be accepted', async function () { + const value = await this.proxy.admin.call({ from: anotherAccount, value: 1 }); expect(value).to.be.equal('0x0000000000000000000000000000000011111142'); }); }); From c404862cba658deae081a9e437942a241eee78c0 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 19 Jan 2023 23:00:53 +0100 Subject: [PATCH 137/197] Use oz-upgrades-unsafe-allow-reachable in ERC1967Upgrade (#3971) Co-authored-by: Francisco --- .changeset/strong-bulldogs-buy.md | 5 +++++ .changeset/yellow-swans-cover.md | 5 +++++ contracts/proxy/ERC1967/ERC1967Upgrade.sol | 2 -- contracts/proxy/utils/UUPSUpgradeable.sol | 4 ++++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 .changeset/strong-bulldogs-buy.md create mode 100644 .changeset/yellow-swans-cover.md diff --git a/.changeset/strong-bulldogs-buy.md b/.changeset/strong-bulldogs-buy.md new file mode 100644 index 000000000..001b0f88f --- /dev/null +++ b/.changeset/strong-bulldogs-buy.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC1967Upgrade`: removed contract-wide `oz-upgrades-unsafe-allow delegatecall` annotation, replaced by granular annotation in `UUPSUpgradeable`. diff --git a/.changeset/yellow-swans-cover.md b/.changeset/yellow-swans-cover.md new file mode 100644 index 000000000..ee1680178 --- /dev/null +++ b/.changeset/yellow-swans-cover.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`UUPSUpgradeable`: added granular `oz-upgrades-unsafe-allow-reachable` annotation to improve upgrade safety checks on latest version of the Upgrades Plugins (starting with `@openzeppelin/upgrades-core@1.21.0`). diff --git a/contracts/proxy/ERC1967/ERC1967Upgrade.sol b/contracts/proxy/ERC1967/ERC1967Upgrade.sol index 0f32d4d23..0680f3549 100644 --- a/contracts/proxy/ERC1967/ERC1967Upgrade.sol +++ b/contracts/proxy/ERC1967/ERC1967Upgrade.sol @@ -13,8 +13,6 @@ import "../../utils/StorageSlot.sol"; * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ - * - * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967Upgrade { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index 8b7366328..bb696f6fa 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -62,6 +62,8 @@ abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade { * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. + * + * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); @@ -75,6 +77,8 @@ abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade { * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. + * + * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); From b1c2c43d6af6adf0b0a74cc77683b1d13d66e8bc Mon Sep 17 00:00:00 2001 From: Vittorio Minacori Date: Mon, 23 Jan 2023 11:30:11 +0100 Subject: [PATCH 138/197] Lint should not override files (#3988) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45db40433..b4035b820 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "lint:fix": "npm run lint:js:fix && npm run lint:sol:fix", "lint:js": "prettier --loglevel warn --ignore-path .gitignore '**/*.{js,ts}' --check && eslint --ignore-path .gitignore .", "lint:js:fix": "prettier --loglevel warn --ignore-path .gitignore '**/*.{js,ts}' --write && eslint --ignore-path .gitignore . --fix", - "lint:sol": "prettier --loglevel warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --write && solhint '{contracts,test}/**/*.sol'", + "lint:sol": "prettier --loglevel warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --check && solhint '{contracts,test}/**/*.sol'", "lint:sol:fix": "prettier --loglevel warn --ignore-path .gitignore '{contracts,test}/**/*.sol' --write", "clean": "hardhat clean && rimraf build contracts/build", "prepare": "scripts/prepare.sh", From a34dd8bb1b8e941f6e7f65c58df0b3b994afbc16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Tue, 24 Jan 2023 15:00:03 -0600 Subject: [PATCH 139/197] Add `solidity` language to missing code snippets (#3992) --- GUIDELINES.md | 6 +++--- contracts/access/AccessControl.sol | 4 ++-- contracts/proxy/utils/Initializable.sol | 3 ++- contracts/utils/StorageSlot.sol | 2 +- contracts/utils/structs/DoubleEndedQueue.sol | 2 +- contracts/utils/structs/EnumerableMap.sol | 2 +- contracts/utils/structs/EnumerableSet.sol | 2 +- scripts/generate/templates/EnumerableMap.js | 2 +- scripts/generate/templates/EnumerableSet.js | 2 +- 9 files changed, 13 insertions(+), 12 deletions(-) diff --git a/GUIDELINES.md b/GUIDELINES.md index cdeddb90c..bac94be6f 100644 --- a/GUIDELINES.md +++ b/GUIDELINES.md @@ -72,7 +72,7 @@ In addition to the official Solidity Style Guide we have a number of other conve * Internal or private state variables or functions should have an underscore prefix. - ``` + ```solidity contract TestContract { uint256 private _privateVar; uint256 internal _internalVar; @@ -84,7 +84,7 @@ In addition to the official Solidity Style Guide we have a number of other conve * Events should be emitted immediately after the state change that they represent, and should be named in the past tense. - ``` + ```solidity function _burn(address who, uint256 value) internal { super._burn(who, value); emit TokensBurned(who, value); @@ -96,7 +96,7 @@ In addition to the official Solidity Style Guide we have a number of other conve * Interface names should have a capital I prefix. - ``` + ```solidity interface IERC777 { ``` diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index 386b85c03..5f2829e74 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -19,14 +19,14 @@ import "../utils/introspection/ERC165.sol"; * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * - * ``` + * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * - * ``` + * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... diff --git a/contracts/proxy/utils/Initializable.sol b/contracts/proxy/utils/Initializable.sol index b454b5d95..638dbe353 100644 --- a/contracts/proxy/utils/Initializable.sol +++ b/contracts/proxy/utils/Initializable.sol @@ -18,12 +18,13 @@ import "../../utils/Address.sol"; * For example: * * [.hljs-theme-light.nopadding] - * ``` + * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } + * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); diff --git a/contracts/utils/StorageSlot.sol b/contracts/utils/StorageSlot.sol index 6ab8f5dc6..d23363bd6 100644 --- a/contracts/utils/StorageSlot.sol +++ b/contracts/utils/StorageSlot.sol @@ -12,7 +12,7 @@ pragma solidity ^0.8.0; * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: - * ``` + * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * diff --git a/contracts/utils/structs/DoubleEndedQueue.sol b/contracts/utils/structs/DoubleEndedQueue.sol index eae79ada7..6b3ea70e3 100644 --- a/contracts/utils/structs/DoubleEndedQueue.sol +++ b/contracts/utils/structs/DoubleEndedQueue.sol @@ -12,7 +12,7 @@ import "../math/SafeCast.sol"; * * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be * used in storage, and not in memory. - * ``` + * ```solidity * DoubleEndedQueue.Bytes32Deque queue; * ``` * diff --git a/contracts/utils/structs/EnumerableMap.sol b/contracts/utils/structs/EnumerableMap.sol index 8b188c734..fb21f02cf 100644 --- a/contracts/utils/structs/EnumerableMap.sol +++ b/contracts/utils/structs/EnumerableMap.sol @@ -17,7 +17,7 @@ import "./EnumerableSet.sol"; * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * - * ``` + * ```solidity * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; diff --git a/contracts/utils/structs/EnumerableSet.sol b/contracts/utils/structs/EnumerableSet.sol index 4c701c26c..a01f82d41 100644 --- a/contracts/utils/structs/EnumerableSet.sol +++ b/contracts/utils/structs/EnumerableSet.sol @@ -15,7 +15,7 @@ pragma solidity ^0.8.0; * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * - * ``` + * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; diff --git a/scripts/generate/templates/EnumerableMap.js b/scripts/generate/templates/EnumerableMap.js index dbd502a0b..2bbb69e3e 100644 --- a/scripts/generate/templates/EnumerableMap.js +++ b/scripts/generate/templates/EnumerableMap.js @@ -25,7 +25,7 @@ import "./EnumerableSet.sol"; * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * - * \`\`\` + * \`\`\`solidity * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; diff --git a/scripts/generate/templates/EnumerableSet.js b/scripts/generate/templates/EnumerableSet.js index a3af2c304..2b6a9c64d 100644 --- a/scripts/generate/templates/EnumerableSet.js +++ b/scripts/generate/templates/EnumerableSet.js @@ -22,7 +22,7 @@ pragma solidity ^0.8.0; * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * - * \`\`\` + * \`\`\`solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; From a284569a7c611423d1d12d826d67db6d9967923c Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Wed, 25 Jan 2023 14:54:51 +0100 Subject: [PATCH 140/197] Rename `ERC20ReturnFalseMock copy.sol` to `ERC20ReturnFalseMock.sol` (#4000) --- .../{ERC20ReturnFalseMock copy.sol => ERC20ReturnFalseMock.sol} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contracts/mocks/token/{ERC20ReturnFalseMock copy.sol => ERC20ReturnFalseMock.sol} (100%) diff --git a/contracts/mocks/token/ERC20ReturnFalseMock copy.sol b/contracts/mocks/token/ERC20ReturnFalseMock.sol similarity index 100% rename from contracts/mocks/token/ERC20ReturnFalseMock copy.sol rename to contracts/mocks/token/ERC20ReturnFalseMock.sol From 69c8d1010e1ca53ce3fa7f6fddff96759aec87e1 Mon Sep 17 00:00:00 2001 From: blockeater Date: Thu, 26 Jan 2023 00:46:34 +0500 Subject: [PATCH 141/197] Make upgradeTo and upgradeToAndCall public (#3959) Co-authored-by: Francisco --- .changeset/five-ducks-develop.md | 5 +++++ contracts/mocks/proxy/UUPSLegacy.sol | 4 ++-- contracts/mocks/proxy/UUPSUpgradeableMock.sol | 4 ++-- contracts/proxy/utils/UUPSUpgradeable.sol | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/five-ducks-develop.md diff --git a/.changeset/five-ducks-develop.md b/.changeset/five-ducks-develop.md new file mode 100644 index 000000000..fe25db071 --- /dev/null +++ b/.changeset/five-ducks-develop.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`UUPSUpgradeable.sol`: Change visibility to the functions `upgradeTo ` and `upgradeToAndCall ` from `external` to `public`. diff --git a/contracts/mocks/proxy/UUPSLegacy.sol b/contracts/mocks/proxy/UUPSLegacy.sol index 7a3002889..6956f5675 100644 --- a/contracts/mocks/proxy/UUPSLegacy.sol +++ b/contracts/mocks/proxy/UUPSLegacy.sol @@ -44,11 +44,11 @@ contract UUPSUpgradeableLegacyMock is UUPSUpgradeableMock { } // hooking into the old mechanism - function upgradeTo(address newImplementation) external override { + function upgradeTo(address newImplementation) public override { _upgradeToAndCallSecureLegacyV1(newImplementation, bytes(""), false); } - function upgradeToAndCall(address newImplementation, bytes memory data) external payable override { + function upgradeToAndCall(address newImplementation, bytes memory data) public payable override { _upgradeToAndCallSecureLegacyV1(newImplementation, data, false); } } diff --git a/contracts/mocks/proxy/UUPSUpgradeableMock.sol b/contracts/mocks/proxy/UUPSUpgradeableMock.sol index deb20a000..f02271c49 100644 --- a/contracts/mocks/proxy/UUPSUpgradeableMock.sol +++ b/contracts/mocks/proxy/UUPSUpgradeableMock.sol @@ -23,11 +23,11 @@ contract UUPSUpgradeableMock is NonUpgradeableMock, UUPSUpgradeable { } contract UUPSUpgradeableUnsafeMock is UUPSUpgradeableMock { - function upgradeTo(address newImplementation) external override { + function upgradeTo(address newImplementation) public override { ERC1967Upgrade._upgradeToAndCall(newImplementation, bytes(""), false); } - function upgradeToAndCall(address newImplementation, bytes memory data) external payable override { + function upgradeToAndCall(address newImplementation, bytes memory data) public payable override { ERC1967Upgrade._upgradeToAndCall(newImplementation, data, false); } } diff --git a/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/proxy/utils/UUPSUpgradeable.sol index bb696f6fa..4ff026638 100644 --- a/contracts/proxy/utils/UUPSUpgradeable.sol +++ b/contracts/proxy/utils/UUPSUpgradeable.sol @@ -65,7 +65,7 @@ abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade { * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ - function upgradeTo(address newImplementation) external virtual onlyProxy { + function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } @@ -80,7 +80,7 @@ abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade { * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ - function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { + function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } From d6fb3d645ff46f059745935b62fcc32c63cf4034 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 26 Jan 2023 14:17:18 -0300 Subject: [PATCH 142/197] Add guidelines for pull requests (#4002) --- GUIDELINES.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/GUIDELINES.md b/GUIDELINES.md index bac94be6f..0f4c9829e 100644 --- a/GUIDELINES.md +++ b/GUIDELINES.md @@ -62,6 +62,20 @@ Some other examples of automation are: - Looking for common security vulnerabilities or errors in our code (eg. reentrancy analysis). - Keeping dependencies up to date and monitoring for vulnerable dependencies. +## Pull requests + +Pull requests are squash-merged to keep the `master` branch history clean. The title of the pull request becomes the commit message, so it should be written in a consistent format: + +1) Begin with a capital letter. +2) Do not end with a period. +3) Write in the imperative: "Add feature X" and not "Adds feature X" or "Added feature X". + +This repository does not follow conventional commits, so do not prefix the title with "fix:" or "feat:". + +Work in progress pull requests should be submitted as Drafts and should not be prefixed with "WIP:". + +Branch names don't matter, and commit messages within a pull request mostly don't matter either, although they can help the review process. + # Solidity Conventions In addition to the official Solidity Style Guide we have a number of other conventions that must be followed. From 0320a718e8e07b1d932f5acb8ad9cec9d9eed99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Thu, 26 Jan 2023 11:38:34 -0600 Subject: [PATCH 143/197] Fix Governance docs reference to blocktime (#3994) --- docs/modules/ROOT/pages/governance.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index aa27c0ba8..d59e3ce9f 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -137,7 +137,7 @@ votingDelay: How long after a proposal is created should voting power be fixed. votingPeriod: How long does a proposal remain open to votes. -These parameters are specified in number of blocks. Assuming block time of around 13.14 seconds, we will set votingDelay = 1 day = 6570 blocks, and votingPeriod = 1 week = 45992 blocks. +These parameters are specified in number of blocks. Assuming block time of around 12 seconds, we will set votingDelay = 1 day = 7200 blocks, and votingPeriod = 1 week = 50400 blocks. We can optionally set a proposal threshold as well. This restricts proposal creation to accounts who have enough voting power. From 5e28952cbdc0eb7d19ee62580ab31b30c2376e48 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 26 Jan 2023 20:46:11 +0100 Subject: [PATCH 144/197] Add a public Governor.cancel function (#3983) --- .changeset/flat-deers-end.md | 5 + contracts/governance/Governor.sol | 30 +++- contracts/governance/IGovernor.sol | 8 ++ .../GovernorCompatibilityBravo.sol | 9 +- .../IGovernorCompatibilityBravo.sol | 5 - .../GovernorCompatibilityBravoMock.sol | 4 + contracts/mocks/wizard/MyGovernor3.sol | 4 + test/governance/Governor.test.js | 128 +++++++++++++----- .../GovernorCompatibilityBravo.test.js | 6 +- .../GovernorTimelockCompound.test.js | 4 +- .../GovernorTimelockControl.test.js | 4 +- test/helpers/governance.js | 13 +- 12 files changed, 157 insertions(+), 63 deletions(-) create mode 100644 .changeset/flat-deers-end.md diff --git a/.changeset/flat-deers-end.md b/.changeset/flat-deers-end.md new file mode 100644 index 000000000..61895f2cf --- /dev/null +++ b/.changeset/flat-deers-end.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Governor`: add a public `cancel(uint256)` function. diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index 8235fb5ec..f82f9fea8 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -40,6 +40,7 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive Timers.BlockNumber voteEnd; bool executed; bool canceled; + address proposer; } string private _name; @@ -95,9 +96,11 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive return interfaceId == (type(IGovernor).interfaceId ^ + this.cancel.selector ^ this.castVoteWithReasonAndParams.selector ^ this.castVoteWithReasonAndParamsBySig.selector ^ this.getVotesWithParams.selector) || + interfaceId == (type(IGovernor).interfaceId ^ this.cancel.selector) || interfaceId == type(IGovernor).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); @@ -248,8 +251,10 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive bytes[] memory calldatas, string memory description ) public virtual override returns (uint256) { + address proposer = _msgSender(); + require( - getVotes(_msgSender(), block.number - 1) >= proposalThreshold(), + getVotes(proposer, block.number - 1) >= proposalThreshold(), "Governor: proposer votes below proposal threshold" ); @@ -267,10 +272,11 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive proposal.voteStart.setDeadline(snapshot); proposal.voteEnd.setDeadline(deadline); + proposal.proposer = proposer; emit ProposalCreated( proposalId, - _msgSender(), + proposer, targets, values, new string[](targets.length), @@ -310,6 +316,15 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive return proposalId; } + /** + * @dev See {IGovernor-cancel}. + */ + function cancel(uint256 proposalId) public virtual override { + require(state(proposalId) == ProposalState.Pending, "Governor: too late to cancel"); + require(_msgSender() == _proposals[proposalId].proposer, "Governor: only proposer can cancel"); + _cancel(proposalId); + } + /** * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism */ @@ -375,7 +390,16 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive bytes[] memory calldatas, bytes32 descriptionHash ) internal virtual returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); + return _cancel(hashProposal(targets, values, calldatas, descriptionHash)); + } + + /** + * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as + * canceled to allow distinguishing it from executed proposals. + * + * Emits a {IGovernor-ProposalCanceled} event. + */ + function _cancel(uint256 proposalId) internal virtual returns (uint256) { ProposalState status = state(proposalId); require( diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index eb3d1fc05..18cf57fb1 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -216,6 +216,14 @@ abstract contract IGovernor is IERC165 { bytes32 descriptionHash ) public payable virtual returns (uint256 proposalId); + /** + * @dev Cancel a proposal. This is restricted to Pending proposal (before the vote starts) and is restricted to + * the proposal's proposer. + * + * Emits a {ProposalCanceled} event. + */ + function cancel(uint256 proposalId) public virtual; + /** * @dev Cast a vote * diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 8d74742c5..912d02f8a 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -99,7 +99,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp ); } - function cancel(uint256 proposalId) public virtual override { + function cancel(uint256 proposalId) public virtual override(IGovernor, Governor) { ProposalDetails storage details = _proposalDetails[proposalId]; require( @@ -107,12 +107,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp "GovernorBravo: proposer above threshold" ); - _cancel( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); + _cancel(proposalId); } /** diff --git a/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol b/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol index d1ec0337d..159c55100 100644 --- a/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol @@ -90,11 +90,6 @@ abstract contract IGovernorCompatibilityBravo is IGovernor { */ function execute(uint256 proposalId) public payable virtual; - /** - * @dev Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold. - */ - function cancel(uint256 proposalId) public virtual; - /** * @dev Part of the Governor Bravo's interface: _"Gets actions of a proposal"_. */ diff --git a/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol index 4356bce7f..2727794f6 100644 --- a/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol +++ b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol @@ -66,6 +66,10 @@ abstract contract GovernorCompatibilityBravoMock is return super.execute(targets, values, calldatas, salt); } + function cancel(uint256 proposalId) public override(Governor, GovernorCompatibilityBravo, IGovernor) { + super.cancel(proposalId); + } + function _execute( uint256 proposalId, address[] memory targets, diff --git a/contracts/mocks/wizard/MyGovernor3.sol b/contracts/mocks/wizard/MyGovernor3.sol index 320342290..4192cae94 100644 --- a/contracts/mocks/wizard/MyGovernor3.sol +++ b/contracts/mocks/wizard/MyGovernor3.sol @@ -54,6 +54,10 @@ contract MyGovernor is return super.propose(targets, values, calldatas, description); } + function cancel(uint256 proposalId) public override(Governor, GovernorCompatibilityBravo, IGovernor) { + super.cancel(proposalId); + } + function _execute( uint256 proposalId, address[] memory targets, diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index cc3cc17ef..4c083ed92 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -382,55 +382,109 @@ contract('Governor', function (accounts) { }); describe('cancel', function () { - it('before proposal', async function () { - await expectRevert(this.helper.cancel(), 'Governor: unknown proposal id'); + describe('internal', function () { + it('before proposal', async function () { + await expectRevert(this.helper.cancel('internal'), 'Governor: unknown proposal id'); + }); + + it('after proposal', async function () { + await this.helper.propose(); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await this.helper.waitForSnapshot(); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'Governor: vote not currently active', + ); + }); + + it('after vote', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await this.helper.waitForDeadline(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('after deadline', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('after execution', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + await expectRevert(this.helper.cancel('internal'), 'Governor: proposal not active'); + }); }); - it('after proposal', async function () { - await this.helper.propose(); + describe('public', function () { + it('before proposal', async function () { + await expectRevert(this.helper.cancel('external'), 'Governor: unknown proposal id'); + }); - await this.helper.cancel(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + it('after proposal', async function () { + await this.helper.propose(); - await this.helper.waitForSnapshot(); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'Governor: vote not currently active', - ); - }); + await this.helper.cancel('external'); + }); - it('after vote', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + it('after proposal - restricted to proposer', async function () { + await this.helper.propose(); - await this.helper.cancel(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + await expectRevert(this.helper.cancel('external', { from: owner }), 'Governor: only proposer can cancel'); + }); - await this.helper.waitForDeadline(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); + it('after vote started', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(1); // snapshot + 1 block - it('after deadline', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); - await this.helper.cancel(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + it('after vote', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); - it('after execution', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); + it('after deadline', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); - await expectRevert(this.helper.cancel(), 'Governor: proposal not active'); + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); + + it('after execution', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); }); }); diff --git a/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/test/governance/compatibility/GovernorCompatibilityBravo.test.js index 231d57b27..3666c4548 100644 --- a/test/governance/compatibility/GovernorCompatibilityBravo.test.js +++ b/test/governance/compatibility/GovernorCompatibilityBravo.test.js @@ -226,18 +226,18 @@ contract('GovernorCompatibilityBravo', function (accounts) { describe('cancel', function () { it('proposer can cancel', async function () { await this.helper.propose({ from: proposer }); - await this.helper.cancel({ from: proposer }); + await this.helper.cancel('external', { from: proposer }); }); it('anyone can cancel if proposer drop below threshold', async function () { await this.helper.propose({ from: proposer }); await this.token.transfer(voter1, web3.utils.toWei('1'), { from: proposer }); - await this.helper.cancel(); + await this.helper.cancel('external'); }); it('cannot cancel is proposer is still above threshold', async function () { await this.helper.propose({ from: proposer }); - await expectRevert(this.helper.cancel(), 'GovernorBravo: proposer above threshold'); + await expectRevert(this.helper.cancel('external'), 'GovernorBravo: proposer above threshold'); }); }); }); diff --git a/test/governance/extensions/GovernorTimelockCompound.test.js b/test/governance/extensions/GovernorTimelockCompound.test.js index 334659e07..fb6803383 100644 --- a/test/governance/extensions/GovernorTimelockCompound.test.js +++ b/test/governance/extensions/GovernorTimelockCompound.test.js @@ -193,7 +193,7 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); @@ -206,7 +206,7 @@ contract('GovernorTimelockCompound', function (accounts) { await this.helper.waitForDeadline(); await this.helper.queue(); - expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 2e8c75888..4f9b9df73 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -185,7 +185,7 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); await this.helper.waitForDeadline(); - expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); @@ -198,7 +198,7 @@ contract('GovernorTimelockControl', function (accounts) { await this.helper.waitForDeadline(); await this.helper.queue(); - expectEvent(await this.helper.cancel(), 'ProposalCanceled', { proposalId: this.proposal.id }); + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); diff --git a/test/helpers/governance.js b/test/helpers/governance.js index ff341aa12..f933f389d 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -62,14 +62,19 @@ class GovernorHelper { ); } - cancel(opts = null) { + cancel(visibility = 'external', opts = null) { const proposal = this.currentProposal; - return proposal.useCompatibilityInterface - ? this.governor.methods['cancel(uint256)'](...concatOpts([proposal.id], opts)) - : this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)']( + switch (visibility) { + case 'external': + return this.governor.methods['cancel(uint256)'](...concatOpts([proposal.id], opts)); + case 'internal': + return this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)']( ...concatOpts(proposal.shortProposal, opts), ); + default: + throw new Error(`unsuported visibility "${visibility}"`); + } } vote(vote = {}, opts = null) { From bc6de21fe229520b33d13a4d60bbeb1bc5f91bcd Mon Sep 17 00:00:00 2001 From: JulissaDantes Date: Fri, 27 Jan 2023 13:47:43 -0500 Subject: [PATCH 145/197] Create ProposalSalt event for TimelockController (#4001) Co-authored-by: Francisco --- .changeset/five-poets-mix.md | 5 ++++ contracts/governance/TimelockController.sol | 15 ++++++++++-- test/governance/TimelockController.test.js | 23 +++++++++++++++++++ .../GovernorTimelockControl.test.js | 3 +++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 .changeset/five-poets-mix.md diff --git a/.changeset/five-poets-mix.md b/.changeset/five-poets-mix.md new file mode 100644 index 000000000..f5050b246 --- /dev/null +++ b/.changeset/five-poets-mix.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`TimelockController`: Add the `CallSalt` event to emit on operation schedule. diff --git a/contracts/governance/TimelockController.sol b/contracts/governance/TimelockController.sol index dac55d858..615b4c0e3 100644 --- a/contracts/governance/TimelockController.sol +++ b/contracts/governance/TimelockController.sol @@ -51,6 +51,11 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver */ event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data); + /** + * @dev Emitted when new proposal is scheduled with non-zero salt. + */ + event CallSalt(bytes32 indexed id, bytes32 salt); + /** * @dev Emitted when operation `id` is cancelled. */ @@ -206,7 +211,7 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver /** * @dev Schedule an operation containing a single transaction. * - * Emits a {CallScheduled} event. + * Emits events {CallScheduled} and {CallSalt}. * * Requirements: * @@ -223,12 +228,15 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver bytes32 id = hashOperation(target, value, data, predecessor, salt); _schedule(id, delay); emit CallScheduled(id, 0, target, value, data, predecessor, delay); + if (salt != bytes32(0)) { + emit CallSalt(id, salt); + } } /** * @dev Schedule an operation containing a batch of transactions. * - * Emits one {CallScheduled} event per transaction in the batch. + * Emits a {CallSalt} event and one {CallScheduled} event per transaction in the batch. * * Requirements: * @@ -250,6 +258,9 @@ contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver for (uint256 i = 0; i < targets.length; ++i) { emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay); } + if (salt != bytes32(0)) { + emit CallSalt(id, salt); + } } /** diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index 83352ef85..dde923564 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -158,6 +158,11 @@ contract('TimelockController', function (accounts) { delay: MINDELAY, }); + expectEvent(receipt, 'CallSalt', { + id: this.operation.id, + salt: this.operation.salt, + }); + const block = await web3.eth.getBlock(receipt.receipt.blockHash); expect(await this.mock.getTimestamp(this.operation.id)).to.be.bignumber.equal( @@ -219,6 +224,19 @@ contract('TimelockController', function (accounts) { 'TimelockController: insufficient delay', ); }); + + it('schedule operation with salt zero', async function () { + const { receipt } = await this.mock.schedule( + this.operation.target, + this.operation.value, + this.operation.data, + this.operation.predecessor, + ZERO_BYTES32, + MINDELAY, + { from: proposer }, + ); + expectEvent.notEmitted(receipt, 'CallSalt'); + }); }); describe('execute', function () { @@ -364,6 +382,11 @@ contract('TimelockController', function (accounts) { predecessor: this.operation.predecessor, delay: MINDELAY, }); + + expectEvent(receipt, 'CallSalt', { + id: this.operation.id, + salt: this.operation.salt, + }); } const block = await web3.eth.getBlock(receipt.receipt.blockHash); diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 4f9b9df73..34fdfe92f 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -106,6 +106,9 @@ contract('GovernorTimelockControl', function (accounts) { expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallScheduled', { id: this.proposal.timelockid }); + await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallSalt', { + id: this.proposal.timelockid, + }); expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); await expectEvent.inTransaction(txExecute.tx, this.timelock, 'CallExecuted', { id: this.proposal.timelockid }); From 1684c579223f02c9e78db3fbcf7a2106a6f7efe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Sat, 28 Jan 2023 17:21:07 -0600 Subject: [PATCH 146/197] Add `ERC*Pausable` warning for public pausing mechanism (#4007) Co-authored-by: Francisco --- .changeset/new-ways-own.md | 5 +++++ contracts/token/ERC1155/extensions/ERC1155Pausable.sol | 6 ++++++ contracts/token/ERC20/extensions/ERC20Pausable.sol | 6 ++++++ contracts/token/ERC721/extensions/ERC721Pausable.sol | 6 ++++++ 4 files changed, 23 insertions(+) create mode 100644 .changeset/new-ways-own.md diff --git a/.changeset/new-ways-own.md b/.changeset/new-ways-own.md new file mode 100644 index 000000000..f940bfeb7 --- /dev/null +++ b/.changeset/new-ways-own.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`ERC20Pausable`, `ERC721Pausable`, `ERC1155Pausable`: Add note regarding missing public pausing functionality diff --git a/contracts/token/ERC1155/extensions/ERC1155Pausable.sol b/contracts/token/ERC1155/extensions/ERC1155Pausable.sol index 64790e2aa..66ad55e7d 100644 --- a/contracts/token/ERC1155/extensions/ERC1155Pausable.sol +++ b/contracts/token/ERC1155/extensions/ERC1155Pausable.sol @@ -13,6 +13,12 @@ import "../../../security/Pausable.sol"; * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * + * IMPORTANT: This contract does not include public pause and unpause functions. In + * addition to inheriting this contract, you must define both functions, invoking the + * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate + * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will + * make the contract unpausable. + * * _Available since v3.1._ */ abstract contract ERC1155Pausable is ERC1155, Pausable { diff --git a/contracts/token/ERC20/extensions/ERC20Pausable.sol b/contracts/token/ERC20/extensions/ERC20Pausable.sol index d0b224f4b..e011f08c0 100644 --- a/contracts/token/ERC20/extensions/ERC20Pausable.sol +++ b/contracts/token/ERC20/extensions/ERC20Pausable.sol @@ -12,6 +12,12 @@ import "../../../security/Pausable.sol"; * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. + * + * IMPORTANT: This contract does not include public pause and unpause functions. In + * addition to inheriting this contract, you must define both functions, invoking the + * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate + * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will + * make the contract unpausable. */ abstract contract ERC20Pausable is ERC20, Pausable { /** diff --git a/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/token/ERC721/extensions/ERC721Pausable.sol index 4726540f4..cdd729b26 100644 --- a/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ b/contracts/token/ERC721/extensions/ERC721Pausable.sol @@ -12,6 +12,12 @@ import "../../../security/Pausable.sol"; * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. + * + * IMPORTANT: This contract does not include public pause and unpause functions. In + * addition to inheriting this contract, you must define both functions, invoking the + * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate + * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will + * make the contract unpausable. */ abstract contract ERC721Pausable is ERC721, Pausable { /** From 591c12d22de283a297e2b551175ccc914c938391 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 30 Jan 2023 21:00:56 -0300 Subject: [PATCH 147/197] Remove outdated note about virtual view functions (#4014) --- docs/modules/ROOT/pages/extending-contracts.adoc | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index 7330fc997..a440f4067 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -66,8 +66,6 @@ contract ModifiedAccessControl is AccessControl { The `super.revokeRole` statement at the end will invoke ``AccessControl``'s original version of `revokeRole`, the same code that would've run if there were no overrides in place. -NOTE: As of v3.0.0, `view` functions are not `virtual` in OpenZeppelin, and therefore cannot be overridden. We're considering https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2154[lifting this restriction] in an upcoming release. Let us know if this is something you care about! - [[using-hooks]] == Using Hooks From 501a78e13426ec10249e44386239c74783478dd0 Mon Sep 17 00:00:00 2001 From: Mio Date: Tue, 31 Jan 2023 21:11:37 +0800 Subject: [PATCH 148/197] Fix typos (#4015) --- contracts/governance/IGovernor.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index 18cf57fb1..60a4b5470 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -58,7 +58,7 @@ abstract contract IGovernor is IERC165 { * @dev Emitted when a vote is cast with params. * * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. - * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used. + * `params` are additional encoded parameters. Their interpepretation also depends on the voting module used. */ event VoteCastWithParams( address indexed voter, @@ -140,7 +140,7 @@ abstract contract IGovernor is IERC165 { /** * @notice module:user-config - * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to + * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increased to * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts. */ function votingDelay() public view virtual returns (uint256); From a70ee4e3bbee565e49217c9ec59de5354f8af9d8 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 31 Jan 2023 21:45:24 +0100 Subject: [PATCH 149/197] Check storage layout consistency in PRs (#3967) Co-authored-by: Francisco --- .github/actions/storage-layout/action.yml | 55 +++++++++ .github/workflows/checks.yml | 4 + package-lock.json | 144 ++++++++++++++++++++++ package.json | 1 + scripts/checks/compare-layout.js | 20 +++ scripts/checks/extract-layout.js | 40 ++++++ 6 files changed, 264 insertions(+) create mode 100644 .github/actions/storage-layout/action.yml create mode 100644 scripts/checks/compare-layout.js create mode 100644 scripts/checks/extract-layout.js diff --git a/.github/actions/storage-layout/action.yml b/.github/actions/storage-layout/action.yml new file mode 100644 index 000000000..e3e104a01 --- /dev/null +++ b/.github/actions/storage-layout/action.yml @@ -0,0 +1,55 @@ +name: Compare storage layouts +inputs: + token: + description: github token + required: true + buildinfo: + description: compilation artifacts + required: false + default: artifacts/build-info/*.json + layout: + description: extracted storage layout + required: false + default: HEAD.layout.json + out_layout: + description: storage layout to upload + required: false + default: ${{ github.ref_name }}.layout.json + ref_layout: + description: storage layout for the reference branch + required: false + default: ${{ github.base_ref }}.layout.json + +runs: + using: composite + steps: + - name: Extract layout + run: | + node scripts/checks/extract-layout.js ${{ inputs.buildinfo }} > ${{ inputs.layout }} + shell: bash + - name: Download reference + if: github.event_name == 'pull_request' + run: | + RUN_ID=`gh run list --repo ${{ github.repository }} --branch ${{ github.base_ref }} --workflow ${{ github.workflow }} --limit 100 --json 'conclusion,databaseId,event' --jq 'map(select(.conclusion=="success" and .event!="pull_request"))[0].databaseId'` + gh run download ${RUN_ID} --repo ${{ github.repository }} -n layout + env: + GITHUB_TOKEN: ${{ inputs.token }} + shell: bash + continue-on-error: true + id: reference + - name: Compare layouts + if: steps.reference.outcome == 'success' && github.event_name == 'pull_request' + run: | + node scripts/checks/compare-layout.js --head ${{ inputs.layout }} --ref ${{ inputs.ref_layout }} >> $GITHUB_STEP_SUMMARY + shell: bash + - name: Rename artifacts for upload + if: github.event_name != 'pull_request' + run: | + mv ${{ inputs.layout }} ${{ inputs.out_layout }} + shell: bash + - name: Save artifacts + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v3 + with: + name: layout + path: ${{ inputs.out_layout }} diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 17d9e3578..02664e85c 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -42,6 +42,10 @@ jobs: uses: ./.github/actions/gas-compare with: token: ${{ github.token }} + - name: Check storage layout + uses: ./.github/actions/storage-layout + with: + token: ${{ github.token }} foundry-tests: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' diff --git a/package-lock.json b/package-lock.json index 51a71854c..51d350ac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@nomiclabs/hardhat-web3": "^2.0.0", "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", + "@openzeppelin/upgrades-core": "^1.20.6", "chai": "^4.2.0", "eslint": "^8.30.0", "eslint-config-prettier": "^8.5.0", @@ -2405,6 +2406,58 @@ "semver": "bin/semver" } }, + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.20.6.tgz", + "integrity": "sha512-KWdtlahm+iunlAlzLsdpBueanwEx0LLPfAkDL1p0C4SPjMiUqHHFlyGtmmWwdiqDpJ//605vfwkd5RqfnFrHSg==", + "dev": true, + "dependencies": { + "cbor": "^8.0.0", + "chalk": "^4.1.0", + "compare-versions": "^5.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.15" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/@openzeppelin/upgrades-core/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/@openzeppelin/upgrades-core/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": ">=12.19" + } + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -4571,6 +4624,12 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, + "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==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11430,6 +11489,17 @@ "asap": "~2.0.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==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -12019,6 +12089,15 @@ "node": ">=4" } }, + "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, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -17993,6 +18072,48 @@ } } }, + "@openzeppelin/upgrades-core": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.20.6.tgz", + "integrity": "sha512-KWdtlahm+iunlAlzLsdpBueanwEx0LLPfAkDL1p0C4SPjMiUqHHFlyGtmmWwdiqDpJ//605vfwkd5RqfnFrHSg==", + "dev": true, + "requires": { + "cbor": "^8.0.0", + "chalk": "^4.1.0", + "compare-versions": "^5.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.15" + }, + "dependencies": { + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "requires": { + "nofilter": "^3.1.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true + } + } + }, "@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -19767,6 +19888,12 @@ "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, + "compare-versions": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", + "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -25154,6 +25281,17 @@ "asap": "~2.0.6" } }, + "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, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -25598,6 +25736,12 @@ "signal-exit": "^3.0.2" } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", diff --git a/package.json b/package.json index b4035b820..de2951bd1 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "@nomiclabs/hardhat-web3": "^2.0.0", "@openzeppelin/docs-utils": "^0.1.3", "@openzeppelin/test-helpers": "^0.5.13", + "@openzeppelin/upgrades-core": "^1.20.6", "chai": "^4.2.0", "eslint": "^8.30.0", "eslint-config-prettier": "^8.5.0", diff --git a/scripts/checks/compare-layout.js b/scripts/checks/compare-layout.js new file mode 100644 index 000000000..ff8cb712e --- /dev/null +++ b/scripts/checks/compare-layout.js @@ -0,0 +1,20 @@ +const fs = require('fs'); +const { getStorageUpgradeReport } = require('@openzeppelin/upgrades-core/dist/storage'); + +const { ref, head } = require('yargs').argv; + +const oldLayout = JSON.parse(fs.readFileSync(ref)); +const newLayout = JSON.parse(fs.readFileSync(head)); + +for (const name in oldLayout) { + if (name in newLayout) { + const report = getStorageUpgradeReport(oldLayout[name], newLayout[name], {}); + if (!report.ok) { + console.log(`ERROR: Storage incompatibility in ${name}`); + console.log(report.explain()); + process.exitCode = 1; + } + } else { + console.log(`WARNING: ${name} is missing from the current branch`); + } +} diff --git a/scripts/checks/extract-layout.js b/scripts/checks/extract-layout.js new file mode 100644 index 000000000..d0c9cf36b --- /dev/null +++ b/scripts/checks/extract-layout.js @@ -0,0 +1,40 @@ +const fs = require('fs'); +const { findAll } = require('solidity-ast/utils'); +const { astDereferencer } = require('@openzeppelin/upgrades-core/dist/ast-dereferencer'); +const { solcInputOutputDecoder } = require('@openzeppelin/upgrades-core/dist/src-decoder'); +const { extractStorageLayout } = require('@openzeppelin/upgrades-core/dist/storage/extract'); + +const { _ } = require('yargs').argv; + +const skipPath = ['contracts/mocks/', 'contracts-exposed/']; +const skipKind = ['interface', 'library']; + +function extractLayouts(path) { + const layout = {}; + const { input, output } = JSON.parse(fs.readFileSync(path)); + + const decoder = solcInputOutputDecoder(input, output); + const deref = astDereferencer(output); + + for (const src in output.contracts) { + if (skipPath.some(prefix => src.startsWith(prefix))) { + continue; + } + + for (const contractDef of findAll('ContractDefinition', output.sources[src].ast)) { + if (skipKind.includes(contractDef.contractKind)) { + continue; + } + + layout[contractDef.name] = extractStorageLayout( + contractDef, + decoder, + deref, + output.contracts[src][contractDef.name].storageLayout, + ); + } + } + return layout; +} + +console.log(JSON.stringify(Object.assign(..._.map(extractLayouts)))); From 91e8d0ba3c3beb8a1db31310d8599664e48639ef Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 1 Feb 2023 22:46:05 +0100 Subject: [PATCH 150/197] Add `string` and `bytes` support to the `StorageSlots` library (#4008) Co-authored-by: Francisco --- .changeset/modern-games-exist.md | 5 ++ contracts/mocks/StorageSlotMock.sol | 38 +++++++- contracts/utils/StorageSlot.sol | 52 ++++++++++- scripts/generate/run.js | 1 + scripts/generate/templates/StorageSlot.js | 87 +++++++++++++++++++ scripts/helpers.js | 5 ++ test/utils/StorageSlot.test.js | 100 ++++++++++++++++++++++ 7 files changed, 286 insertions(+), 2 deletions(-) create mode 100644 .changeset/modern-games-exist.md create mode 100644 scripts/generate/templates/StorageSlot.js diff --git a/.changeset/modern-games-exist.md b/.changeset/modern-games-exist.md new file mode 100644 index 000000000..bd89b4f16 --- /dev/null +++ b/.changeset/modern-games-exist.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`StorageSlot`: Add support for `string` and `bytes`. diff --git a/contracts/mocks/StorageSlotMock.sol b/contracts/mocks/StorageSlotMock.sol index 5d099fca8..1da577c19 100644 --- a/contracts/mocks/StorageSlotMock.sol +++ b/contracts/mocks/StorageSlotMock.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.0; import "../utils/StorageSlot.sol"; contract StorageSlotMock { - using StorageSlot for bytes32; + using StorageSlot for *; function setBoolean(bytes32 slot, bool value) public { slot.getBooleanSlot().value = value; @@ -38,4 +38,40 @@ contract StorageSlotMock { function getUint256(bytes32 slot) public view returns (uint256) { return slot.getUint256Slot().value; } + + mapping(uint256 => string) public stringMap; + + function setString(bytes32 slot, string calldata value) public { + slot.getStringSlot().value = value; + } + + function setStringStorage(uint256 key, string calldata value) public { + stringMap[key].getStringSlot().value = value; + } + + function getString(bytes32 slot) public view returns (string memory) { + return slot.getStringSlot().value; + } + + function getStringStorage(uint256 key) public view returns (string memory) { + return stringMap[key].getStringSlot().value; + } + + mapping(uint256 => bytes) public bytesMap; + + function setBytes(bytes32 slot, bytes calldata value) public { + slot.getBytesSlot().value = value; + } + + function setBytesStorage(uint256 key, bytes calldata value) public { + bytesMap[key].getBytesSlot().value = value; + } + + function getBytes(bytes32 slot) public view returns (bytes memory) { + return slot.getBytesSlot().value; + } + + function getBytesStorage(uint256 key) public view returns (bytes memory) { + return bytesMap[key].getBytesSlot().value; + } } diff --git a/contracts/utils/StorageSlot.sol b/contracts/utils/StorageSlot.sol index d23363bd6..44285c900 100644 --- a/contracts/utils/StorageSlot.sol +++ b/contracts/utils/StorageSlot.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) +// This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; @@ -27,7 +28,8 @@ pragma solidity ^0.8.0; * } * ``` * - * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ + * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ + * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlot { struct AddressSlot { @@ -46,6 +48,14 @@ library StorageSlot { uint256 value; } + struct StringSlot { + string value; + } + + struct BytesSlot { + bytes value; + } + /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ @@ -85,4 +95,44 @@ library StorageSlot { r.slot := slot } } + + /** + * @dev Returns an `StringSlot` with member `value` located at `slot`. + */ + function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `StringSlot` representation of the string storage pointer `store`. + */ + function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } + + /** + * @dev Returns an `BytesSlot` with member `value` located at `slot`. + */ + function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } + } + + /** + * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. + */ + function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } + } } diff --git a/scripts/generate/run.js b/scripts/generate/run.js index a34823223..e68681e9d 100755 --- a/scripts/generate/run.js +++ b/scripts/generate/run.js @@ -18,6 +18,7 @@ for (const [file, template] of Object.entries({ 'utils/structs/EnumerableSet.sol': './templates/EnumerableSet.js', 'utils/structs/EnumerableMap.sol': './templates/EnumerableMap.js', 'utils/Checkpoints.sol': './templates/Checkpoints.js', + 'utils/StorageSlot.sol': './templates/StorageSlot.js', })) { const script = path.relative(path.join(__dirname, '../..'), __filename); const input = path.join(path.dirname(script), template); diff --git a/scripts/generate/templates/StorageSlot.js b/scripts/generate/templates/StorageSlot.js new file mode 100644 index 000000000..69fa7ccc0 --- /dev/null +++ b/scripts/generate/templates/StorageSlot.js @@ -0,0 +1,87 @@ +const format = require('../format-lines'); +const { capitalize, unique } = require('../../helpers'); + +const TYPES = [ + { type: 'address', isValueType: true, version: '4.1' }, + { type: 'bool', isValueType: true, name: 'Boolean', version: '4.1' }, + { type: 'bytes32', isValueType: true, version: '4.1' }, + { type: 'uint256', isValueType: true, version: '4.1' }, + { type: 'string', isValueType: false, version: '4.9' }, + { type: 'bytes', isValueType: false, version: '4.9' }, +].map(type => Object.assign(type, { struct: (type.name ?? capitalize(type.type)) + 'Slot' })); + +const VERSIONS = unique(TYPES.map(t => t.version)).map( + version => + `_Available since v${version} for ${TYPES.filter(t => t.version == version) + .map(t => `\`${t.type}\``) + .join(', ')}._`, +); + +const header = `\ +pragma solidity ^0.8.0; + +/** + * @dev Library for reading and writing primitive types to specific storage slots. + * + * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. + * This library helps with reading and writing to such slots without the need for inline assembly. + * + * The functions in this library return Slot structs that contain a \`value\` member that can be used to read or write. + * + * Example usage to set ERC1967 implementation slot: + * \`\`\`solidity + * contract ERC1967 { + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + * + * function _getImplementation() internal view returns (address) { + * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; + * } + * + * function _setImplementation(address newImplementation) internal { + * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); + * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; + * } + * } + * \`\`\` + * +${VERSIONS.map(s => ` * ${s}`).join('\n')} + */ +`; + +const struct = type => `\ +struct ${type.struct} { + ${type.type} value; +} +`; + +const get = type => `\ +/** + * @dev Returns an \`${type.struct}\` with member \`value\` located at \`slot\`. + */ +function get${type.struct}(bytes32 slot) internal pure returns (${type.struct} storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := slot + } +} +`; + +const getStorage = type => `\ +/** + * @dev Returns an \`${type.struct}\` representation of the ${type.type} storage pointer \`store\`. + */ +function get${type.struct}(${type.type} storage store) internal pure returns (${type.struct} storage r) { + /// @solidity memory-safe-assembly + assembly { + r.slot := store.slot + } +} +`; + +// GENERATE +module.exports = format( + header.trimEnd(), + 'library StorageSlot {', + [...TYPES.map(struct), ...TYPES.flatMap(type => [get(type), type.isValueType ? '' : getStorage(type)])], + '}', +); diff --git a/scripts/helpers.js b/scripts/helpers.js index 26d0a2baa..fb9aad4fc 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -24,9 +24,14 @@ function zip(...args) { .map((_, i) => args.map(arg => arg[i])); } +function capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + module.exports = { chunk, range, unique, zip, + capitalize, }; diff --git a/test/utils/StorageSlot.test.js b/test/utils/StorageSlot.test.js index 9d428875f..846512ed2 100644 --- a/test/utils/StorageSlot.test.js +++ b/test/utils/StorageSlot.test.js @@ -107,4 +107,104 @@ contract('StorageSlot', function (accounts) { }); }); }); + + describe('string storage slot', function () { + beforeEach(async function () { + this.value = 'lorem ipsum'; + }); + + it('set', async function () { + await this.store.setString(slot, this.value); + }); + + describe('get', function () { + beforeEach(async function () { + await this.store.setString(slot, this.value); + }); + + it('from right slot', async function () { + expect(await this.store.getString(slot)).to.be.equal(this.value); + }); + + it('from other slot', async function () { + expect(await this.store.getString(otherSlot)).to.be.equal(''); + }); + }); + }); + + describe('string storage pointer', function () { + beforeEach(async function () { + this.value = 'lorem ipsum'; + }); + + it('set', async function () { + await this.store.setStringStorage(slot, this.value); + }); + + describe('get', function () { + beforeEach(async function () { + await this.store.setStringStorage(slot, this.value); + }); + + it('from right slot', async function () { + expect(await this.store.stringMap(slot)).to.be.equal(this.value); + expect(await this.store.getStringStorage(slot)).to.be.equal(this.value); + }); + + it('from other slot', async function () { + expect(await this.store.stringMap(otherSlot)).to.be.equal(''); + expect(await this.store.getStringStorage(otherSlot)).to.be.equal(''); + }); + }); + }); + + describe('bytes storage slot', function () { + beforeEach(async function () { + this.value = web3.utils.randomHex(128); + }); + + it('set', async function () { + await this.store.setBytes(slot, this.value); + }); + + describe('get', function () { + beforeEach(async function () { + await this.store.setBytes(slot, this.value); + }); + + it('from right slot', async function () { + expect(await this.store.getBytes(slot)).to.be.equal(this.value); + }); + + it('from other slot', async function () { + expect(await this.store.getBytes(otherSlot)).to.be.equal(null); + }); + }); + }); + + describe('bytes storage pointer', function () { + beforeEach(async function () { + this.value = web3.utils.randomHex(128); + }); + + it('set', async function () { + await this.store.setBytesStorage(slot, this.value); + }); + + describe('get', function () { + beforeEach(async function () { + await this.store.setBytesStorage(slot, this.value); + }); + + it('from right slot', async function () { + expect(await this.store.bytesMap(slot)).to.be.equal(this.value); + expect(await this.store.getBytesStorage(slot)).to.be.equal(this.value); + }); + + it('from other slot', async function () { + expect(await this.store.bytesMap(otherSlot)).to.be.equal(null); + expect(await this.store.getBytesStorage(otherSlot)).to.be.equal(null); + }); + }); + }); }); From 740ce2d440766e5013640f0e47640fae57f5d1d5 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 2 Feb 2023 21:08:41 -0300 Subject: [PATCH 151/197] Update renovate.json --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 875bf6ec4..c0b97d8d7 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,4 @@ { "extends": ["github>OpenZeppelin/configs"], - "labels": ["ignore-changelog"] + "labels": ["ignore-changeset"] } From 132e5aa97bd8f453f9556534a50b51b4b3bb9c2f Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 3 Feb 2023 19:57:47 +0100 Subject: [PATCH 152/197] Add IERC5313.sol (#4013) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ernesto García --- .changeset/happy-socks-travel.md | 5 +++++ contracts/interfaces/IERC5313.sol | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 .changeset/happy-socks-travel.md create mode 100644 contracts/interfaces/IERC5313.sol diff --git a/.changeset/happy-socks-travel.md b/.changeset/happy-socks-travel.md new file mode 100644 index 000000000..b29d6bacd --- /dev/null +++ b/.changeset/happy-socks-travel.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`IERC5313`: Add an interface for EIP-5313 that is now final. diff --git a/contracts/interfaces/IERC5313.sol b/contracts/interfaces/IERC5313.sol new file mode 100644 index 000000000..2c9a47da9 --- /dev/null +++ b/contracts/interfaces/IERC5313.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +/** + * @dev Interface for the Light Contract Ownership Standard. + * + * A standardized minimal interface required to identify an account that controls a contract + * + * _Available since v4.9._ + */ +interface IERC5313 { + /** + * @dev Gets the address of the owner. + */ + function owner() external view returns (address); +} From d13ec90f3719b6a1182b96455aea1ba21699f197 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Fri, 3 Feb 2023 21:15:41 +0200 Subject: [PATCH 153/197] Add warning for `supportsERC165InterfaceUnchecked` edge case (#4017) --- contracts/utils/introspection/ERC165Checker.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/utils/introspection/ERC165Checker.sol b/contracts/utils/introspection/ERC165Checker.sol index 40ffd68f7..db6939d83 100644 --- a/contracts/utils/introspection/ERC165Checker.sol +++ b/contracts/utils/introspection/ERC165Checker.sol @@ -101,6 +101,10 @@ library ERC165Checker { * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. + * + * Some precompiled contracts will falsely indicate support for a given interface, so caution + * should be exercised when using this function. + * * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { From 3b591a48acaab78008ed39d60fbcf429a83155ca Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Fri, 3 Feb 2023 21:15:59 -0300 Subject: [PATCH 154/197] Add storageLayout to outputSelection --- hardhat.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/hardhat.config.js b/hardhat.config.js index 74f40c4d1..32f721b65 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -72,6 +72,7 @@ module.exports = { runs: 200, }, viaIR: withOptimizations && argv.ir, + outputSelection: { '*': { '*': ['storageLayout'] } }, }, }, warnings: { From 260e082ed10e86e5870c4e5859750a8271eeb2b9 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 6 Feb 2023 09:59:25 +0100 Subject: [PATCH 155/197] Add a library for handling short strings in a gas efficient way (#4023) Co-authored-by: Francisco --- .changeset/violet-frogs-hide.md | 5 ++ contracts/utils/README.adoc | 2 + contracts/utils/ShortStrings.sol | 94 ++++++++++++++++++++++++++++++++ package-lock.json | 14 ++--- package.json | 2 +- test/utils/ShortStrings.test.js | 44 +++++++++++++++ 6 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 .changeset/violet-frogs-hide.md create mode 100644 contracts/utils/ShortStrings.sol create mode 100644 test/utils/ShortStrings.test.js diff --git a/.changeset/violet-frogs-hide.md b/.changeset/violet-frogs-hide.md new file mode 100644 index 000000000..21d2bf984 --- /dev/null +++ b/.changeset/violet-frogs-hide.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ShortStrings`: Added a library for handling short strings in a gas efficient way, with fallback to storage for longer strings. diff --git a/contracts/utils/README.adoc b/contracts/utils/README.adoc index 7fef825a6..5e8af93e3 100644 --- a/contracts/utils/README.adoc +++ b/contracts/utils/README.adoc @@ -106,6 +106,8 @@ Note that, in all cases, accounts simply _declare_ their interfaces, but they ar {{Strings}} +{{ShortStrings}} + {{StorageSlot}} {{Multicall}} diff --git a/contracts/utils/ShortStrings.sol b/contracts/utils/ShortStrings.sol new file mode 100644 index 000000000..9f253df82 --- /dev/null +++ b/contracts/utils/ShortStrings.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.8; + +import "./StorageSlot.sol"; + +type ShortString is bytes32; + +/** + * @dev This library provides functions to convert short memory strings + * into a `ShortString` type that can be used as an immutable variable. + * Strings of arbitrary length can be optimized if they are short enough by + * the addition of a storage variable used as fallback. + * + * Usage example: + * + * ```solidity + * contract Named { + * using ShortStrings for *; + * + * ShortString private immutable _name; + * string private _nameFallback; + * + * constructor(string memory contractName) { + * _name = contractName.toShortStringWithFallback(_nameFallback); + * } + * + * function name() external view returns (string memory) { + * return _name.toStringWithFallback(_nameFallback); + * } + * } + * ``` + */ +library ShortStrings { + error StringTooLong(string str); + + /** + * @dev Encode a string of at most 31 chars into a `ShortString`. + * + * This will trigger a `StringTooLong` error is the input string is too long. + */ + function toShortString(string memory str) internal pure returns (ShortString) { + bytes memory bstr = bytes(str); + if (bstr.length > 31) { + revert StringTooLong(str); + } + return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length)); + } + + /** + * @dev Decode a `ShortString` back to a "normal" string. + */ + function toString(ShortString sstr) internal pure returns (string memory) { + uint256 len = length(sstr); + // using `new string(len)` would work locally but is not memory safe. + string memory str = new string(32); + /// @solidity memory-safe-assembly + assembly { + mstore(str, len) + mstore(add(str, 0x20), sstr) + } + return str; + } + + /** + * @dev Return the length of a `ShortString`. + */ + function length(ShortString sstr) internal pure returns (uint256) { + return uint256(ShortString.unwrap(sstr)) & 0xFF; + } + + /** + * @dev Encode a string into a `ShortString`, or write it to storage if it is too long. + */ + function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) { + if (bytes(value).length < 32) { + return toShortString(value); + } else { + StorageSlot.getStringSlot(store).value = value; + return ShortString.wrap(0); + } + } + + /** + * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}. + */ + function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) { + if (length(value) > 0) { + return toString(value); + } else { + return store; + } + } +} diff --git a/package-lock.json b/package-lock.json index 51d350ac7..a663055fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", - "hardhat-exposed": "^0.3.0", + "hardhat-exposed": "^0.3.1", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", @@ -7923,9 +7923,9 @@ } }, "node_modules/hardhat-exposed": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.0.tgz", - "integrity": "sha512-1p2Aou7QW3VVI0iJhh3q9hgPyF66zggeW7v/PrcipniQqaXK+KxJnnJvzGsLvXYzB8lVp23GIK7MXoTjjyXkHQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.1.tgz", + "integrity": "sha512-qyHXdS3NmzrtXF+XL547BMsTAK+IEMW9OOYMH4d362DlPn4L2B2KXKG6OpuJczxYjgMFJ0LunLxNgu6jtRvjRg==", "dev": true, "dependencies": { "micromatch": "^4.0.4", @@ -22753,9 +22753,9 @@ } }, "hardhat-exposed": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.0.tgz", - "integrity": "sha512-1p2Aou7QW3VVI0iJhh3q9hgPyF66zggeW7v/PrcipniQqaXK+KxJnnJvzGsLvXYzB8lVp23GIK7MXoTjjyXkHQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.1.tgz", + "integrity": "sha512-qyHXdS3NmzrtXF+XL547BMsTAK+IEMW9OOYMH4d362DlPn4L2B2KXKG6OpuJczxYjgMFJ0LunLxNgu6jtRvjRg==", "dev": true, "requires": { "micromatch": "^4.0.4", diff --git a/package.json b/package.json index de2951bd1..66d44888a 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", - "hardhat-exposed": "^0.3.0", + "hardhat-exposed": "^0.3.1", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", diff --git a/test/utils/ShortStrings.test.js b/test/utils/ShortStrings.test.js new file mode 100644 index 000000000..f41084a7e --- /dev/null +++ b/test/utils/ShortStrings.test.js @@ -0,0 +1,44 @@ +const { expect } = require('chai'); +const { expectRevertCustomError } = require('../helpers/customError'); + +const ShortStrings = artifacts.require('$ShortStrings'); + +function decode(sstr) { + const length = parseInt(sstr.slice(64), 16); + return web3.utils.toUtf8(sstr).slice(0, length); +} + +contract('ShortStrings', function () { + before(async function () { + this.mock = await ShortStrings.new(); + }); + + for (const str of [0, 1, 16, 31, 32, 64, 1024].map(length => 'a'.repeat(length))) { + describe(`with string length ${str.length}`, function () { + it('encode / decode', async function () { + if (str.length < 32) { + const encoded = await this.mock.$toShortString(str); + expect(decode(encoded)).to.be.equal(str); + + const length = await this.mock.$length(encoded); + expect(length.toNumber()).to.be.equal(str.length); + + const decoded = await this.mock.$toString(encoded); + expect(decoded).to.be.equal(str); + } else { + await expectRevertCustomError(this.mock.$toShortString(str), `StringTooLong("${str}")`); + } + }); + + it('set / get with fallback', async function () { + const { logs } = await this.mock.$toShortStringWithFallback(str, 0); + const { ret0 } = logs.find(({ event }) => event == 'return$toShortStringWithFallback').args; + + expect(await this.mock.$toString(ret0)).to.be.equal(str.length < 32 ? str : ''); + + const recovered = await this.mock.$toStringWithFallback(ret0, 0); + expect(recovered).to.be.equal(str); + }); + }); + } +}); From 1575cc6908f0f38bfb36d459c4ce7295f0f89c49 Mon Sep 17 00:00:00 2001 From: Francisco Date: Mon, 6 Feb 2023 12:20:12 -0300 Subject: [PATCH 156/197] Update Tally screenshots (#4030) --- docs/modules/ROOT/images/tally-admin.png | Bin 22024 -> 0 bytes docs/modules/ROOT/images/tally-exec.png | Bin 0 -> 231859 bytes docs/modules/ROOT/images/tally-vote.png | Bin 33437 -> 40507 bytes docs/modules/ROOT/pages/governance.adoc | 4 ++-- 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 docs/modules/ROOT/images/tally-admin.png create mode 100644 docs/modules/ROOT/images/tally-exec.png diff --git a/docs/modules/ROOT/images/tally-admin.png b/docs/modules/ROOT/images/tally-admin.png deleted file mode 100644 index 8265259302418995cbc0ee77128e6dde20d1dfe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22024 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
>t>*+2Sz_Kd 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∈YQ8Q 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 VZVAzj{5LR4@tvC7A6e6o{|B=b*sA~l literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/tally-vote.png b/docs/modules/ROOT/images/tally-vote.png index 76e9b3a981eb5bf394ccfc2814ee28d3c22e2d51..7d270fce091298627d9c181c315415c7710de784 100644 GIT binary patch literal 40507 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 H55fNfLFfw_ diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index d59e3ce9f..358a63e90 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -284,9 +284,9 @@ image::tally-vote.png[Voting in Tally] === Execute the Proposal -Once the voting period is over, if quorum was reached (enough voting power participated) and the majority voted in favor, the proposal is considered successful and can proceed to be executed. This can also be done in Tally in the "Administration Panel" section of a project. +Once the voting period is over, if quorum was reached (enough voting power participated) and the majority voted in favor, the proposal is considered successful and can proceed to be executed. Once a proposal passes, it can be queued and executed from the same place you voted. -image::tally-admin.png[Administration Panel in Tally] +image::tally-exec.png[Administration Panel in Tally] We will see now how to do this manually using Ethers.js. From 95027565c41aafd80512b63a4195194d78ae687d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Tue, 7 Feb 2023 19:15:24 -0600 Subject: [PATCH 157/197] Improve `release-cycle.yml` error reporting (#4034) --- scripts/release/workflow/start.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/release/workflow/start.sh b/scripts/release/workflow/start.sh index 6e5d78b82..7683ec5bc 100644 --- a/scripts/release/workflow/start.sh +++ b/scripts/release/workflow/start.sh @@ -29,4 +29,7 @@ git add . git commit -m "Start release candidate" # Push branch -git push origin "$RELEASE_BRANCH" +if ! git push origin "$RELEASE_BRANCH"; then + echo "::error file=scripts/release/start.sh::Can't push $RELEASE_BRANCH. Did you forget to run this workflow from $RELEASE_BRANCH?" + exit 1 +fi From 4d3e423443d0d0f80861235e5b58866572640114 Mon Sep 17 00:00:00 2001 From: Kimani Kelly Date: Tue, 7 Feb 2023 20:16:36 -0500 Subject: [PATCH 158/197] Make ERC20Wrapper.underlying variable private (#4029) Co-authored-by: Kimani Kelly Co-authored-by: Hadrien Croubois --- .changeset/proud-comics-deliver.md | 5 +++++ .../token/ERC20/extensions/ERC20Wrapper.sol | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 .changeset/proud-comics-deliver.md diff --git a/.changeset/proud-comics-deliver.md b/.changeset/proud-comics-deliver.md new file mode 100644 index 000000000..e9c1015f8 --- /dev/null +++ b/.changeset/proud-comics-deliver.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC20Wrapper`: Make the `underlying` variable private and add a public accessor. diff --git a/contracts/token/ERC20/extensions/ERC20Wrapper.sol b/contracts/token/ERC20/extensions/ERC20Wrapper.sol index 8b153ffca..ce515693e 100644 --- a/contracts/token/ERC20/extensions/ERC20Wrapper.sol +++ b/contracts/token/ERC20/extensions/ERC20Wrapper.sol @@ -16,28 +16,35 @@ import "../utils/SafeERC20.sol"; * _Available since v4.2._ */ abstract contract ERC20Wrapper is ERC20 { - IERC20 public immutable underlying; + IERC20 private immutable _underlying; constructor(IERC20 underlyingToken) { - underlying = underlyingToken; + _underlying = underlyingToken; } /** * @dev See {ERC20-decimals}. */ function decimals() public view virtual override returns (uint8) { - try IERC20Metadata(address(underlying)).decimals() returns (uint8 value) { + try IERC20Metadata(address(_underlying)).decimals() returns (uint8 value) { return value; } catch { return super.decimals(); } } + /** + * @dev Returns the address of the underlying ERC-20 token that is being wrapped. + */ + function underlying() public view returns (IERC20) { + return _underlying; + } + /** * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens. */ function depositFor(address account, uint256 amount) public virtual returns (bool) { - SafeERC20.safeTransferFrom(underlying, _msgSender(), address(this), amount); + SafeERC20.safeTransferFrom(_underlying, _msgSender(), address(this), amount); _mint(account, amount); return true; } @@ -47,7 +54,7 @@ abstract contract ERC20Wrapper is ERC20 { */ function withdrawTo(address account, uint256 amount) public virtual returns (bool) { _burn(_msgSender(), amount); - SafeERC20.safeTransfer(underlying, account, amount); + SafeERC20.safeTransfer(_underlying, account, amount); return true; } @@ -56,7 +63,7 @@ abstract contract ERC20Wrapper is ERC20 { * function that can be exposed with access control if desired. */ function _recover(address account) internal virtual returns (uint256) { - uint256 value = underlying.balanceOf(address(this)) - totalSupply(); + uint256 value = _underlying.balanceOf(address(this)) - totalSupply(); _mint(account, value); return value; } From 8177c4620e049b2749c2069651d7d5b4691e23d2 Mon Sep 17 00:00:00 2001 From: TheGreatHB <74754077+TheGreatHB@users.noreply.github.com> Date: Wed, 8 Feb 2023 10:18:33 +0900 Subject: [PATCH 159/197] Improve gas efficiency in ECDSA (#3853) Signed-off-by: Pascal Marco Caversaccio Co-authored-by: Hadrien Croubois Co-authored-by: Pascal Marco Caversaccio --- .changeset/thin-dragons-report.md | 5 +++++ contracts/utils/cryptography/ECDSA.sol | 20 ++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 .changeset/thin-dragons-report.md diff --git a/.changeset/thin-dragons-report.md b/.changeset/thin-dragons-report.md new file mode 100644 index 000000000..b73730f7f --- /dev/null +++ b/.changeset/thin-dragons-report.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ECDSA`: optimize bytes32 computation by using assembly instead of `abi.encodePacked`. diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index 3f996520e..a499b546b 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -162,10 +162,15 @@ library ECDSA { * * See {recover}. */ - function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { + function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, "\x19Ethereum Signed Message:\n32") + mstore(0x1c, hash) + message := keccak256(0x00, 0x3c) + } } /** @@ -189,7 +194,14 @@ library ECDSA { * * See {recover}. */ - function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { + /// @solidity memory-safe-assembly + assembly { + let ptr := mload(0x40) + mstore(ptr, "\x19\x01") + mstore(add(ptr, 0x02), domainSeparator) + mstore(add(ptr, 0x22), structHash) + data := keccak256(ptr, 0x42) + } } } From d625cb45ea1aa83ee51c75a9e6cf824c38ee6426 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 8 Feb 2023 15:53:57 +0100 Subject: [PATCH 160/197] Include EIP-5267 discovery in EIP-712 (#3969) Co-authored-by: Francisco Co-authored-by: Francisco --- .changeset/short-roses-judge.md | 5 + CHANGELOG.md | 5 + contracts/interfaces/IERC5267.sol | 27 +++++ contracts/utils/cryptography/EIP712.sol | 95 ++++++++++----- test/governance/Governor.test.js | 35 +++--- .../extensions/GovernorWithParams.test.js | 39 +++--- test/governance/utils/Votes.behavior.js | 113 ++++++++---------- test/helpers/eip712.js | 39 ++++-- test/helpers/governance.js | 4 +- test/metatx/ERC2771Context.test.js | 15 +-- test/metatx/MinimalForwarder.test.js | 17 +-- .../token/ERC20/extensions/ERC20Votes.test.js | 104 +++++++--------- .../ERC20/extensions/ERC20VotesComp.test.js | 104 +++++++--------- .../extensions/draft-ERC20Permit.test.js | 44 +++---- test/token/ERC20/utils/SafeERC20.test.js | 14 +-- test/utils/cryptography/EIP712.test.js | 23 ++-- 16 files changed, 358 insertions(+), 325 deletions(-) create mode 100644 .changeset/short-roses-judge.md create mode 100644 contracts/interfaces/IERC5267.sol diff --git a/.changeset/short-roses-judge.md b/.changeset/short-roses-judge.md new file mode 100644 index 000000000..002aebb11 --- /dev/null +++ b/.changeset/short-roses-judge.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`EIP712`: add EIP-5267 support for better domain discovery. diff --git a/CHANGELOG.md b/CHANGELOG.md index e60161db0..ccd279d53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### Breaking changes + +- `EIP712`: Addition of ERC5267 support requires support for user defined value types, which was released in Solidity version 0.8.8. This requires a pragma change from `^0.8.0` to `^0.8.8`. +- `EIP712`: Optimization of the cache for the upgradeable version affects the way `name` and `version` are set. This is no longer done through an initializer, and is instead part of the implementation's constructor. As a consequence, all proxies using the same implementation will necessarily share the same `name` and `version`. Additionally, an implementation upgrade risks changing the EIP712 domain unless the same `name` and `version` are used when deploying the new implementation contract. + ### Deprecations - `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) diff --git a/contracts/interfaces/IERC5267.sol b/contracts/interfaces/IERC5267.sol new file mode 100644 index 000000000..3adc4a703 --- /dev/null +++ b/contracts/interfaces/IERC5267.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +interface IERC5267 { + /** + * @dev MAY be emitted to signal that the domain could have changed. + */ + event EIP712DomainChanged(); + + /** + * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 + * signature. + */ + function eip712Domain() + external + view + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ); +} diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index eb211a7e2..d0e52c396 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -1,9 +1,11 @@ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) -pragma solidity ^0.8.0; +pragma solidity ^0.8.8; import "./ECDSA.sol"; +import "../ShortStrings.sol"; +import "../../interfaces/IERC5267.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. @@ -22,19 +24,34 @@ import "./ECDSA.sol"; * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * + * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain + * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the + * separator from the immutable values, which is cheaper than accessing a cached version in cold storage. + * * _Available since v3.4._ + * + * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment */ -abstract contract EIP712 { +abstract contract EIP712 is IERC5267 { + using ShortStrings for *; + + bytes32 private constant _TYPE_HASH = + keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); + /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. - bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; - uint256 private immutable _CACHED_CHAIN_ID; - address private immutable _CACHED_THIS; + bytes32 private immutable _cachedDomainSeparator; + uint256 private immutable _cachedChainId; + address private immutable _cachedThis; - bytes32 private immutable _HASHED_NAME; - bytes32 private immutable _HASHED_VERSION; - bytes32 private immutable _TYPE_HASH; + ShortString private immutable _name; + ShortString private immutable _version; + string private _nameFallback; + string private _versionFallback; + + bytes32 private immutable _hashedName; + bytes32 private immutable _hashedVersion; /* solhint-enable var-name-mixedcase */ @@ -51,36 +68,29 @@ abstract contract EIP712 { * contract upgrade]. */ constructor(string memory name, string memory version) { - bytes32 hashedName = keccak256(bytes(name)); - bytes32 hashedVersion = keccak256(bytes(version)); - bytes32 typeHash = keccak256( - "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" - ); - _HASHED_NAME = hashedName; - _HASHED_VERSION = hashedVersion; - _CACHED_CHAIN_ID = block.chainid; - _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); - _CACHED_THIS = address(this); - _TYPE_HASH = typeHash; + _name = name.toShortStringWithFallback(_nameFallback); + _version = version.toShortStringWithFallback(_versionFallback); + _hashedName = keccak256(bytes(name)); + _hashedVersion = keccak256(bytes(version)); + + _cachedChainId = block.chainid; + _cachedDomainSeparator = _buildDomainSeparator(); + _cachedThis = address(this); } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { - if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { - return _CACHED_DOMAIN_SEPARATOR; + if (address(this) == _cachedThis && block.chainid == _cachedChainId) { + return _cachedDomainSeparator; } else { - return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); + return _buildDomainSeparator(); } } - function _buildDomainSeparator( - bytes32 typeHash, - bytes32 nameHash, - bytes32 versionHash - ) private view returns (bytes32) { - return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); + function _buildDomainSeparator() private view returns (bytes32) { + return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this))); } /** @@ -101,4 +111,33 @@ abstract contract EIP712 { function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } + + /** + * @dev See {EIP-5267}. + */ + function eip712Domain() + public + view + virtual + override + returns ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 salt, + uint256[] memory extensions + ) + { + return ( + hex"0f", // 01111 + _name.toStringWithFallback(_nameFallback), + _version.toStringWithFallback(_versionFallback), + block.chainid, + address(this), + bytes32(0), + new uint256[](0) + ); + } } diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index 4c083ed92..201895934 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -4,7 +4,7 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; const { fromRpcSig } = require('ethereumjs-util'); const Enums = require('../helpers/enums'); -const { EIP712Domain } = require('../helpers/eip712'); +const { getDomain, domainType } = require('../helpers/eip712'); const { GovernorHelper } = require('../helpers/governance'); const { shouldSupportInterfaces } = require('../utils/introspection/SupportsInterface.behavior'); @@ -20,7 +20,6 @@ contract('Governor', function (accounts) { const empty = web3.utils.toChecksumAddress(web3.utils.randomHex(20)); const name = 'OZ-Governor'; - const version = '1'; const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); @@ -148,24 +147,22 @@ contract('Governor', function (accounts) { const voterBySig = Wallet.generate(); const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const signature = async message => { - return fromRpcSig( - ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { - data: { - types: { - EIP712Domain, - Ballot: [ - { name: 'proposalId', type: 'uint256' }, - { name: 'support', type: 'uint8' }, - ], - }, - domain: { name, version, chainId: this.chainId, verifyingContract: this.mock.address }, - primaryType: 'Ballot', - message, + const signature = (contract, message) => + getDomain(contract) + .then(domain => ({ + primaryType: 'Ballot', + types: { + EIP712Domain: domainType(domain), + Ballot: [ + { name: 'proposalId', type: 'uint256' }, + { name: 'support', type: 'uint8' }, + ], }, - }), - ); - }; + domain, + message, + })) + .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.delegate(voterBySigAddress, { from: voter1 }); diff --git a/test/governance/extensions/GovernorWithParams.test.js b/test/governance/extensions/GovernorWithParams.test.js index 26e948544..86ebacc08 100644 --- a/test/governance/extensions/GovernorWithParams.test.js +++ b/test/governance/extensions/GovernorWithParams.test.js @@ -4,7 +4,7 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; const { fromRpcSig } = require('ethereumjs-util'); const Enums = require('../../helpers/enums'); -const { EIP712Domain } = require('../../helpers/eip712'); +const { getDomain, domainType } = require('../../helpers/eip712'); const { GovernorHelper } = require('../../helpers/governance'); const Token = artifacts.require('$ERC20VotesComp'); @@ -22,7 +22,6 @@ contract('GovernorWithParams', function (accounts) { const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; const name = 'OZ-Governor'; - const version = '1'; const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); @@ -116,26 +115,24 @@ contract('GovernorWithParams', function (accounts) { const voterBySig = Wallet.generate(); const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const signature = async message => { - return fromRpcSig( - ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { - data: { - types: { - EIP712Domain, - ExtendedBallot: [ - { name: 'proposalId', type: 'uint256' }, - { name: 'support', type: 'uint8' }, - { name: 'reason', type: 'string' }, - { name: 'params', type: 'bytes' }, - ], - }, - domain: { name, version, chainId: this.chainId, verifyingContract: this.mock.address }, - primaryType: 'ExtendedBallot', - message, + const signature = (contract, message) => + getDomain(contract) + .then(domain => ({ + primaryType: 'ExtendedBallot', + types: { + EIP712Domain: domainType(domain), + ExtendedBallot: [ + { name: 'proposalId', type: 'uint256' }, + { name: 'support', type: 'uint8' }, + { name: 'reason', type: 'string' }, + { name: 'params', type: 'bytes' }, + ], }, - }), - ); - }; + domain, + message, + })) + .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.delegate(voterBySigAddress, { from: voter2 }); diff --git a/test/governance/utils/Votes.behavior.js b/test/governance/utils/Votes.behavior.js index 5062a9c97..8fe34dc47 100644 --- a/test/governance/utils/Votes.behavior.js +++ b/test/governance/utils/Votes.behavior.js @@ -6,7 +6,7 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const { EIP712Domain, domainSeparator } = require('../../helpers/eip712'); +const { getDomain, domainType, domainSeparator } = require('../../helpers/eip712'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -14,8 +14,6 @@ const Delegation = [ { name: 'expiry', type: 'uint256' }, ]; -const version = '1'; - function shouldBehaveLikeVotes() { describe('run votes workflow', function () { it('initial nonce is 0', async function () { @@ -23,14 +21,7 @@ function shouldBehaveLikeVotes() { }); it('domain separator', async function () { - expect(await this.votes.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator({ - name: this.name, - version, - chainId: this.chainId, - verifyingContract: this.votes.address, - }), - ); + expect(await this.votes.DOMAIN_SEPARATOR()).to.equal(domainSeparator(await getDomain(this.votes))); }); describe('delegation with signature', function () { @@ -38,29 +29,29 @@ function shouldBehaveLikeVotes() { const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); const nonce = 0; - const buildData = (chainId, verifyingContract, name, message) => ({ - data: { + const buildAndSignData = async (contract, message, pk) => { + const data = await getDomain(contract).then(domain => ({ primaryType: 'Delegation', - types: { EIP712Domain, Delegation }, - domain: { name, version, chainId, verifyingContract }, + types: { EIP712Domain: domainType(domain), Delegation }, + domain, message, - }, - }); + })); + return fromRpcSig(ethSigUtil.signTypedMessage(pk, { data })); + }; beforeEach(async function () { await this.votes.$_mint(delegatorAddress, this.NFT0); }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), + const { v, r, s } = await buildAndSignData( + this.votes, + { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }, + delegator.getPrivateKey(), ); expect(await this.votes.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -86,15 +77,14 @@ function shouldBehaveLikeVotes() { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), + const { v, r, s } = await buildAndSignData( + this.votes, + { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }, + delegator.getPrivateKey(), ); await this.votes.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -106,15 +96,14 @@ function shouldBehaveLikeVotes() { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), + const { v, r, s } = await buildAndSignData( + this.votes, + { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }, + delegator.getPrivateKey(), ); const receipt = await this.votes.delegateBySig(this.account1Delegatee, nonce, MAX_UINT256, v, r, s); @@ -125,16 +114,16 @@ function shouldBehaveLikeVotes() { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), + const { v, r, s } = await buildAndSignData( + this.votes, + { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }, + delegator.getPrivateKey(), ); + await expectRevert( this.votes.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'Votes: invalid nonce', @@ -143,15 +132,15 @@ function shouldBehaveLikeVotes() { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.votes.address, this.name, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - ), + + const { v, r, s } = await buildAndSignData( + this.votes, + { + delegatee: delegatorAddress, + nonce, + expiry, + }, + delegator.getPrivateKey(), ); await expectRevert( diff --git a/test/helpers/eip712.js b/test/helpers/eip712.js index 9851df662..b12a6233e 100644 --- a/test/helpers/eip712.js +++ b/test/helpers/eip712.js @@ -6,6 +6,7 @@ const EIP712Domain = [ { name: 'version', type: 'string' }, { name: 'chainId', type: 'uint256' }, { name: 'verifyingContract', type: 'address' }, + { name: 'salt', type: 'bytes32' }, ]; const Permit = [ @@ -24,25 +25,43 @@ function hexStringToBuffer(hexstr) { return Buffer.from(hexstr.replace(/^0x/, ''), 'hex'); } -async function domainSeparator({ name, version, chainId, verifyingContract }) { +async function getDomain(contract) { + const { fields, name, version, chainId, verifyingContract, salt, extensions } = await contract.eip712Domain(); + + if (extensions.length > 0) { + throw Error('Extensions not implemented'); + } + + const domain = { name, version, chainId, verifyingContract, salt }; + for (const [i, { name }] of EIP712Domain.entries()) { + if (!(fields & (1 << i))) { + delete domain[name]; + } + } + + return domain; +} + +function domainType(domain) { + return EIP712Domain.filter(({ name }) => domain[name] !== undefined); +} + +function domainSeparator(domain) { return bufferToHexString( - ethSigUtil.TypedDataUtils.hashStruct( - 'EIP712Domain', - { name, version, chainId, verifyingContract }, - { EIP712Domain }, - ), + ethSigUtil.TypedDataUtils.hashStruct('EIP712Domain', domain, { EIP712Domain: domainType(domain) }), ); } -async function hashTypedData(domain, structHash) { - return domainSeparator(domain).then(separator => - bufferToHexString(keccak256(Buffer.concat(['0x1901', separator, structHash].map(str => hexStringToBuffer(str))))), +function hashTypedData(domain, structHash) { + return bufferToHexString( + keccak256(Buffer.concat(['0x1901', domainSeparator(domain), structHash].map(str => hexStringToBuffer(str)))), ); } module.exports = { - EIP712Domain, Permit, + getDomain, + domainType, domainSeparator, hashTypedData, }; diff --git a/test/helpers/governance.js b/test/helpers/governance.js index f933f389d..b945a16e0 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -84,7 +84,7 @@ class GovernorHelper { ? // if signature, and either params or reason → vote.params || vote.reason ? vote - .signature({ + .signature(this.governor, { proposalId: proposal.id, support: vote.support, reason: vote.reason || '', @@ -96,7 +96,7 @@ class GovernorHelper { ), ) : vote - .signature({ + .signature(this.governor, { proposalId: proposal.id, support: vote.support, }) diff --git a/test/metatx/ERC2771Context.test.js b/test/metatx/ERC2771Context.test.js index 788777726..6c298d3d9 100644 --- a/test/metatx/ERC2771Context.test.js +++ b/test/metatx/ERC2771Context.test.js @@ -1,6 +1,6 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const { EIP712Domain } = require('../helpers/eip712'); +const { getDomain, domainType } = require('../helpers/eip712'); const { expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); @@ -10,24 +10,15 @@ const MinimalForwarder = artifacts.require('MinimalForwarder'); const ContextMockCaller = artifacts.require('ContextMockCaller'); const { shouldBehaveLikeRegularContext } = require('../utils/Context.behavior'); -const { getChainId } = require('../helpers/chainid'); - -const name = 'MinimalForwarder'; -const version = '0.0.1'; contract('ERC2771Context', function (accounts) { beforeEach(async function () { this.forwarder = await MinimalForwarder.new(); this.recipient = await ERC2771ContextMock.new(this.forwarder.address); - this.domain = { - name, - version, - chainId: await getChainId(), - verifyingContract: this.forwarder.address, - }; + this.domain = await getDomain(this.forwarder); this.types = { - EIP712Domain, + EIP712Domain: domainType(this.domain), ForwardRequest: [ { name: 'from', type: 'address' }, { name: 'to', type: 'address' }, diff --git a/test/metatx/MinimalForwarder.test.js b/test/metatx/MinimalForwarder.test.js index 24de1719d..4884cc760 100644 --- a/test/metatx/MinimalForwarder.test.js +++ b/test/metatx/MinimalForwarder.test.js @@ -1,29 +1,20 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const { EIP712Domain } = require('../helpers/eip712'); +const { getDomain, domainType } = require('../helpers/eip712'); const { expectRevert, constants } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { getChainId } = require('../helpers/chainid'); - const MinimalForwarder = artifacts.require('MinimalForwarder'); const CallReceiverMock = artifacts.require('CallReceiverMock'); -const name = 'MinimalForwarder'; -const version = '0.0.1'; - contract('MinimalForwarder', function (accounts) { beforeEach(async function () { this.forwarder = await MinimalForwarder.new(); - this.domain = { - name, - version, - chainId: await getChainId(), - verifyingContract: this.forwarder.address, - }; + + this.domain = await getDomain(this.forwarder); this.types = { - EIP712Domain, + EIP712Domain: domainType(this.domain), ForwardRequest: [ { name: 'from', type: 'address' }, { name: 'to', type: 'address' }, diff --git a/test/token/ERC20/extensions/ERC20Votes.test.js b/test/token/ERC20/extensions/ERC20Votes.test.js index a340e71a7..9759c1162 100644 --- a/test/token/ERC20/extensions/ERC20Votes.test.js +++ b/test/token/ERC20/extensions/ERC20Votes.test.js @@ -11,7 +11,7 @@ const Wallet = require('ethereumjs-wallet').default; const ERC20Votes = artifacts.require('$ERC20Votes'); const { batchInBlock } = require('../../../helpers/txpool'); -const { EIP712Domain, domainSeparator } = require('../../../helpers/eip712'); +const { getDomain, domainType, domainSeparator } = require('../../../helpers/eip712'); const { getChainId } = require('../../../helpers/chainid'); const Delegation = [ @@ -38,9 +38,7 @@ contract('ERC20Votes', function (accounts) { }); it('domain separator', async function () { - expect(await this.token.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), - ); + expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); }); it('minting restriction', async function () { @@ -107,30 +105,26 @@ contract('ERC20Votes', function (accounts) { const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); const nonce = 0; - const buildData = (chainId, verifyingContract, message) => ({ - data: { + const buildData = (contract, message) => + getDomain(contract).then(domain => ({ primaryType: 'Delegation', - types: { EIP712Domain, Delegation }, - domain: { name, version, chainId, verifyingContract }, + types: { EIP712Domain: domainType(domain), Delegation }, + domain, message, - }, - }); + })); beforeEach(async function () { await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -155,16 +149,13 @@ contract('ERC20Votes', function (accounts) { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -175,16 +166,13 @@ contract('ERC20Votes', function (accounts) { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); @@ -194,16 +182,14 @@ contract('ERC20Votes', function (accounts) { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); + await expectRevert( this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'ERC20Votes: invalid nonce', @@ -212,16 +198,14 @@ contract('ERC20Votes', function (accounts) { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - ), - ); + + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), diff --git a/test/token/ERC20/extensions/ERC20VotesComp.test.js b/test/token/ERC20/extensions/ERC20VotesComp.test.js index 6a7c00013..660ed2124 100644 --- a/test/token/ERC20/extensions/ERC20VotesComp.test.js +++ b/test/token/ERC20/extensions/ERC20VotesComp.test.js @@ -11,7 +11,7 @@ const Wallet = require('ethereumjs-wallet').default; const ERC20VotesComp = artifacts.require('$ERC20VotesComp'); const { batchInBlock } = require('../../../helpers/txpool'); -const { EIP712Domain, domainSeparator } = require('../../../helpers/eip712'); +const { getDomain, domainType, domainSeparator } = require('../../../helpers/eip712'); const { getChainId } = require('../../../helpers/chainid'); const Delegation = [ @@ -38,9 +38,7 @@ contract('ERC20VotesComp', function (accounts) { }); it('domain separator', async function () { - expect(await this.token.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), - ); + expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); }); it('minting restriction', async function () { @@ -94,30 +92,26 @@ contract('ERC20VotesComp', function (accounts) { const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); const nonce = 0; - const buildData = (chainId, verifyingContract, message) => ({ - data: { + const buildData = (contract, message) => + getDomain(contract).then(domain => ({ primaryType: 'Delegation', - types: { EIP712Domain, Delegation }, - domain: { name, version, chainId, verifyingContract }, + types: { EIP712Domain: domainType(domain), Delegation }, + domain, message, - }, - }); + })); beforeEach(async function () { await this.token.$_mint(delegatorAddress, supply); }); it('accept signed delegation', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); @@ -142,16 +136,13 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects reused signature', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); @@ -162,16 +153,13 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects bad delegatee', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); @@ -181,16 +169,14 @@ contract('ERC20VotesComp', function (accounts) { }); it('rejects bad nonce', async function () { - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }), - ), - ); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); + await expectRevert( this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), 'ERC20Votes: invalid nonce', @@ -199,16 +185,14 @@ contract('ERC20VotesComp', function (accounts) { it('rejects expired permit', async function () { const expiry = (await time.latest()) - time.duration.weeks(1); - const { v, r, s } = fromRpcSig( - ethSigUtil.signTypedMessage( - delegator.getPrivateKey(), - buildData(this.chainId, this.token.address, { - delegatee: delegatorAddress, - nonce, - expiry, - }), - ), - ); + + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry, + }) + .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) + .then(fromRpcSig); await expectRevert( this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), diff --git a/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/test/token/ERC20/extensions/draft-ERC20Permit.test.js index eb6737826..33c43c479 100644 --- a/test/token/ERC20/extensions/draft-ERC20Permit.test.js +++ b/test/token/ERC20/extensions/draft-ERC20Permit.test.js @@ -10,7 +10,7 @@ const Wallet = require('ethereumjs-wallet').default; const ERC20Permit = artifacts.require('$ERC20Permit'); -const { EIP712Domain, Permit, domainSeparator } = require('../../../helpers/eip712'); +const { Permit, getDomain, domainType, domainSeparator } = require('../../../helpers/eip712'); const { getChainId } = require('../../../helpers/chainid'); contract('ERC20Permit', function (accounts) { @@ -34,9 +34,7 @@ contract('ERC20Permit', function (accounts) { }); it('domain separator', async function () { - expect(await this.token.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator({ name, version, chainId: this.chainId, verifyingContract: this.token.address }), - ); + expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); }); describe('permit', function () { @@ -47,17 +45,18 @@ contract('ERC20Permit', function (accounts) { const nonce = 0; const maxDeadline = MAX_UINT256; - const buildData = (chainId, verifyingContract, deadline = maxDeadline) => ({ - primaryType: 'Permit', - types: { EIP712Domain, Permit }, - domain: { name, version, chainId, verifyingContract }, - message: { owner, spender, value, nonce, deadline }, - }); + const buildData = (contract, deadline = maxDeadline) => + getDomain(contract).then(domain => ({ + primaryType: 'Permit', + types: { EIP712Domain: domainType(domain), Permit }, + domain, + message: { owner, spender, value, nonce, deadline }, + })); it('accepts owner signature', async function () { - const data = buildData(this.chainId, this.token.address); - const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data }); - const { v, r, s } = fromRpcSig(signature); + const { v, r, s } = await buildData(this.token) + .then(data => ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.permit(owner, spender, value, maxDeadline, v, r, s); @@ -66,9 +65,9 @@ contract('ERC20Permit', function (accounts) { }); it('rejects reused signature', async function () { - const data = buildData(this.chainId, this.token.address); - const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data }); - const { v, r, s } = fromRpcSig(signature); + const { v, r, s } = await buildData(this.token) + .then(data => ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data })) + .then(fromRpcSig); await this.token.permit(owner, spender, value, maxDeadline, v, r, s); @@ -80,9 +79,10 @@ contract('ERC20Permit', function (accounts) { it('rejects other signature', async function () { const otherWallet = Wallet.generate(); - const data = buildData(this.chainId, this.token.address); - const signature = ethSigUtil.signTypedMessage(otherWallet.getPrivateKey(), { data }); - const { v, r, s } = fromRpcSig(signature); + + const { v, r, s } = await buildData(this.token) + .then(data => ethSigUtil.signTypedMessage(otherWallet.getPrivateKey(), { data })) + .then(fromRpcSig); await expectRevert( this.token.permit(owner, spender, value, maxDeadline, v, r, s), @@ -93,9 +93,9 @@ contract('ERC20Permit', function (accounts) { it('rejects expired permit', async function () { const deadline = (await time.latest()) - time.duration.weeks(1); - const data = buildData(this.chainId, this.token.address, deadline); - const signature = ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data }); - const { v, r, s } = fromRpcSig(signature); + const { v, r, s } = await buildData(this.token, deadline) + .then(data => ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data })) + .then(fromRpcSig); await expectRevert(this.token.permit(owner, spender, value, deadline, v, r, s), 'ERC20Permit: expired deadline'); }); diff --git a/test/token/ERC20/utils/SafeERC20.test.js b/test/token/ERC20/utils/SafeERC20.test.js index 878989cb1..a6b10fae3 100644 --- a/test/token/ERC20/utils/SafeERC20.test.js +++ b/test/token/ERC20/utils/SafeERC20.test.js @@ -6,8 +6,7 @@ const ERC20ReturnTrueMock = artifacts.require('ERC20ReturnTrueMock'); const ERC20NoReturnMock = artifacts.require('ERC20NoReturnMock'); const ERC20PermitNoRevertMock = artifacts.require('ERC20PermitNoRevertMock'); -const { EIP712Domain, Permit } = require('../../../helpers/eip712'); -const { getChainId } = require('../../../helpers/chainid'); +const { getDomain, domainType, Permit } = require('../../../helpers/eip712'); const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); @@ -58,16 +57,15 @@ contract('SafeERC20', function (accounts) { const spender = hasNoCode; beforeEach(async function () { - const chainId = await getChainId(); - this.token = await ERC20PermitNoRevertMock.new(); - this.data = { + this.data = await getDomain(this.token).then(domain => ({ primaryType: 'Permit', - types: { EIP712Domain, Permit }, - domain: { name: 'ERC20PermitNoRevertMock', version: '1', chainId, verifyingContract: this.token.address }, + types: { EIP712Domain: domainType(domain), Permit }, + domain, message: { owner, spender, value: '42', nonce: '0', deadline: constants.MAX_UINT256 }, - }; + })); + this.signature = fromRpcSig(ethSigUtil.signTypedMessage(wallet.getPrivateKey(), { data: this.data })); }); diff --git a/test/utils/cryptography/EIP712.test.js b/test/utils/cryptography/EIP712.test.js index 8c20b91ba..f12f22673 100644 --- a/test/utils/cryptography/EIP712.test.js +++ b/test/utils/cryptography/EIP712.test.js @@ -1,8 +1,9 @@ const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const { EIP712Domain, domainSeparator, hashTypedData } = require('../../helpers/eip712'); +const { getDomain, domainType, domainSeparator, hashTypedData } = require('../../helpers/eip712'); const { getChainId } = require('../../helpers/chainid'); +const { mapValues } = require('../../helpers/map-values'); const EIP712Verifier = artifacts.require('$EIP712Verifier'); @@ -21,19 +22,25 @@ contract('EIP712', function (accounts) { chainId: await getChainId(), verifyingContract: this.eip712.address, }; + this.domainType = domainType(this.domain); }); - it('domain separator', async function () { - const expected = await domainSeparator(this.domain); + describe('domain separator', function () { + it('is internally available', async function () { + const expected = await domainSeparator(this.domain); - expect(await this.eip712.$_domainSeparatorV4()).to.equal(expected); + expect(await this.eip712.$_domainSeparatorV4()).to.equal(expected); + }); + + it("can be rebuilt using EIP-5267's eip712Domain", async function () { + const rebuildDomain = await getDomain(this.eip712); + expect(mapValues(rebuildDomain, String)).to.be.deep.equal(mapValues(this.domain, String)); + }); }); it('hash digest', async function () { const structhash = web3.utils.randomHex(32); - const expected = await hashTypedData(this.domain, structhash); - - expect(await this.eip712.$_hashTypedDataV4(structhash)).to.be.equal(expected); + expect(await this.eip712.$_hashTypedDataV4(structhash)).to.be.equal(hashTypedData(this.domain, structhash)); }); it('digest', async function () { @@ -44,7 +51,7 @@ contract('EIP712', function (accounts) { const data = { types: { - EIP712Domain, + EIP712Domain: this.domainType, Mail: [ { name: 'to', type: 'address' }, { name: 'contents', type: 'string' }, From 5b027e517e6aee69f4b4b2f5e78274ac8ee53513 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 8 Feb 2023 22:03:27 +0100 Subject: [PATCH 161/197] Add missing `await` in tests (#4037) --- .../GovernorTimelockCompound.test.js | 2 +- .../GovernorTimelockControl.test.js | 2 +- test/token/ERC20/extensions/ERC4626.test.js | 100 +++++++++--------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/test/governance/extensions/GovernorTimelockCompound.test.js b/test/governance/extensions/GovernorTimelockCompound.test.js index fb6803383..446d74999 100644 --- a/test/governance/extensions/GovernorTimelockCompound.test.js +++ b/test/governance/extensions/GovernorTimelockCompound.test.js @@ -253,7 +253,7 @@ contract('GovernorTimelockCompound', function (accounts) { expect(await this.token.balanceOf(this.mock.address), 0); expect(await this.token.balanceOf(other), 1); - expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { from: this.mock.address, to: other, value: '1', diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 34fdfe92f..2a55787cb 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -264,7 +264,7 @@ contract('GovernorTimelockControl', function (accounts) { expect(await this.token.balanceOf(this.mock.address), 0); expect(await this.token.balanceOf(other), 1); - expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { from: this.mock.address, to: other, value: '1', diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index f85ffd56d..5ed2aa132 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -49,13 +49,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -68,13 +68,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -87,13 +87,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: '0', @@ -106,13 +106,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: '0', @@ -135,13 +135,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -154,13 +154,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -173,13 +173,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: '0', @@ -192,13 +192,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: '0', @@ -221,16 +221,16 @@ contract('ERC4626', function (accounts) { // Can deposit 0 (max deposit) const { tx } = await this.vault.deposit(0, recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, - value: 0, + value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, - value: 0, + value: '0', }); // Cannot deposit more than 0 @@ -247,13 +247,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -267,13 +267,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: '0', @@ -286,13 +286,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.redeem(parseShare(1), recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: '0', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: parseShare(1), @@ -316,13 +316,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(100), @@ -335,13 +335,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: holder, to: this.vault.address, value: parseToken(1).divn(100), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: recipient, value: parseShare(1), @@ -354,13 +354,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.withdraw(parseToken(1), recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: parseShare(100), @@ -382,13 +382,13 @@ contract('ERC4626', function (accounts) { const { tx } = await this.vault.redeem(parseShare(100), recipient, holder, { from: holder }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, value: parseToken(1), }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, value: parseShare(100), @@ -420,12 +420,12 @@ contract('ERC4626', function (accounts) { // 1. Alice mints 2000 shares (costs 2000 tokens) { const { tx } = await this.vault.mint(2000, user1, { from: user1 }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: user1, to: this.vault.address, value: '2000', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: user1, value: '2000', @@ -443,12 +443,12 @@ contract('ERC4626', function (accounts) { // 2. Bob deposits 4000 tokens (mints 4000 shares) { const { tx } = await this.vault.mint(4000, user2, { from: user2 }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: user2, to: this.vault.address, value: '4000', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: user2, value: '4000', @@ -476,12 +476,12 @@ contract('ERC4626', function (accounts) { // 4. Alice deposits 2000 tokens (mints 1333 shares) { const { tx } = await this.vault.deposit(2000, user1, { from: user1 }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: user1, to: this.vault.address, value: '2000', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: user1, value: '1333', @@ -500,12 +500,12 @@ contract('ERC4626', function (accounts) { // NOTE: Alices's vault assets got rounded up { const { tx } = await this.vault.mint(2000, user2, { from: user2 }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: user2, to: this.vault.address, value: '3001', }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, to: user2, value: '2000', @@ -533,12 +533,12 @@ contract('ERC4626', function (accounts) { // 7. Alice redeem 1333 shares (2428 assets) { const { tx } = await this.vault.redeem(1333, user1, user1, { from: user1 }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: user1, to: constants.ZERO_ADDRESS, value: '1333', }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user1, value: '2428', @@ -555,12 +555,12 @@ contract('ERC4626', function (accounts) { // 8. Bob withdraws 2929 assets (1608 shares) { const { tx } = await this.vault.withdraw(2929, user2, user2, { from: user2 }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: user2, to: constants.ZERO_ADDRESS, value: '1608', }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user2, value: '2929', @@ -578,12 +578,12 @@ contract('ERC4626', function (accounts) { // NOTE: Bob's assets have been rounded back up { const { tx } = await this.vault.withdraw(3643, user1, user1, { from: user1 }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: user1, to: constants.ZERO_ADDRESS, value: '2000', }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user1, value: '3643', @@ -600,12 +600,12 @@ contract('ERC4626', function (accounts) { // 10. Bob redeem 4392 shares (8001 tokens) { const { tx } = await this.vault.redeem(4392, user2, user2, { from: user2 }); - expectEvent.inTransaction(tx, this.vault, 'Transfer', { + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: user2, to: constants.ZERO_ADDRESS, value: '4392', }); - expectEvent.inTransaction(tx, this.token, 'Transfer', { + await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user2, value: '8001', From 94cd8ef12e0ee6d6a929eae83e28598e5d017270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Thu, 9 Feb 2023 13:43:34 -0600 Subject: [PATCH 162/197] Add ERC721 Wrapper (#3863) Co-authored-by: Hadrien Croubois --- .changeset/early-oranges-raise.md | 5 + contracts/token/ERC721/README.adoc | 3 + .../token/ERC721/extensions/ERC721Wrapper.sol | 102 ++++++ docs/modules/ROOT/pages/governance.adoc | 2 +- test/token/ERC721/ERC721.behavior.js | 5 +- .../ERC721/extensions/ERC721Wrapper.test.js | 338 ++++++++++++++++++ 6 files changed, 452 insertions(+), 3 deletions(-) create mode 100644 .changeset/early-oranges-raise.md create mode 100644 contracts/token/ERC721/extensions/ERC721Wrapper.sol create mode 100644 test/token/ERC721/extensions/ERC721Wrapper.test.js diff --git a/.changeset/early-oranges-raise.md b/.changeset/early-oranges-raise.md new file mode 100644 index 000000000..af60a4432 --- /dev/null +++ b/.changeset/early-oranges-raise.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC721Wrapper`: add a new extension of the `ERC721` token which wraps an underlying token. Deposit and withdraw guarantee that the ownership of each token is backed by a corresponding underlying token with the same identifier. diff --git a/contracts/token/ERC721/README.adoc b/contracts/token/ERC721/README.adoc index b3377afef..f571f5c57 100644 --- a/contracts/token/ERC721/README.adoc +++ b/contracts/token/ERC721/README.adoc @@ -28,6 +28,7 @@ Additionally there are a few of other extensions: * {ERC721Royalty}: A way to signal royalty information following ERC2981. * {ERC721Pausable}: A primitive to pause contract operation. * {ERC721Burnable}: A way for token holders to burn their own tokens. +* {ERC721Wrapper}: Wrapper to create an ERC721 backed by another ERC721, with deposit and withdraw methods. Useful in conjunction with {ERC721Votes}. NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC721 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc721.adoc#Presets[ERC721 Presets] (such as {ERC721PresetMinterPauserAutoId}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. @@ -59,6 +60,8 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel {{ERC721Royalty}} +{{ERC721Wrapper}} + == Presets These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. diff --git a/contracts/token/ERC721/extensions/ERC721Wrapper.sol b/contracts/token/ERC721/extensions/ERC721Wrapper.sol new file mode 100644 index 000000000..87729188a --- /dev/null +++ b/contracts/token/ERC721/extensions/ERC721Wrapper.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../ERC721.sol"; +import "../utils/ERC721Holder.sol"; + +/** + * @dev Extension of the ERC721 token contract to support token wrapping. + * + * Users can deposit and withdraw an "underlying token" and receive a "wrapped token" with a matching tokenId. This is useful + * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC721Votes} will allow the + * wrapping of an existing "basic" ERC721 into a governance token. + * + * _Available since v4.9.0_ + */ +abstract contract ERC721Wrapper is ERC721, ERC721Holder { + IERC721 private immutable _underlying; + + // Kept as bytes12 so it can be packed with an address + // Equal to 0xb125e89df18e2ceac5fd2fa8 + bytes12 public constant WRAPPER_ACCEPT_MAGIC = bytes12(keccak256("WRAPPER_ACCEPT_MAGIC")); + + constructor(IERC721 underlyingToken) { + _underlying = underlyingToken; + } + + /** + * @dev Allow a user to deposit underlying tokens and mint the corresponding tokenIds. + */ + function depositFor(address account, uint256[] memory tokenIds) public virtual returns (bool) { + bytes memory data = abi.encodePacked(WRAPPER_ACCEPT_MAGIC, account); + + uint256 length = tokenIds.length; + for (uint256 i = 0; i < length; ++i) { + underlying().safeTransferFrom(_msgSender(), address(this), tokenIds[i], data); + } + + return true; + } + + /** + * @dev Allow a user to burn wrapped tokens and withdraw the corresponding tokenIds of the underlying tokens. + */ + function withdrawTo(address account, uint256[] memory tokenIds) public virtual returns (bool) { + uint256 length = tokenIds.length; + for (uint256 i = 0; i < length; ++i) { + uint256 tokenId = tokenIds[i]; + require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Wrapper: caller is not token owner or approved"); + _burn(tokenId); + // Checks were already performed at this point, and there's no way to retake ownership or approval from + // the wrapped tokenId after this point, so it's safe to remove the reentrancy check for the next line. + // slither-disable-next-line reentrancy-no-eth + underlying().safeTransferFrom(address(this), account, tokenId); + } + + return true; + } + + /** + * @dev Overrides {IERC721Receiver-onERC721Received} to allow minting on direct ERC721 transfers to + * this contract. + * + * In case there's data attached, it validates that the sender is aware of this contract's existence and behavior + * by checking a magic value (`WRAPPER_ACCEPT_MAGIC`) in the first 12 bytes. If it also matches, the rest 20 + * bytes are used as an address to send the tokens to. + * + * WARNING: Doesn't work with unsafe transfers (eg. {IERC721-transferFrom}). Use {ERC721Wrapper-_recover} + * for recovering in that scenario. + */ + function onERC721Received( + address, + address from, + uint256 tokenId, + bytes memory data + ) public override returns (bytes4) { + require(address(underlying()) == _msgSender(), "ERC721Wrapper: caller is not underlying"); + if (data.length > 0) { + require(data.length == 32 && WRAPPER_ACCEPT_MAGIC == bytes12(data), "ERC721Wrapper: Invalid data format"); + from = address(bytes20(bytes32(data) << 96)); + } + _safeMint(from, tokenId); + return IERC721Receiver.onERC721Received.selector; + } + + /** + * @dev Mint a wrapped token to cover any underlyingToken that would have been transferred by mistake. Internal + * function that can be exposed with access control if desired. + */ + function _recover(address account, uint256 tokenId) internal virtual returns (uint256) { + require(underlying().ownerOf(tokenId) == address(this), "ERC721Wrapper: wrapper is not token owner"); + _safeMint(account, tokenId); + return tokenId; + } + + /** + * @dev Returns the underlying token. + */ + function underlying() public view virtual returns (IERC721) { + return _underlying; + } +} diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index 358a63e90..eb76321bf 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -119,7 +119,7 @@ contract MyToken is ERC20, ERC20Permit, ERC20Votes, ERC20Wrapper { } ``` -NOTE: Voting power could be determined in different ways: multiple ERC20 tokens, ERC721 tokens, sybil resistant identities, etc. All of these options are potentially supported by writing a custom Votes module for your Governor. The only other source of voting power available in OpenZeppelin Contracts currently is xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`]. +NOTE:The only other source of voting power available in OpenZeppelin Contracts currently is xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`]. ERC721 tokens that don't provide this functionality can be wrapped into a voting tokens using a combination of xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`] and xref:api:token/ERC721Wrapper.adoc#ERC721Wrapper[`ERC721Wrapper`]. === Governor diff --git a/test/token/ERC721/ERC721.behavior.js b/test/token/ERC721/ERC721.behavior.js index c09479572..6867db31f 100644 --- a/test/token/ERC721/ERC721.behavior.js +++ b/test/token/ERC721/ERC721.behavior.js @@ -5,6 +5,7 @@ const { ZERO_ADDRESS } = constants; const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); const ERC721ReceiverMock = artifacts.require('ERC721ReceiverMock'); +const NonERC721ReceiverMock = artifacts.require('CallReceiverMock'); const Error = ['None', 'RevertWithMessage', 'RevertWithoutMessage', 'Panic'].reduce( (acc, entry, idx) => Object.assign({ [entry]: idx }, acc), @@ -316,7 +317,7 @@ function shouldBehaveLikeERC721(errorPrefix, owner, newOwner, approved, anotherA describe('to a contract that does not implement the required function', function () { it('reverts', async function () { - const nonReceiver = this.token; + const nonReceiver = await NonERC721ReceiverMock.new(); await expectRevert( this.token.safeTransferFrom(owner, nonReceiver.address, tokenId, { from: owner }), 'ERC721: transfer to non ERC721Receiver implementer', @@ -392,7 +393,7 @@ function shouldBehaveLikeERC721(errorPrefix, owner, newOwner, approved, anotherA context('to a contract that does not implement the required function', function () { it('reverts', async function () { - const nonReceiver = this.token; + const nonReceiver = await NonERC721ReceiverMock.new(); await expectRevert( this.token.$_safeMint(nonReceiver.address, tokenId), 'ERC721: transfer to non ERC721Receiver implementer', diff --git a/test/token/ERC721/extensions/ERC721Wrapper.test.js b/test/token/ERC721/extensions/ERC721Wrapper.test.js new file mode 100644 index 000000000..5c83d73cc --- /dev/null +++ b/test/token/ERC721/extensions/ERC721Wrapper.test.js @@ -0,0 +1,338 @@ +const { BN, expectEvent, constants, expectRevert } = require('@openzeppelin/test-helpers'); +const { expect } = require('chai'); +const { keccakFromString, bufferToHex } = require('ethereumjs-util'); + +const { shouldBehaveLikeERC721 } = require('../ERC721.behavior'); + +const ERC721 = artifacts.require('$ERC721'); +const ERC721Wrapper = artifacts.require('$ERC721Wrapper'); + +contract('ERC721Wrapper', function (accounts) { + const [initialHolder, anotherAccount, approvedAccount] = accounts; + + const name = 'My Token'; + const symbol = 'MTKN'; + const firstTokenId = new BN(1); + const secondTokenId = new BN(2); + + beforeEach(async function () { + this.underlying = await ERC721.new(name, symbol); + this.token = await ERC721Wrapper.new(`Wrapped ${name}`, `W${symbol}`, this.underlying.address); + + await this.underlying.$_safeMint(initialHolder, firstTokenId); + await this.underlying.$_safeMint(initialHolder, secondTokenId); + }); + + it('has a name', async function () { + expect(await this.token.name()).to.equal(`Wrapped ${name}`); + }); + + it('has a symbol', async function () { + expect(await this.token.symbol()).to.equal(`W${symbol}`); + }); + + it('has underlying', async function () { + expect(await this.token.underlying()).to.be.bignumber.equal(this.underlying.address); + }); + + describe('depositFor', function () { + it('works with token approval', async function () { + await this.underlying.approve(this.token.address, firstTokenId, { from: initialHolder }); + + const { tx } = await this.token.depositFor(initialHolder, [firstTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: initialHolder, + to: this.token.address, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: initialHolder, + tokenId: firstTokenId, + }); + }); + + it('works with approval for all', async function () { + await this.underlying.setApprovalForAll(this.token.address, true, { from: initialHolder }); + + const { tx } = await this.token.depositFor(initialHolder, [firstTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: initialHolder, + to: this.token.address, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: initialHolder, + tokenId: firstTokenId, + }); + }); + + it('works sending to another account', async function () { + await this.underlying.approve(this.token.address, firstTokenId, { from: initialHolder }); + + const { tx } = await this.token.depositFor(anotherAccount, [firstTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: initialHolder, + to: this.token.address, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: anotherAccount, + tokenId: firstTokenId, + }); + }); + + it('works with multiple tokens', async function () { + await this.underlying.approve(this.token.address, firstTokenId, { from: initialHolder }); + await this.underlying.approve(this.token.address, secondTokenId, { from: initialHolder }); + + const { tx } = await this.token.depositFor(initialHolder, [firstTokenId, secondTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: initialHolder, + to: this.token.address, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: initialHolder, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: initialHolder, + to: this.token.address, + tokenId: secondTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: initialHolder, + tokenId: secondTokenId, + }); + }); + + it('reverts with missing approval', async function () { + await expectRevert( + this.token.depositFor(initialHolder, [firstTokenId], { from: initialHolder }), + 'ERC721: caller is not token owner or approved', + ); + }); + }); + + describe('withdrawTo', function () { + beforeEach(async function () { + await this.underlying.approve(this.token.address, firstTokenId, { from: initialHolder }); + await this.token.depositFor(initialHolder, [firstTokenId], { from: initialHolder }); + }); + + it('works for an owner', async function () { + const { tx } = await this.token.withdrawTo(initialHolder, [firstTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: initialHolder, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: firstTokenId, + }); + }); + + it('works for an approved', async function () { + await this.token.approve(approvedAccount, firstTokenId, { from: initialHolder }); + + const { tx } = await this.token.withdrawTo(initialHolder, [firstTokenId], { from: approvedAccount }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: initialHolder, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: firstTokenId, + }); + }); + + it('works for an approved for all', async function () { + await this.token.setApprovalForAll(approvedAccount, true, { from: initialHolder }); + + const { tx } = await this.token.withdrawTo(initialHolder, [firstTokenId], { from: approvedAccount }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: initialHolder, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: firstTokenId, + }); + }); + + it("doesn't work for a non-owner nor approved", async function () { + await expectRevert( + this.token.withdrawTo(initialHolder, [firstTokenId], { from: anotherAccount }), + 'ERC721Wrapper: caller is not token owner or approved', + ); + }); + + it('works with multiple tokens', async function () { + await this.underlying.approve(this.token.address, secondTokenId, { from: initialHolder }); + await this.token.depositFor(initialHolder, [secondTokenId], { from: initialHolder }); + + const { tx } = await this.token.withdrawTo(initialHolder, [firstTokenId, secondTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: initialHolder, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: firstTokenId, + }); + }); + + it('works to another account', async function () { + const { tx } = await this.token.withdrawTo(anotherAccount, [firstTokenId], { from: initialHolder }); + + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: anotherAccount, + tokenId: firstTokenId, + }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: firstTokenId, + }); + }); + }); + + describe('onERC721Received', function () { + const WRAPPER_ACCEPT_MAGIC = bufferToHex(keccakFromString('WRAPPER_ACCEPT_MAGIC')).slice(0, 26); // Include 0x + + const magicWithAddresss = address => + web3.utils.encodePacked( + { + value: WRAPPER_ACCEPT_MAGIC, + type: 'bytes12', + }, + { + value: address, + type: 'address', + }, + ); + + it('only allows calls from underlying', async function () { + await expectRevert( + this.token.onERC721Received( + initialHolder, + this.token.address, + firstTokenId, + magicWithAddresss(anotherAccount), // Correct data + { from: anotherAccount }, + ), + 'ERC721Wrapper: caller is not underlying', + ); + }); + + describe('when data length is > 0', function () { + it('reverts with arbitrary data', async function () { + await expectRevert( + this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( + initialHolder, + this.token.address, + firstTokenId, + '0x0123', + { + from: initialHolder, + }, + ), + 'ERC721Wrapper: Invalid data format', + ); + }); + + it('reverts with the magic value and data length different to 32', async function () { + await expectRevert( + this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( + initialHolder, + this.token.address, + firstTokenId, + WRAPPER_ACCEPT_MAGIC, // Reverts for any non-32 bytes value + { + from: initialHolder, + }, + ), + 'ERC721Wrapper: Invalid data format', + ); + }); + + it('mints token to specific holder with address after magic value', async function () { + const { tx } = await this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( + initialHolder, + this.token.address, + firstTokenId, + magicWithAddresss(anotherAccount), + { + from: initialHolder, + }, + ); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: anotherAccount, + tokenId: firstTokenId, + }); + }); + }); + + it('mints a token to from if no data is specified', async function () { + const { tx } = await this.underlying.safeTransferFrom(initialHolder, this.token.address, firstTokenId, { + from: initialHolder, + }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: initialHolder, + tokenId: firstTokenId, + }); + }); + }); + + describe('_recover', function () { + it('works if there is something to recover', async function () { + // Should use `transferFrom` to avoid `onERC721Received` minting + await this.underlying.transferFrom(initialHolder, this.token.address, firstTokenId, { from: initialHolder }); + + const { tx } = await this.token.$_recover(anotherAccount, firstTokenId); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: anotherAccount, + tokenId: firstTokenId, + }); + }); + + it('reverts if there is nothing to recover', async function () { + await expectRevert( + this.token.$_recover(initialHolder, firstTokenId), + 'ERC721Wrapper: wrapper is not token owner', + ); + }); + }); + + describe('ERC712 behavior', function () { + shouldBehaveLikeERC721('ERC721', ...accounts); + }); +}); From 790cc5b65a66e0515bcbf97c430975bb7fbef8f7 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 9 Feb 2023 22:33:55 +0100 Subject: [PATCH 163/197] Add timestamp based governor with EIP-6372 and EIP-5805 (#3934) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Francisco Giordano Co-authored-by: Ernesto García Co-authored-by: Francisco --- .changeset/four-bats-sniff.md | 5 + .changeset/ninety-hornets-kick.md | 5 + .github/actions/storage-layout/action.yml | 2 +- contracts/governance/Governor.sol | 85 +- contracts/governance/IGovernor.sol | 62 +- contracts/governance/README.adoc | 6 +- .../GovernorCompatibilityBravo.sol | 6 +- .../extensions/GovernorPreventLateQuorum.sol | 19 +- .../extensions/GovernorTimelockCompound.sol | 17 +- .../governance/extensions/GovernorVotes.sol | 34 +- .../extensions/GovernorVotesComp.sol | 30 +- .../GovernorVotesQuorumFraction.sol | 29 +- contracts/governance/utils/IVotes.sol | 10 +- contracts/governance/utils/Votes.sol | 81 +- contracts/interfaces/IERC5805.sol | 9 + contracts/interfaces/IERC6372.sol | 17 + contracts/mocks/VotesMock.sol | 11 + .../mocks/token/ERC20VotesLegacyMock.sol | 262 ++++ contracts/mocks/token/VotesTimestamp.sol | 40 + .../token/ERC20/extensions/ERC20Votes.sol | 63 +- contracts/utils/Checkpoints.sol | 50 + scripts/checks/compare-layout.js | 1 - scripts/checks/compareGasReports.js | 16 +- scripts/generate/templates/Checkpoints.js | 66 +- test/governance/Governor.test.js | 1266 +++++++++-------- .../GovernorCompatibilityBravo.test.js | 425 +++--- .../extensions/GovernorComp.test.js | 115 +- .../extensions/GovernorERC721.test.js | 172 +-- .../GovernorPreventLateQuorum.test.js | 309 ++-- .../GovernorTimelockCompound.test.js | 577 ++++---- .../GovernorTimelockControl.test.js | 729 +++++----- .../GovernorVotesQuorumFraction.test.js | 242 ++-- .../extensions/GovernorWithParams.test.js | 252 ++-- test/governance/utils/EIP6372.behavior.js | 23 + test/governance/utils/Votes.behavior.js | 91 +- test/governance/utils/Votes.test.js | 99 +- test/helpers/governance.js | 15 +- test/helpers/time.js | 16 + .../token/ERC20/extensions/ERC20Votes.test.js | 1036 +++++++------- .../ERC20/extensions/ERC20VotesComp.test.js | 967 ++++++------- .../ERC721/extensions/ERC721Votes.test.js | 1 + test/utils/Checkpoints.test.js | 29 +- 42 files changed, 4081 insertions(+), 3209 deletions(-) create mode 100644 .changeset/four-bats-sniff.md create mode 100644 .changeset/ninety-hornets-kick.md create mode 100644 contracts/interfaces/IERC5805.sol create mode 100644 contracts/interfaces/IERC6372.sol create mode 100644 contracts/mocks/token/ERC20VotesLegacyMock.sol create mode 100644 contracts/mocks/token/VotesTimestamp.sol create mode 100644 test/governance/utils/EIP6372.behavior.js create mode 100644 test/helpers/time.js diff --git a/.changeset/four-bats-sniff.md b/.changeset/four-bats-sniff.md new file mode 100644 index 000000000..137b5e515 --- /dev/null +++ b/.changeset/four-bats-sniff.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Governor`: Enable timestamp operation for blockchains without a stable block time. This is achieved by connecting a Governor's internal clock to match a voting token's EIP-6372 interface. diff --git a/.changeset/ninety-hornets-kick.md b/.changeset/ninety-hornets-kick.md new file mode 100644 index 000000000..16886c5c1 --- /dev/null +++ b/.changeset/ninety-hornets-kick.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`Votes`, `ERC20Votes`, `ERC721Votes`: support timestamp checkpointing using EIP-6372. diff --git a/.github/actions/storage-layout/action.yml b/.github/actions/storage-layout/action.yml index e3e104a01..fdfd5a25b 100644 --- a/.github/actions/storage-layout/action.yml +++ b/.github/actions/storage-layout/action.yml @@ -40,7 +40,7 @@ runs: - name: Compare layouts if: steps.reference.outcome == 'success' && github.event_name == 'pull_request' run: | - node scripts/checks/compare-layout.js --head ${{ inputs.layout }} --ref ${{ inputs.ref_layout }} >> $GITHUB_STEP_SUMMARY + node scripts/checks/compare-layout.js --head ${{ inputs.layout }} --ref ${{ inputs.ref_layout }} shell: bash - name: Rename artifacts for upload if: github.event_name != 'pull_request' diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index f82f9fea8..e3691a3ed 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -12,7 +12,6 @@ import "../utils/math/SafeCast.sol"; import "../utils/structs/DoubleEndedQueue.sol"; import "../utils/Address.sol"; import "../utils/Context.sol"; -import "../utils/Timers.sol"; import "./IGovernor.sol"; /** @@ -29,22 +28,29 @@ import "./IGovernor.sol"; abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver { using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; using SafeCast for uint256; - using Timers for Timers.BlockNumber; bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 support)"); bytes32 public constant EXTENDED_BALLOT_TYPEHASH = keccak256("ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)"); + // solhint-disable var-name-mixedcase struct ProposalCore { - Timers.BlockNumber voteStart; - Timers.BlockNumber voteEnd; + // --- start retyped from Timers.BlockNumber at offset 0x00 --- + uint64 voteStart; + address proposer; + bytes4 __gap_unused0; + // --- start retyped from Timers.BlockNumber at offset 0x20 --- + uint64 voteEnd; + bytes24 __gap_unused1; + // --- Remaining fields starting at offset 0x40 --------------- bool executed; bool canceled; - address proposer; } + // solhint-enable var-name-mixedcase string private _name; + /// @custom:oz-retyped-from mapping(uint256 => Governor.ProposalCore) mapping(uint256 => ProposalCore) private _proposals; // This queue keeps track of the governor operating on itself. Calls to functions protected by the @@ -96,12 +102,13 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive return interfaceId == (type(IGovernor).interfaceId ^ + type(IERC6372).interfaceId ^ this.cancel.selector ^ this.castVoteWithReasonAndParams.selector ^ this.castVoteWithReasonAndParamsBySig.selector ^ this.getVotesWithParams.selector) || - interfaceId == (type(IGovernor).interfaceId ^ this.cancel.selector) || - interfaceId == type(IGovernor).interfaceId || + // Previous interface for backwards compatibility + interfaceId == (type(IGovernor).interfaceId ^ type(IERC6372).interfaceId ^ this.cancel.selector) || interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } @@ -162,13 +169,15 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive revert("Governor: unknown proposal id"); } - if (snapshot >= block.number) { + uint256 currentTimepoint = clock(); + + if (snapshot >= currentTimepoint) { return ProposalState.Pending; } uint256 deadline = proposalDeadline(proposalId); - if (deadline >= block.number) { + if (deadline >= currentTimepoint) { return ProposalState.Active; } @@ -179,25 +188,32 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive } } + /** + * @dev Part of the Governor Bravo's interface: _"The number of votes required in order for a voter to become a proposer"_. + */ + function proposalThreshold() public view virtual returns (uint256) { + return 0; + } + /** * @dev See {IGovernor-proposalSnapshot}. */ function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteStart.getDeadline(); + return _proposals[proposalId].voteStart; } /** * @dev See {IGovernor-proposalDeadline}. */ function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteEnd.getDeadline(); + return _proposals[proposalId].voteEnd; } /** - * @dev Part of the Governor Bravo's interface: _"The number of votes required in order for a voter to become a proposer"_. + * @dev Address of the proposer */ - function proposalThreshold() public view virtual returns (uint256) { - return 0; + function _proposalProposer(uint256 proposalId) internal view virtual returns (address) { + return _proposals[proposalId].proposer; } /** @@ -211,13 +227,9 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool); /** - * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`. + * @dev Get the voting weight of `account` at a specific `timepoint`, for a vote as described by `params`. */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory params - ) internal view virtual returns (uint256); + function _getVotes(address account, uint256 timepoint, bytes memory params) internal view virtual returns (uint256); /** * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`. @@ -252,9 +264,10 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive string memory description ) public virtual override returns (uint256) { address proposer = _msgSender(); + uint256 currentTimepoint = clock(); require( - getVotes(proposer, block.number - 1) >= proposalThreshold(), + getVotes(proposer, currentTimepoint - 1) >= proposalThreshold(), "Governor: proposer votes below proposal threshold" ); @@ -263,16 +276,20 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive require(targets.length == values.length, "Governor: invalid proposal length"); require(targets.length == calldatas.length, "Governor: invalid proposal length"); require(targets.length > 0, "Governor: empty proposal"); + require(_proposals[proposalId].proposer == address(0), "Governor: proposal already exists"); - ProposalCore storage proposal = _proposals[proposalId]; - require(proposal.voteStart.isUnset(), "Governor: proposal already exists"); + uint256 snapshot = currentTimepoint + votingDelay(); + uint256 deadline = snapshot + votingPeriod(); - uint64 snapshot = block.number.toUint64() + votingDelay().toUint64(); - uint64 deadline = snapshot + votingPeriod().toUint64(); - - proposal.voteStart.setDeadline(snapshot); - proposal.voteEnd.setDeadline(deadline); - proposal.proposer = proposer; + _proposals[proposalId] = ProposalCore({ + proposer: proposer, + voteStart: snapshot.toUint64(), + voteEnd: deadline.toUint64(), + executed: false, + canceled: false, + __gap_unused0: 0, + __gap_unused1: 0 + }); emit ProposalCreated( proposalId, @@ -416,8 +433,8 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive /** * @dev See {IGovernor-getVotes}. */ - function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, _defaultParams()); + function getVotes(address account, uint256 timepoint) public view virtual override returns (uint256) { + return _getVotes(account, timepoint, _defaultParams()); } /** @@ -425,10 +442,10 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive */ function getVotesWithParams( address account, - uint256 blockNumber, + uint256 timepoint, bytes memory params ) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, params); + return _getVotes(account, timepoint, params); } /** @@ -546,7 +563,7 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive ProposalCore storage proposal = _proposals[proposalId]; require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active"); - uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params); + uint256 weight = _getVotes(account, proposal.voteStart, params); _countVote(proposalId, account, support, weight, params); if (params.length == 0) { diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index 60a4b5470..b12d2f632 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -3,14 +3,15 @@ pragma solidity ^0.8.0; -import "../utils/introspection/ERC165.sol"; +import "../interfaces/IERC165.sol"; +import "../interfaces/IERC6372.sol"; /** * @dev Interface of the {Governor} core. * * _Available since v4.3._ */ -abstract contract IGovernor is IERC165 { +abstract contract IGovernor is IERC165, IERC6372 { enum ProposalState { Pending, Active, @@ -32,8 +33,8 @@ abstract contract IGovernor is IERC165 { uint256[] values, string[] signatures, bytes[] calldatas, - uint256 startBlock, - uint256 endBlock, + uint256 voteStart, + uint256 voteEnd, string description ); @@ -81,6 +82,19 @@ abstract contract IGovernor is IERC165 { */ function version() public view virtual returns (string memory); + /** + * @notice module:core + * @dev See {IERC6372} + */ + function clock() public view virtual override returns (uint48); + + /** + * @notice module:core + * @dev See EIP-6372. + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory); + /** * @notice module:voting * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to @@ -104,7 +118,7 @@ abstract contract IGovernor is IERC165 { * JavaScript class. */ // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual returns (string memory); + function COUNTING_MODE() public view virtual returns (string memory); /** * @notice module:core @@ -125,29 +139,33 @@ abstract contract IGovernor is IERC165 { /** * @notice module:core - * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's - * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the - * beginning of the following block. + * @dev Timepoint used to retrieve user's votes and quorum. If using block number (as per Compound's Comp), the + * snapshot is performed at the end of this block. Hence, voting for this proposal starts at the beginning of the + * following block. */ function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256); /** * @notice module:core - * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote - * during this block. + * @dev Timepoint at which votes close. If using block number, votes close at the end of this block, so it is + * possible to cast a vote during this block. */ function proposalDeadline(uint256 proposalId) public view virtual returns (uint256); /** * @notice module:user-config - * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increased to - * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts. + * @dev Delay, between the proposal is created and the vote starts. The unit this duration is expressed in depends + * on the clock (see EIP-6372) this contract uses. + * + * This can be increased to leave time for users to buy voting power, or delegate it, before the voting of a + * proposal starts. */ function votingDelay() public view virtual returns (uint256); /** * @notice module:user-config - * @dev Delay, in number of blocks, between the vote start and vote ends. + * @dev Delay, between the vote start and vote ends. The unit this duration is expressed in depends on the clock + * (see EIP-6372) this contract uses. * * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting * duration compared to the voting delay. @@ -158,27 +176,27 @@ abstract contract IGovernor is IERC165 { * @notice module:user-config * @dev Minimum number of cast voted required for a proposal to be successful. * - * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the - * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}). + * NOTE: The `timepoint` parameter corresponds to the snapshot used for counting vote. This allows to scale the + * quorum depending on values such as the totalSupply of a token at this timepoint (see {ERC20Votes}). */ - function quorum(uint256 blockNumber) public view virtual returns (uint256); + function quorum(uint256 timepoint) public view virtual returns (uint256); /** * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber`. + * @dev Voting power of an `account` at a specific `timepoint`. * * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or * multiple), {ERC20Votes} tokens. */ - function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256); + function getVotes(address account, uint256 timepoint) public view virtual returns (uint256); /** * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters. + * @dev Voting power of an `account` at a specific `timepoint` given additional encoded parameters. */ function getVotesWithParams( address account, - uint256 blockNumber, + uint256 timepoint, bytes memory params ) public view virtual returns (uint256); @@ -189,8 +207,8 @@ abstract contract IGovernor is IERC165 { function hasVoted(uint256 proposalId, address account) public view virtual returns (bool); /** - * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends - * {IGovernor-votingPeriod} blocks after the voting starts. + * @dev Create a new proposal. Vote start after a delay specified by {IGovernor-votingDelay} and lasts for a + * duration specified by {IGovernor-votingPeriod}. * * Emits a {ProposalCreated} event. */ diff --git a/contracts/governance/README.adoc b/contracts/governance/README.adoc index 9bfa64fea..6d53e973d 100644 --- a/contracts/governance/README.adoc +++ b/contracts/governance/README.adoc @@ -46,9 +46,9 @@ Other extensions can customize the behavior or interface in multiple ways. In addition to modules and extensions, the core contract requires a few virtual functions to be implemented to your particular specifications: -* <>: Delay (in number of blocks) since the proposal is submitted until voting power is fixed and voting starts. This can be used to enforce a delay after a proposal is published for users to buy tokens, or delegate their votes. -* <>: Delay (in number of blocks) since the proposal starts until voting ends. -* <>: Quorum required for a proposal to be successful. This function includes a `blockNumber` argument so the quorum can adapt through time, for example, to follow a token's `totalSupply`. +* <>: Delay (in EIP-6372 clock) since the proposal is submitted until voting power is fixed and voting starts. This can be used to enforce a delay after a proposal is published for users to buy tokens, or delegate their votes. +* <>: Delay (in EIP-6372 clock) since the proposal starts until voting ends. +* <>: Quorum required for a proposal to be successful. This function includes a `timepoint` argument (see EIP-6372) so the quorum can adapt through time, for example, to follow a token's `totalSupply`. NOTE: Functions of the `Governor` contract do not include access control. If you want to restrict access, you should add these checks by overloading the particular functions. Among these, {Governor-_cancel} is internal by default, and you will have to expose it (with the right access control mechanism) yourself if this function is needed. diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 912d02f8a..1b8c09368 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -100,10 +100,10 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp } function cancel(uint256 proposalId) public virtual override(IGovernor, Governor) { - ProposalDetails storage details = _proposalDetails[proposalId]; + address proposer = _proposalDetails[proposalId].proposer; require( - _msgSender() == details.proposer || getVotes(details.proposer, block.number - 1) < proposalThreshold(), + _msgSender() == proposer || getVotes(proposer, clock() - 1) < proposalThreshold(), "GovernorBravo: proposer above threshold" ); @@ -225,7 +225,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp * @dev See {IGovernorCompatibilityBravo-quorumVotes}. */ function quorumVotes() public view virtual override returns (uint256) { - return quorum(block.number - 1); + return quorum(clock() - 1); } // ==================================================== Voting ==================================================== diff --git a/contracts/governance/extensions/GovernorPreventLateQuorum.sol b/contracts/governance/extensions/GovernorPreventLateQuorum.sol index a26bbf059..676d2b13e 100644 --- a/contracts/governance/extensions/GovernorPreventLateQuorum.sol +++ b/contracts/governance/extensions/GovernorPreventLateQuorum.sol @@ -19,10 +19,11 @@ import "../../utils/math/Math.sol"; */ abstract contract GovernorPreventLateQuorum is Governor { using SafeCast for uint256; - using Timers for Timers.BlockNumber; uint64 private _voteExtension; - mapping(uint256 => Timers.BlockNumber) private _extendedDeadlines; + + /// @custom:oz-retyped-from mapping(uint256 => Timers.BlockNumber) + mapping(uint256 => uint64) private _extendedDeadlines; /// @dev Emitted when a proposal deadline is pushed back due to reaching quorum late in its voting period. event ProposalExtended(uint256 indexed proposalId, uint64 extendedDeadline); @@ -44,7 +45,7 @@ abstract contract GovernorPreventLateQuorum is Governor { * proposal reached quorum late in the voting period. See {Governor-proposalDeadline}. */ function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return Math.max(super.proposalDeadline(proposalId), _extendedDeadlines[proposalId].getDeadline()); + return Math.max(super.proposalDeadline(proposalId), _extendedDeadlines[proposalId]); } /** @@ -62,16 +63,14 @@ abstract contract GovernorPreventLateQuorum is Governor { ) internal virtual override returns (uint256) { uint256 result = super._castVote(proposalId, account, support, reason, params); - Timers.BlockNumber storage extendedDeadline = _extendedDeadlines[proposalId]; + if (_extendedDeadlines[proposalId] == 0 && _quorumReached(proposalId)) { + uint64 extendedDeadline = clock() + lateQuorumVoteExtension(); - if (extendedDeadline.isUnset() && _quorumReached(proposalId)) { - uint64 extendedDeadlineValue = block.number.toUint64() + lateQuorumVoteExtension(); - - if (extendedDeadlineValue > proposalDeadline(proposalId)) { - emit ProposalExtended(proposalId, extendedDeadlineValue); + if (extendedDeadline > proposalDeadline(proposalId)) { + emit ProposalExtended(proposalId, extendedDeadline); } - extendedDeadline.setDeadline(extendedDeadlineValue); + _extendedDeadlines[proposalId] = extendedDeadline; } return result; diff --git a/contracts/governance/extensions/GovernorTimelockCompound.sol b/contracts/governance/extensions/GovernorTimelockCompound.sol index 2fa539ead..629f8f800 100644 --- a/contracts/governance/extensions/GovernorTimelockCompound.sol +++ b/contracts/governance/extensions/GovernorTimelockCompound.sol @@ -22,15 +22,11 @@ import "../../vendor/compound/ICompoundTimelock.sol"; */ abstract contract GovernorTimelockCompound is IGovernorTimelock, Governor { using SafeCast for uint256; - using Timers for Timers.Timestamp; - - struct ProposalTimelock { - Timers.Timestamp timer; - } ICompoundTimelock private _timelock; - mapping(uint256 => ProposalTimelock) private _proposalTimelocks; + /// @custom:oz-retyped-from mapping(uint256 => GovernorTimelockCompound.ProposalTimelock) + mapping(uint256 => uint64) private _proposalTimelocks; /** * @dev Emitted when the timelock controller used for proposal execution is modified. @@ -82,7 +78,7 @@ abstract contract GovernorTimelockCompound is IGovernorTimelock, Governor { * @dev Public accessor to check the eta of a queued proposal */ function proposalEta(uint256 proposalId) public view virtual override returns (uint256) { - return _proposalTimelocks[proposalId].timer.getDeadline(); + return _proposalTimelocks[proposalId]; } /** @@ -99,7 +95,8 @@ abstract contract GovernorTimelockCompound is IGovernorTimelock, Governor { require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful"); uint256 eta = block.timestamp + _timelock.delay(); - _proposalTimelocks[proposalId].timer.setDeadline(eta.toUint64()); + _proposalTimelocks[proposalId] = eta.toUint64(); + for (uint256 i = 0; i < targets.length; ++i) { require( !_timelock.queuedTransactions(keccak256(abi.encode(targets[i], values[i], "", calldatas[i], eta))), @@ -145,10 +142,12 @@ abstract contract GovernorTimelockCompound is IGovernorTimelock, Governor { uint256 eta = proposalEta(proposalId); if (eta > 0) { + // update state first + delete _proposalTimelocks[proposalId]; + // do external call later for (uint256 i = 0; i < targets.length; ++i) { _timelock.cancelTransaction(targets[i], values[i], "", calldatas[i], eta); } - _proposalTimelocks[proposalId].timer.reset(); } return proposalId; diff --git a/contracts/governance/extensions/GovernorVotes.sol b/contracts/governance/extensions/GovernorVotes.sol index b328c25d1..644317111 100644 --- a/contracts/governance/extensions/GovernorVotes.sol +++ b/contracts/governance/extensions/GovernorVotes.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import "../Governor.sol"; -import "../utils/IVotes.sol"; +import "../../interfaces/IERC5805.sol"; /** * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token. @@ -12,10 +12,34 @@ import "../utils/IVotes.sol"; * _Available since v4.3._ */ abstract contract GovernorVotes is Governor { - IVotes public immutable token; + IERC5805 public immutable token; constructor(IVotes tokenAddress) { - token = tokenAddress; + token = IERC5805(address(tokenAddress)); + } + + /** + * @dev Clock (as specified in EIP-6372) is set to match the token's clock. Fallback to block numbers if the token + * does not implement EIP-6372. + */ + function clock() public view virtual override returns (uint48) { + try token.clock() returns (uint48 timepoint) { + return timepoint; + } catch { + return SafeCast.toUint48(block.number); + } + } + + /** + * @dev Machine-readable description of the clock as specified in EIP-6372. + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + try token.CLOCK_MODE() returns (string memory clockmode) { + return clockmode; + } catch { + return "mode=blocknumber&from=default"; + } } /** @@ -23,9 +47,9 @@ abstract contract GovernorVotes is Governor { */ function _getVotes( address account, - uint256 blockNumber, + uint256 timepoint, bytes memory /*params*/ ) internal view virtual override returns (uint256) { - return token.getPastVotes(account, blockNumber); + return token.getPastVotes(account, timepoint); } } diff --git a/contracts/governance/extensions/GovernorVotesComp.sol b/contracts/governance/extensions/GovernorVotesComp.sol index 8c4a1f8c1..17250ad7b 100644 --- a/contracts/governance/extensions/GovernorVotesComp.sol +++ b/contracts/governance/extensions/GovernorVotesComp.sol @@ -19,13 +19,37 @@ abstract contract GovernorVotesComp is Governor { } /** - * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}). + * @dev Clock (as specified in EIP-6372) is set to match the token's clock. Fallback to block numbers if the token + * does not implement EIP-6372. + */ + function clock() public view virtual override returns (uint48) { + try token.clock() returns (uint48 timepoint) { + return timepoint; + } catch { + return SafeCast.toUint48(block.number); + } + } + + /** + * @dev Machine-readable description of the clock as specified in EIP-6372. + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + try token.CLOCK_MODE() returns (string memory clockmode) { + return clockmode; + } catch { + return "mode=blocknumber&from=default"; + } + } + + /** + * Read the voting weight from the token's built-in snapshot mechanism (see {Governor-_getVotes}). */ function _getVotes( address account, - uint256 blockNumber, + uint256 timepoint, bytes memory /*params*/ ) internal view virtual override returns (uint256) { - return token.getPriorVotes(account, blockNumber); + return token.getPriorVotes(account, timepoint); } } diff --git a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol index 8efefce39..19c5b194d 100644 --- a/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ b/contracts/governance/extensions/GovernorVotesQuorumFraction.sol @@ -14,10 +14,13 @@ import "../../utils/math/SafeCast.sol"; * _Available since v4.3._ */ abstract contract GovernorVotesQuorumFraction is GovernorVotes { - using Checkpoints for Checkpoints.History; + using SafeCast for *; + using Checkpoints for Checkpoints.Trace224; - uint256 private _quorumNumerator; // DEPRECATED - Checkpoints.History private _quorumNumeratorHistory; + uint256 private _quorumNumerator; // DEPRECATED in favor of _quorumNumeratorHistory + + /// @custom:oz-retyped-from Checkpoints.History + Checkpoints.Trace224 private _quorumNumeratorHistory; event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator); @@ -40,9 +43,9 @@ abstract contract GovernorVotesQuorumFraction is GovernorVotes { } /** - * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}. + * @dev Returns the quorum numerator at a specific timepoint. See {quorumDenominator}. */ - function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) { + function quorumNumerator(uint256 timepoint) public view virtual returns (uint256) { // If history is empty, fallback to old storage uint256 length = _quorumNumeratorHistory._checkpoints.length; if (length == 0) { @@ -50,13 +53,13 @@ abstract contract GovernorVotesQuorumFraction is GovernorVotes { } // Optimistic search, check the latest checkpoint - Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1]; - if (latest._blockNumber <= blockNumber) { + Checkpoints.Checkpoint224 memory latest = _quorumNumeratorHistory._checkpoints[length - 1]; + if (latest._key <= timepoint) { return latest._value; } // Otherwise, do the binary search - return _quorumNumeratorHistory.getAtBlock(blockNumber); + return _quorumNumeratorHistory.upperLookupRecent(timepoint.toUint32()); } /** @@ -67,10 +70,10 @@ abstract contract GovernorVotesQuorumFraction is GovernorVotes { } /** - * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`. + * @dev Returns the quorum for a timepoint, in terms of number of votes: `supply * numerator / denominator`. */ - function quorum(uint256 blockNumber) public view virtual override returns (uint256) { - return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator(); + function quorum(uint256 timepoint) public view virtual override returns (uint256) { + return (token.getPastTotalSupply(timepoint) * quorumNumerator(timepoint)) / quorumDenominator(); } /** @@ -107,12 +110,12 @@ abstract contract GovernorVotesQuorumFraction is GovernorVotes { // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints. if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) { _quorumNumeratorHistory._checkpoints.push( - Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)}) + Checkpoints.Checkpoint224({_key: 0, _value: oldQuorumNumerator.toUint224()}) ); } // Set new quorum for future proposals - _quorumNumeratorHistory.push(newQuorumNumerator); + _quorumNumeratorHistory.push(clock().toUint32(), newQuorumNumerator.toUint224()); emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator); } diff --git a/contracts/governance/utils/IVotes.sol b/contracts/governance/utils/IVotes.sol index 0bef3f920..c73d0732b 100644 --- a/contracts/governance/utils/IVotes.sol +++ b/contracts/governance/utils/IVotes.sol @@ -24,18 +24,20 @@ interface IVotes { function getVotes(address account) external view returns (uint256); /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). + * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is + * configured to use block numbers, this will return the value the end of the corresponding block. */ - function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); + function getPastVotes(address account, uint256 timepoint) external view returns (uint256); /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). + * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is + * configured to use block numbers, this will return the value the end of the corresponding block. * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ - function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); + function getPastTotalSupply(uint256 timepoint) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. diff --git a/contracts/governance/utils/Votes.sol b/contracts/governance/utils/Votes.sol index 2eecf32c6..f70cf3831 100644 --- a/contracts/governance/utils/Votes.sol +++ b/contracts/governance/utils/Votes.sol @@ -2,11 +2,11 @@ // OpenZeppelin Contracts (last updated v4.8.0) (governance/utils/Votes.sol) pragma solidity ^0.8.0; +import "../../interfaces/IERC5805.sol"; import "../../utils/Context.sol"; import "../../utils/Counters.sol"; import "../../utils/Checkpoints.sol"; import "../../utils/cryptography/EIP712.sol"; -import "./IVotes.sol"; /** * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be @@ -28,19 +28,41 @@ import "./IVotes.sol"; * * _Available since v4.5._ */ -abstract contract Votes is IVotes, Context, EIP712 { - using Checkpoints for Checkpoints.History; +abstract contract Votes is Context, EIP712, IERC5805 { + using Checkpoints for Checkpoints.Trace224; using Counters for Counters.Counter; bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegation; - mapping(address => Checkpoints.History) private _delegateCheckpoints; - Checkpoints.History private _totalCheckpoints; + + /// @custom:oz-retyped-from mapping(address => Checkpoints.History) + mapping(address => Checkpoints.Trace224) private _delegateCheckpoints; + + /// @custom:oz-retyped-from Checkpoints.History + Checkpoints.Trace224 private _totalCheckpoints; mapping(address => Counters.Counter) private _nonces; + /** + * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based + * checkpoints (and voting), in which case {CLOCK_MODE} should be overridden as well to match. + */ + function clock() public view virtual override returns (uint48) { + return SafeCast.toUint48(block.number); + } + + /** + * @dev Machine-readable description of the clock as specified in EIP-6372. + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + // Check that the clock was not modified + require(clock() == block.number); + return "mode=blocknumber&from=default"; + } + /** * @dev Returns the current amount of votes that `account` has. */ @@ -49,18 +71,21 @@ abstract contract Votes is IVotes, Context, EIP712 { } /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). + * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is + * configured to use block numbers, this will return the value the end of the corresponding block. * * Requirements: * - * - `blockNumber` must have been already mined + * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined. */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _delegateCheckpoints[account].getAtProbablyRecentBlock(blockNumber); + function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) { + require(timepoint < clock(), "Votes: future lookup"); + return _delegateCheckpoints[account].upperLookupRecent(SafeCast.toUint32(timepoint)); } /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). + * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is + * configured to use block numbers, this will return the value the end of the corresponding block. * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a @@ -68,11 +93,11 @@ abstract contract Votes is IVotes, Context, EIP712 { * * Requirements: * - * - `blockNumber` must have been already mined + * - `timepoint` must be in the past. If operating using block numbers, the block must be already mined. */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "Votes: block not yet mined"); - return _totalCheckpoints.getAtProbablyRecentBlock(blockNumber); + function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) { + require(timepoint < clock(), "Votes: future lookup"); + return _totalCheckpoints.upperLookupRecent(SafeCast.toUint32(timepoint)); } /** @@ -138,10 +163,10 @@ abstract contract Votes is IVotes, Context, EIP712 { */ function _transferVotingUnits(address from, address to, uint256 amount) internal virtual { if (from == address(0)) { - _totalCheckpoints.push(_add, amount); + _push(_totalCheckpoints, _add, SafeCast.toUint224(amount)); } if (to == address(0)) { - _totalCheckpoints.push(_subtract, amount); + _push(_totalCheckpoints, _subtract, SafeCast.toUint224(amount)); } _moveDelegateVotes(delegates(from), delegates(to), amount); } @@ -152,21 +177,37 @@ abstract contract Votes is IVotes, Context, EIP712 { function _moveDelegateVotes(address from, address to, uint256 amount) private { if (from != to && amount > 0) { if (from != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[from].push(_subtract, amount); + (uint256 oldValue, uint256 newValue) = _push( + _delegateCheckpoints[from], + _subtract, + SafeCast.toUint224(amount) + ); emit DelegateVotesChanged(from, oldValue, newValue); } if (to != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[to].push(_add, amount); + (uint256 oldValue, uint256 newValue) = _push( + _delegateCheckpoints[to], + _add, + SafeCast.toUint224(amount) + ); emit DelegateVotesChanged(to, oldValue, newValue); } } } - function _add(uint256 a, uint256 b) private pure returns (uint256) { + function _push( + Checkpoints.Trace224 storage store, + function(uint224, uint224) view returns (uint224) op, + uint224 delta + ) private returns (uint224, uint224) { + return store.push(SafeCast.toUint32(clock()), op(store.latest(), delta)); + } + + function _add(uint224 a, uint224 b) private pure returns (uint224) { return a + b; } - function _subtract(uint256 a, uint256 b) private pure returns (uint256) { + function _subtract(uint224 a, uint224 b) private pure returns (uint224) { return a - b; } diff --git a/contracts/interfaces/IERC5805.sol b/contracts/interfaces/IERC5805.sol new file mode 100644 index 000000000..2c2e5e345 --- /dev/null +++ b/contracts/interfaces/IERC5805.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (interfaces/IERC5805.sol) + +pragma solidity ^0.8.0; + +import "../governance/utils/IVotes.sol"; +import "./IERC6372.sol"; + +interface IERC5805 is IERC6372, IVotes {} diff --git a/contracts/interfaces/IERC6372.sol b/contracts/interfaces/IERC6372.sol new file mode 100644 index 000000000..e1a0bf8b0 --- /dev/null +++ b/contracts/interfaces/IERC6372.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (interfaces/IERC6372.sol) + +pragma solidity ^0.8.0; + +interface IERC6372 { + /** + * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). + */ + function clock() external view returns (uint48); + + /** + * @dev Description of the clock + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() external view returns (string memory); +} diff --git a/contracts/mocks/VotesMock.sol b/contracts/mocks/VotesMock.sol index ece08b075..829504e3a 100644 --- a/contracts/mocks/VotesMock.sol +++ b/contracts/mocks/VotesMock.sol @@ -32,3 +32,14 @@ abstract contract VotesMock is Votes { _transferVotingUnits(owner, address(0), 1); } } + +abstract contract VotesTimestampMock is VotesMock { + function clock() public view override returns (uint48) { + return uint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + return "mode=timestamp"; + } +} diff --git a/contracts/mocks/token/ERC20VotesLegacyMock.sol b/contracts/mocks/token/ERC20VotesLegacyMock.sol new file mode 100644 index 000000000..09a2675d9 --- /dev/null +++ b/contracts/mocks/token/ERC20VotesLegacyMock.sol @@ -0,0 +1,262 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/extensions/ERC20Permit.sol"; +import "../../utils/math/Math.sol"; +import "../../governance/utils/IVotes.sol"; +import "../../utils/math/SafeCast.sol"; +import "../../utils/cryptography/ECDSA.sol"; + +/** + * @dev Copied from the master branch at commit 86de1e8b6c3fa6b4efa4a5435869d2521be0f5f5 + */ +abstract contract ERC20VotesLegacyMock is IVotes, ERC20Permit { + struct Checkpoint { + uint32 fromBlock; + uint224 votes; + } + + bytes32 private constant _DELEGATION_TYPEHASH = + keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); + + mapping(address => address) private _delegates; + mapping(address => Checkpoint[]) private _checkpoints; + Checkpoint[] private _totalSupplyCheckpoints; + + /** + * @dev Get the `pos`-th checkpoint for `account`. + */ + function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { + return _checkpoints[account][pos]; + } + + /** + * @dev Get number of checkpoints for `account`. + */ + function numCheckpoints(address account) public view virtual returns (uint32) { + return SafeCast.toUint32(_checkpoints[account].length); + } + + /** + * @dev Get the address `account` is currently delegating to. + */ + function delegates(address account) public view virtual override returns (address) { + return _delegates[account]; + } + + /** + * @dev Gets the current votes balance for `account` + */ + function getVotes(address account) public view virtual override returns (uint256) { + uint256 pos = _checkpoints[account].length; + unchecked { + return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; + } + } + + /** + * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. + * + * Requirements: + * + * - `blockNumber` must have been already mined + */ + function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { + require(blockNumber < block.number, "ERC20Votes: block not yet mined"); + return _checkpointsLookup(_checkpoints[account], blockNumber); + } + + /** + * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. + * It is NOT the sum of all the delegated votes! + * + * Requirements: + * + * - `blockNumber` must have been already mined + */ + function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { + require(blockNumber < block.number, "ERC20Votes: block not yet mined"); + return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); + } + + /** + * @dev Lookup a value in a list of (sorted) checkpoints. + */ + function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { + // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. + // + // Initially we check if the block is recent to narrow the search range. + // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). + // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. + // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) + // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) + // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not + // out of bounds (in which case we're looking too far in the past and the result is 0). + // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is + // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out + // the same. + uint256 length = ckpts.length; + + uint256 low = 0; + uint256 high = length; + + if (length > 5) { + uint256 mid = length - Math.sqrt(length); + if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { + high = mid; + } else { + low = mid + 1; + } + } + + while (low < high) { + uint256 mid = Math.average(low, high); + if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { + high = mid; + } else { + low = mid + 1; + } + } + + unchecked { + return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes; + } + } + + /** + * @dev Delegate votes from the sender to `delegatee`. + */ + function delegate(address delegatee) public virtual override { + _delegate(_msgSender(), delegatee); + } + + /** + * @dev Delegates votes from signer to `delegatee` + */ + function delegateBySig( + address delegatee, + uint256 nonce, + uint256 expiry, + uint8 v, + bytes32 r, + bytes32 s + ) public virtual override { + require(block.timestamp <= expiry, "ERC20Votes: signature expired"); + address signer = ECDSA.recover( + _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), + v, + r, + s + ); + require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); + _delegate(signer, delegatee); + } + + /** + * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). + */ + function _maxSupply() internal view virtual returns (uint224) { + return type(uint224).max; + } + + /** + * @dev Snapshots the totalSupply after it has been increased. + */ + function _mint(address account, uint256 amount) internal virtual override { + super._mint(account, amount); + require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); + + _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); + } + + /** + * @dev Snapshots the totalSupply after it has been decreased. + */ + function _burn(address account, uint256 amount) internal virtual override { + super._burn(account, amount); + + _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); + } + + /** + * @dev Move voting power when tokens are transferred. + * + * Emits a {IVotes-DelegateVotesChanged} event. + */ + function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override { + super._afterTokenTransfer(from, to, amount); + + _moveVotingPower(delegates(from), delegates(to), amount); + } + + /** + * @dev Change delegation for `delegator` to `delegatee`. + * + * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. + */ + function _delegate(address delegator, address delegatee) internal virtual { + address currentDelegate = delegates(delegator); + uint256 delegatorBalance = balanceOf(delegator); + _delegates[delegator] = delegatee; + + emit DelegateChanged(delegator, currentDelegate, delegatee); + + _moveVotingPower(currentDelegate, delegatee, delegatorBalance); + } + + function _moveVotingPower(address src, address dst, uint256 amount) private { + if (src != dst && amount > 0) { + if (src != address(0)) { + (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); + emit DelegateVotesChanged(src, oldWeight, newWeight); + } + + if (dst != address(0)) { + (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); + emit DelegateVotesChanged(dst, oldWeight, newWeight); + } + } + } + + function _writeCheckpoint( + Checkpoint[] storage ckpts, + function(uint256, uint256) view returns (uint256) op, + uint256 delta + ) private returns (uint256 oldWeight, uint256 newWeight) { + uint256 pos = ckpts.length; + + unchecked { + Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1); + + oldWeight = oldCkpt.votes; + newWeight = op(oldWeight, delta); + + if (pos > 0 && oldCkpt.fromBlock == block.number) { + _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight); + } else { + ckpts.push( + Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}) + ); + } + } + } + + function _add(uint256 a, uint256 b) private pure returns (uint256) { + return a + b; + } + + function _subtract(uint256 a, uint256 b) private pure returns (uint256) { + return a - b; + } + + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ + function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) { + assembly { + mstore(0, ckpts.slot) + result.slot := add(keccak256(0, 0x20), pos) + } + } +} diff --git a/contracts/mocks/token/VotesTimestamp.sol b/contracts/mocks/token/VotesTimestamp.sol new file mode 100644 index 000000000..179c500f4 --- /dev/null +++ b/contracts/mocks/token/VotesTimestamp.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/extensions/ERC20Votes.sol"; +import "../../token/ERC20/extensions/ERC20VotesComp.sol"; +import "../../token/ERC721/extensions/ERC721Votes.sol"; + +abstract contract ERC20VotesTimestampMock is ERC20Votes { + function clock() public view virtual override returns (uint48) { + return SafeCast.toUint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + return "mode=timestamp"; + } +} + +abstract contract ERC20VotesCompTimestampMock is ERC20VotesComp { + function clock() public view virtual override returns (uint48) { + return SafeCast.toUint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + return "mode=timestamp"; + } +} + +abstract contract ERC721VotesTimestampMock is ERC721Votes { + function clock() public view virtual override returns (uint48) { + return SafeCast.toUint48(block.timestamp); + } + + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + return "mode=timestamp"; + } +} diff --git a/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/token/ERC20/extensions/ERC20Votes.sol index bf1c2fd5d..273bb8c50 100644 --- a/contracts/token/ERC20/extensions/ERC20Votes.sol +++ b/contracts/token/ERC20/extensions/ERC20Votes.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.0; import "./ERC20Permit.sol"; +import "../../../interfaces/IERC5805.sol"; import "../../../utils/math/Math.sol"; -import "../../../governance/utils/IVotes.sol"; import "../../../utils/math/SafeCast.sol"; import "../../../utils/cryptography/ECDSA.sol"; @@ -24,7 +24,7 @@ import "../../../utils/cryptography/ECDSA.sol"; * * _Available since v4.2._ */ -abstract contract ERC20Votes is IVotes, ERC20Permit { +abstract contract ERC20Votes is ERC20Permit, IERC5805 { struct Checkpoint { uint32 fromBlock; uint224 votes; @@ -37,6 +37,23 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; + /** + * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting). + */ + function clock() public view virtual override returns (uint48) { + return SafeCast.toUint48(block.number); + } + + /** + * @dev Description of the clock + */ + // solhint-disable-next-line func-name-mixedcase + function CLOCK_MODE() public view virtual override returns (string memory) { + // Check that the clock was not modified + require(clock() == block.number); + return "mode=blocknumber&from=default"; + } + /** * @dev Get the `pos`-th checkpoint for `account`. */ @@ -69,45 +86,45 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { } /** - * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. + * @dev Retrieve the number of votes for `account` at the end of `timepoint`. * * Requirements: * - * - `blockNumber` must have been already mined + * - `timepoint` must be in the past */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_checkpoints[account], blockNumber); + function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) { + require(timepoint < clock(), "ERC20Votes: future lookup"); + return _checkpointsLookup(_checkpoints[account], timepoint); } /** - * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. + * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. * It is NOT the sum of all the delegated votes! * * Requirements: * - * - `blockNumber` must have been already mined + * - `timepoint` must be in the past */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); + function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) { + require(timepoint < clock(), "ERC20Votes: future lookup"); + return _checkpointsLookup(_totalSupplyCheckpoints, timepoint); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ - function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { - // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. + function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) { + // We run a binary search to look for the earliest checkpoint taken after `timepoint`. // // Initially we check if the block is recent to narrow the search range. // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. - // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) - // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) + // - If the middle checkpoint is after `timepoint`, we look in [low, mid) + // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). - // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is - // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out + // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is + // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out // the same. uint256 length = ckpts.length; @@ -116,7 +133,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { if (length > 5) { uint256 mid = length - Math.sqrt(length); - if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { + if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) { high = mid; } else { low = mid + 1; @@ -125,7 +142,7 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { while (low < high) { uint256 mid = Math.average(low, high); - if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { + if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) { high = mid; } else { low = mid + 1; @@ -245,12 +262,10 @@ abstract contract ERC20Votes is IVotes, ERC20Permit { oldWeight = oldCkpt.votes; newWeight = op(oldWeight, delta); - if (pos > 0 && oldCkpt.fromBlock == block.number) { + if (pos > 0 && oldCkpt.fromBlock == clock()) { _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight); } else { - ckpts.push( - Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}) - ); + ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)})); } } } diff --git a/contracts/utils/Checkpoints.sol b/contracts/utils/Checkpoints.sol index 0e0a136a0..025b13d0a 100644 --- a/contracts/utils/Checkpoints.sol +++ b/contracts/utils/Checkpoints.sol @@ -242,6 +242,31 @@ library Checkpoints { return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; } + /** + * @dev Returns the value in the most recent checkpoint with key lower or equal than the search key. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high keys). + */ + function upperLookupRecent(Trace224 storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._checkpoints.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - Math.sqrt(len); + if (key < _unsafeAccess(self._checkpoints, mid)._key) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high); + + return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; + } + /** * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. */ @@ -393,6 +418,31 @@ library Checkpoints { return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; } + /** + * @dev Returns the value in the most recent checkpoint with key lower or equal than the search key. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high keys). + */ + function upperLookupRecent(Trace160 storage self, uint96 key) internal view returns (uint160) { + uint256 len = self._checkpoints.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - Math.sqrt(len); + if (key < _unsafeAccess(self._checkpoints, mid)._key) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high); + + return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; + } + /** * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. */ diff --git a/scripts/checks/compare-layout.js b/scripts/checks/compare-layout.js index ff8cb712e..7b7df9928 100644 --- a/scripts/checks/compare-layout.js +++ b/scripts/checks/compare-layout.js @@ -10,7 +10,6 @@ for (const name in oldLayout) { if (name in newLayout) { const report = getStorageUpgradeReport(oldLayout[name], newLayout[name], {}); if (!report.ok) { - console.log(`ERROR: Storage incompatibility in ${name}`); console.log(report.explain()); process.exitCode = 1; } diff --git a/scripts/checks/compareGasReports.js b/scripts/checks/compareGasReports.js index ca99dea0d..160c8cc52 100755 --- a/scripts/checks/compareGasReports.js +++ b/scripts/checks/compareGasReports.js @@ -10,6 +10,14 @@ const { argv } = require('yargs') choices: ['shell', 'markdown'], default: 'shell', }, + hideEqual: { + type: 'boolean', + default: true, + }, + strictTesting: { + type: 'boolean', + default: false, + }, }); // Deduce base tx cost from the percentage denominator @@ -40,7 +48,7 @@ class Report { } // Compare two reports - static compare(update, ref, opts = { hideEqual: true }) { + static compare(update, ref, opts = { hideEqual: true, strictTesting: false }) { if (JSON.stringify(update.config.metadata) !== JSON.stringify(ref.config.metadata)) { throw new Error('Reports produced with non matching metadata'); } @@ -70,7 +78,9 @@ class Report { const methods = Object.keys(update.info.methods) .filter(key => ref.info.methods[key]) .filter(key => update.info.methods[key].numberOfCalls > 0) - .filter(key => update.info.methods[key].numberOfCalls === ref.info.methods[key].numberOfCalls) + .filter( + key => !opts.strictTesting || update.info.methods[key].numberOfCalls === ref.info.methods[key].numberOfCalls, + ) .map(key => ({ contract: ref.info.methods[key].contract, method: ref.info.methods[key].fnSig, @@ -220,7 +230,7 @@ function formatCmpMarkdown(rows) { } // MAIN -const report = Report.compare(Report.load(argv._[0]), Report.load(argv._[1])); +const report = Report.compare(Report.load(argv._[0]), Report.load(argv._[1]), argv); switch (argv.style) { case 'markdown': diff --git a/scripts/generate/templates/Checkpoints.js b/scripts/generate/templates/Checkpoints.js index afac25991..e51e8b8d1 100644 --- a/scripts/generate/templates/Checkpoints.js +++ b/scripts/generate/templates/Checkpoints.js @@ -1,7 +1,28 @@ const format = require('../format-lines'); +// OPTIONS +const defaultOpts = size => ({ + historyTypeName: `Trace${size}`, + checkpointTypeName: `Checkpoint${size}`, + checkpointFieldName: '_checkpoints', + keyTypeName: `uint${256 - size}`, + keyFieldName: '_key', + valueTypeName: `uint${size}`, + valueFieldName: '_value', +}); + const VALUE_SIZES = [224, 160]; +const OPTS = VALUE_SIZES.map(size => defaultOpts(size)); + +const LEGACY_OPTS = { + ...defaultOpts(224), + historyTypeName: 'History', + checkpointTypeName: 'Checkpoint', + keyFieldName: '_blockNumber', +}; + +// TEMPLATE const header = `\ pragma solidity ^0.8.0; @@ -62,6 +83,31 @@ function upperLookup(${opts.historyTypeName} storage self, ${opts.keyTypeName} k uint256 pos = _upperBinaryLookup(self.${opts.checkpointFieldName}, key, 0, len); return pos == 0 ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1).${opts.valueFieldName}; } + +/** + * @dev Returns the value in the most recent checkpoint with key lower or equal than the search key. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high keys). + */ +function upperLookupRecent(${opts.historyTypeName} storage self, ${opts.keyTypeName} key) internal view returns (${opts.valueTypeName}) { + uint256 len = self.${opts.checkpointFieldName}.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - Math.sqrt(len); + if (key < _unsafeAccess(self.${opts.checkpointFieldName}, mid)._key) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self.${opts.checkpointFieldName}, key, low, high); + + return pos == 0 ? 0 : _unsafeAccess(self.${opts.checkpointFieldName}, pos - 1).${opts.valueFieldName}; +} `; const legacyOperations = opts => `\ @@ -263,26 +309,6 @@ function _unsafeAccess(${opts.checkpointTypeName}[] storage self, uint256 pos) `; /* eslint-enable max-len */ -// OPTIONS -const defaultOpts = size => ({ - historyTypeName: `Trace${size}`, - checkpointTypeName: `Checkpoint${size}`, - checkpointFieldName: '_checkpoints', - keyTypeName: `uint${256 - size}`, - keyFieldName: '_key', - valueTypeName: `uint${size}`, - valueFieldName: '_value', -}); - -const OPTS = VALUE_SIZES.map(size => defaultOpts(size)); - -const LEGACY_OPTS = { - ...defaultOpts(224), - historyTypeName: 'History', - checkpointTypeName: 'Checkpoint', - keyFieldName: '_blockNumber', -}; - // GENERATE module.exports = format( header.trimEnd(), diff --git a/test/governance/Governor.test.js b/test/governance/Governor.test.js index 201895934..1eabaccf0 100644 --- a/test/governance/Governor.test.js +++ b/test/governance/Governor.test.js @@ -1,4 +1,4 @@ -const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; @@ -6,676 +6,694 @@ const { fromRpcSig } = require('ethereumjs-util'); const Enums = require('../helpers/enums'); const { getDomain, domainType } = require('../helpers/eip712'); const { GovernorHelper } = require('../helpers/governance'); +const { clockFromReceipt } = require('../helpers/time'); const { shouldSupportInterfaces } = require('../utils/introspection/SupportsInterface.behavior'); +const { shouldBehaveLikeEIP6372 } = require('./utils/EIP6372.behavior'); -const Token = artifacts.require('$ERC20Votes'); const Governor = artifacts.require('$GovernorMock'); const CallReceiver = artifacts.require('CallReceiverMock'); const ERC721 = artifacts.require('$ERC721'); const ERC1155 = artifacts.require('$ERC1155'); +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, + { Token: artifacts.require('$ERC20VotesLegacyMock'), mode: 'blocknumber' }, +]; + contract('Governor', function (accounts) { const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; - const empty = web3.utils.toChecksumAddress(web3.utils.randomHex(20)); const name = 'OZ-Governor'; const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.chainId = await web3.eth.getChainId(); - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new( - name, // name - votingDelay, // initialVotingDelay - votingPeriod, // initialVotingPeriod - 0, // initialProposalThreshold - this.token.address, // tokenAddress - 10, // quorumNumeratorValue - ); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.chainId = await web3.eth.getChainId(); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new( + name, // name + votingDelay, // initialVotingDelay + votingPeriod, // initialVotingPeriod + 0, // initialProposalThreshold + this.token.address, // tokenAddress + 10, // quorumNumeratorValue + ); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - value, - }, - ], - '', - ); - }); + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + value, + }, + ], + '', + ); + }); - shouldSupportInterfaces(['ERC165', 'ERC1155Receiver', 'Governor', 'GovernorWithParams']); + shouldSupportInterfaces(['ERC165', 'ERC1155Receiver', 'Governor', 'GovernorWithParams']); + shouldBehaveLikeEIP6372(mode); - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - expect(await this.mock.COUNTING_MODE()).to.be.equal('support=bravo&quorum=for,abstain'); - }); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + expect(await this.mock.COUNTING_MODE()).to.be.equal('support=bravo&quorum=for,abstain'); + }); - it('nominal workflow', async function () { - // Before - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(value); - expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal('0'); + it('nominal workflow', async function () { + // Before + expect(await this.mock.$_proposalProposer(this.proposal.id)).to.be.equal(constants.ZERO_ADDRESS); + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(value); + expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal('0'); - // Run proposal - const txPropose = await this.helper.propose({ from: proposer }); + // Run proposal + const txPropose = await this.helper.propose({ from: proposer }); - expectEvent(txPropose, 'ProposalCreated', { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values, - signatures: this.proposal.signatures, - calldatas: this.proposal.data, - startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), - endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), - description: this.proposal.description, - }); + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values, + signatures: this.proposal.signatures, + calldatas: this.proposal.data, + voteStart: web3.utils.toBN(await clockFromReceipt[mode](txPropose.receipt)).add(votingDelay), + voteEnd: web3.utils + .toBN(await clockFromReceipt[mode](txPropose.receipt)) + .add(votingDelay) + .add(votingPeriod), + description: this.proposal.description, + }); - await this.helper.waitForSnapshot(); + await this.helper.waitForSnapshot(); - expectEvent( - await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }), - 'VoteCast', - { - voter: voter1, - support: Enums.VoteType.For, - reason: 'This is nice', - weight: web3.utils.toWei('10'), - }, - ); + expectEvent( + await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }), + 'VoteCast', + { + voter: voter1, + support: Enums.VoteType.For, + reason: 'This is nice', + weight: web3.utils.toWei('10'), + }, + ); - expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { - voter: voter2, - support: Enums.VoteType.For, - weight: web3.utils.toWei('7'), - }); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { + voter: voter2, + support: Enums.VoteType.For, + weight: web3.utils.toWei('7'), + }); - expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { - voter: voter3, - support: Enums.VoteType.Against, - weight: web3.utils.toWei('5'), - }); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { + voter: voter3, + support: Enums.VoteType.Against, + weight: web3.utils.toWei('5'), + }); - expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { - voter: voter4, - support: Enums.VoteType.Abstain, - weight: web3.utils.toWei('2'), - }); + expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { + voter: voter4, + support: Enums.VoteType.Abstain, + weight: web3.utils.toWei('2'), + }); - await this.helper.waitForDeadline(); + await this.helper.waitForDeadline(); - const txExecute = await this.helper.execute(); + const txExecute = await this.helper.execute(); - expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - // After - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); - }); + // After + expect(await this.mock.$_proposalProposer(this.proposal.id)).to.be.equal(proposer); + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); + }); - it('vote with signature', async function () { - const voterBySig = Wallet.generate(); - const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); + it('vote with signature', async function () { + const voterBySig = Wallet.generate(); + const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const signature = (contract, message) => - getDomain(contract) - .then(domain => ({ - primaryType: 'Ballot', - types: { - EIP712Domain: domainType(domain), - Ballot: [ - { name: 'proposalId', type: 'uint256' }, - { name: 'support', type: 'uint8' }, + const signature = (contract, message) => + getDomain(contract) + .then(domain => ({ + primaryType: 'Ballot', + types: { + EIP712Domain: domainType(domain), + Ballot: [ + { name: 'proposalId', type: 'uint256' }, + { name: 'support', type: 'uint8' }, + ], + }, + domain, + message, + })) + .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) + .then(fromRpcSig); + + await this.token.delegate(voterBySigAddress, { from: voter1 }); + + // Run proposal + await this.helper.propose(); + await this.helper.waitForSnapshot(); + expectEvent(await this.helper.vote({ support: Enums.VoteType.For, signature }), 'VoteCast', { + voter: voterBySigAddress, + support: Enums.VoteType.For, + }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + // After + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voterBySigAddress)).to.be.equal(true); + }); + + it('send ethers', async function () { + const empty = web3.utils.toChecksumAddress(web3.utils.randomHex(20)); + + this.proposal = this.helper.setProposal( + [ + { + target: empty, + value, + }, + ], + '', + ); + + // Before + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(value); + expect(await web3.eth.getBalance(empty)).to.be.bignumber.equal('0'); + + // Run proposal + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + // After + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(empty)).to.be.bignumber.equal(value); + }); + + describe('should revert', function () { + describe('on propose', function () { + it('if proposal already exists', async function () { + await this.helper.propose(); + await expectRevert(this.helper.propose(), 'Governor: proposal already exists'); + }); + }); + + describe('on vote', function () { + it('if proposal does not exist', async function () { + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'Governor: unknown proposal id', + ); + }); + + it('if voting has not started', async function () { + await this.helper.propose(); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'Governor: vote not currently active', + ); + }); + + it('if support value is invalid', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await expectRevert( + this.helper.vote({ support: web3.utils.toBN('255') }), + 'GovernorVotingSimple: invalid value for enum VoteType', + ); + }); + + it('if vote was already casted', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'GovernorVotingSimple: vote already cast', + ); + }); + + it('if voting is over', async function () { + await this.helper.propose(); + await this.helper.waitForDeadline(); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'Governor: vote not currently active', + ); + }); + }); + + describe('on execute', function () { + it('if proposal does not exist', async function () { + await expectRevert(this.helper.execute(), 'Governor: unknown proposal id'); + }); + + it('if quorum is not reached', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter3 }); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('if score not reached', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter1 }); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('if voting is not over', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('if receiver revert without reason', async function () { + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunctionRevertsNoReason().encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await expectRevert(this.helper.execute(), 'Governor: call reverted without message'); + }); + + it('if receiver revert with reason', async function () { + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + data: this.receiver.contract.methods.mockFunctionRevertsReason().encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await expectRevert(this.helper.execute(), 'CallReceiverMock: reverting'); + }); + + it('if proposal was already executed', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + }); + }); + + describe('state', function () { + it('Unset', async function () { + await expectRevert(this.mock.state(this.proposal.id), 'Governor: unknown proposal id'); + }); + + it('Pending & Active', async function () { + await this.helper.propose(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Pending); + await this.helper.waitForSnapshot(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Pending); + await this.helper.waitForSnapshot(+1); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); + }); + + it('Defeated', async function () { + await this.helper.propose(); + await this.helper.waitForDeadline(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); + await this.helper.waitForDeadline(+1); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Defeated); + }); + + it('Succeeded', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); + await this.helper.waitForDeadline(+1); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); + }); + + it('Executed', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Executed); + }); + }); + + describe('cancel', function () { + describe('internal', function () { + it('before proposal', async function () { + await expectRevert(this.helper.cancel('internal'), 'Governor: unknown proposal id'); + }); + + it('after proposal', async function () { + await this.helper.propose(); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await this.helper.waitForSnapshot(); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'Governor: vote not currently active', + ); + }); + + it('after vote', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await this.helper.waitForDeadline(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('after deadline', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + await this.helper.cancel('internal'); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('after execution', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + await expectRevert(this.helper.cancel('internal'), 'Governor: proposal not active'); + }); + }); + + describe('public', function () { + it('before proposal', async function () { + await expectRevert(this.helper.cancel('external'), 'Governor: unknown proposal id'); + }); + + it('after proposal', async function () { + await this.helper.propose(); + + await this.helper.cancel('external'); + }); + + it('after proposal - restricted to proposer', async function () { + await this.helper.propose(); + + await expectRevert(this.helper.cancel('external', { from: owner }), 'Governor: only proposer can cancel'); + }); + + it('after vote started', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(1); // snapshot + 1 block + + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); + + it('after vote', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); + + it('after deadline', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); + + it('after execution', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); + }); + }); + }); + + describe('proposal length', function () { + it('empty', async function () { + this.helper.setProposal([], ''); + await expectRevert(this.helper.propose(), 'Governor: empty proposal'); + }); + + it('mismatch #1', async function () { + this.helper.setProposal( + { + targets: [], + values: [web3.utils.toWei('0')], + data: [this.receiver.contract.methods.mockFunction().encodeABI()], + }, + '', + ); + await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); + }); + + it('mismatch #2', async function () { + this.helper.setProposal( + { + targets: [this.receiver.address], + values: [], + data: [this.receiver.contract.methods.mockFunction().encodeABI()], + }, + '', + ); + await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); + }); + + it('mismatch #3', async function () { + this.helper.setProposal( + { + targets: [this.receiver.address], + values: [web3.utils.toWei('0')], + data: [], + }, + '', + ); + await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); + }); + }); + + describe('onlyGovernance updates', function () { + it('setVotingDelay is protected', async function () { + await expectRevert(this.mock.setVotingDelay('0'), 'Governor: onlyGovernance'); + }); + + it('setVotingPeriod is protected', async function () { + await expectRevert(this.mock.setVotingPeriod('32'), 'Governor: onlyGovernance'); + }); + + it('setProposalThreshold is protected', async function () { + await expectRevert(this.mock.setProposalThreshold('1000000000000000000'), 'Governor: onlyGovernance'); + }); + + it('can setVotingDelay through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingDelay('0').encodeABI(), + }, ], - }, - domain, - message, - })) - .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) - .then(fromRpcSig); + '', + ); - await this.token.delegate(voterBySigAddress, { from: voter1 }); + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); - // Run proposal - await this.helper.propose(); - await this.helper.waitForSnapshot(); - expectEvent(await this.helper.vote({ support: Enums.VoteType.For, signature }), 'VoteCast', { - voter: voterBySigAddress, - support: Enums.VoteType.For, - }); - await this.helper.waitForDeadline(); - await this.helper.execute(); + expectEvent(await this.helper.execute(), 'VotingDelaySet', { oldVotingDelay: '4', newVotingDelay: '0' }); - // After - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voterBySigAddress)).to.be.equal(true); - }); + expect(await this.mock.votingDelay()).to.be.bignumber.equal('0'); + }); - it('send ethers', async function () { - this.proposal = this.helper.setProposal( - [ - { - target: empty, - value, - }, - ], - '', - ); + it('can setVotingPeriod through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingPeriod('32').encodeABI(), + }, + ], + '', + ); - // Before - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(value); - expect(await web3.eth.getBalance(empty)).to.be.bignumber.equal('0'); + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); - // Run proposal - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); + expectEvent(await this.helper.execute(), 'VotingPeriodSet', { oldVotingPeriod: '16', newVotingPeriod: '32' }); - // After - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(empty)).to.be.bignumber.equal(value); - }); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal('32'); + }); - describe('should revert', function () { - describe('on propose', function () { - it('if proposal already exists', async function () { - await this.helper.propose(); - await expectRevert(this.helper.propose(), 'Governor: proposal already exists'); + it('cannot setVotingPeriod to 0 through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setVotingPeriod('0').encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + await expectRevert(this.helper.execute(), 'GovernorSettings: voting period too low'); + }); + + it('can setProposalThreshold to 0 through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setProposalThreshold('1000000000000000000').encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + expectEvent(await this.helper.execute(), 'ProposalThresholdSet', { + oldProposalThreshold: '0', + newProposalThreshold: '1000000000000000000', + }); + + expect(await this.mock.proposalThreshold()).to.be.bignumber.equal('1000000000000000000'); + }); + }); + + describe('safe receive', function () { + describe('ERC721', function () { + const name = 'Non Fungible Token'; + const symbol = 'NFT'; + const tokenId = web3.utils.toBN(1); + + beforeEach(async function () { + this.token = await ERC721.new(name, symbol); + await this.token.$_mint(owner, tokenId); + }); + + it('can receive an ERC721 safeTransfer', async function () { + await this.token.safeTransferFrom(owner, this.mock.address, tokenId, { from: owner }); + }); + }); + + describe('ERC1155', function () { + const uri = 'https://token-cdn-domain/{id}.json'; + const tokenIds = { + 1: web3.utils.toBN(1000), + 2: web3.utils.toBN(2000), + 3: web3.utils.toBN(3000), + }; + + beforeEach(async function () { + this.token = await ERC1155.new(uri); + await this.token.$_mintBatch(owner, Object.keys(tokenIds), Object.values(tokenIds), '0x'); + }); + + it('can receive ERC1155 safeTransfer', async function () { + await this.token.safeTransferFrom( + owner, + this.mock.address, + ...Object.entries(tokenIds)[0], // id + amount + '0x', + { from: owner }, + ); + }); + + it('can receive ERC1155 safeBatchTransfer', async function () { + await this.token.safeBatchTransferFrom( + owner, + this.mock.address, + Object.keys(tokenIds), + Object.values(tokenIds), + '0x', + { from: owner }, + ); + }); + }); }); }); - - describe('on vote', function () { - it('if proposal does not exist', async function () { - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'Governor: unknown proposal id', - ); - }); - - it('if voting has not started', async function () { - await this.helper.propose(); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'Governor: vote not currently active', - ); - }); - - it('if support value is invalid', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await expectRevert( - this.helper.vote({ support: new BN('255') }), - 'GovernorVotingSimple: invalid value for enum VoteType', - ); - }); - - it('if vote was already casted', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'GovernorVotingSimple: vote already cast', - ); - }); - - it('if voting is over', async function () { - await this.helper.propose(); - await this.helper.waitForDeadline(); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'Governor: vote not currently active', - ); - }); - }); - - describe('on execute', function () { - it('if proposal does not exist', async function () { - await expectRevert(this.helper.execute(), 'Governor: unknown proposal id'); - }); - - it('if quorum is not reached', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter3 }); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('if score not reached', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter1 }); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('if voting is not over', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('if receiver revert without reason', async function () { - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunctionRevertsNoReason().encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await expectRevert(this.helper.execute(), 'Governor: call reverted without message'); - }); - - it('if receiver revert with reason', async function () { - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - data: this.receiver.contract.methods.mockFunctionRevertsReason().encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await expectRevert(this.helper.execute(), 'CallReceiverMock: reverting'); - }); - - it('if proposal was already executed', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - }); - }); - - describe('state', function () { - it('Unset', async function () { - await expectRevert(this.mock.state(this.proposal.id), 'Governor: unknown proposal id'); - }); - - it('Pending & Active', async function () { - await this.helper.propose(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Pending); - await this.helper.waitForSnapshot(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Pending); - await this.helper.waitForSnapshot(+1); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); - }); - - it('Defeated', async function () { - await this.helper.propose(); - await this.helper.waitForDeadline(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); - await this.helper.waitForDeadline(+1); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Defeated); - }); - - it('Succeeded', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); - await this.helper.waitForDeadline(+1); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); - }); - - it('Executed', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Executed); - }); - }); - - describe('cancel', function () { - describe('internal', function () { - it('before proposal', async function () { - await expectRevert(this.helper.cancel('internal'), 'Governor: unknown proposal id'); - }); - - it('after proposal', async function () { - await this.helper.propose(); - - await this.helper.cancel('internal'); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - - await this.helper.waitForSnapshot(); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'Governor: vote not currently active', - ); - }); - - it('after vote', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - - await this.helper.cancel('internal'); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - - await this.helper.waitForDeadline(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('after deadline', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - await this.helper.cancel('internal'); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('after execution', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - - await expectRevert(this.helper.cancel('internal'), 'Governor: proposal not active'); - }); - }); - - describe('public', function () { - it('before proposal', async function () { - await expectRevert(this.helper.cancel('external'), 'Governor: unknown proposal id'); - }); - - it('after proposal', async function () { - await this.helper.propose(); - - await this.helper.cancel('external'); - }); - - it('after proposal - restricted to proposer', async function () { - await this.helper.propose(); - - await expectRevert(this.helper.cancel('external', { from: owner }), 'Governor: only proposer can cancel'); - }); - - it('after vote started', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(1); // snapshot + 1 block - - await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); - }); - - it('after vote', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - - await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); - }); - - it('after deadline', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); - }); - - it('after execution', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - - await expectRevert(this.helper.cancel('external'), 'Governor: too late to cancel'); - }); - }); - }); - - describe('proposal length', function () { - it('empty', async function () { - this.helper.setProposal([], ''); - await expectRevert(this.helper.propose(), 'Governor: empty proposal'); - }); - - it('mismatch #1', async function () { - this.helper.setProposal( - { - targets: [], - values: [web3.utils.toWei('0')], - data: [this.receiver.contract.methods.mockFunction().encodeABI()], - }, - '', - ); - await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); - }); - - it('mismatch #2', async function () { - this.helper.setProposal( - { - targets: [this.receiver.address], - values: [], - data: [this.receiver.contract.methods.mockFunction().encodeABI()], - }, - '', - ); - await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); - }); - - it('mismatch #3', async function () { - this.helper.setProposal( - { - targets: [this.receiver.address], - values: [web3.utils.toWei('0')], - data: [], - }, - '', - ); - await expectRevert(this.helper.propose(), 'Governor: invalid proposal length'); - }); - }); - - describe('onlyGovernance updates', function () { - it('setVotingDelay is protected', async function () { - await expectRevert(this.mock.setVotingDelay('0'), 'Governor: onlyGovernance'); - }); - - it('setVotingPeriod is protected', async function () { - await expectRevert(this.mock.setVotingPeriod('32'), 'Governor: onlyGovernance'); - }); - - it('setProposalThreshold is protected', async function () { - await expectRevert(this.mock.setProposalThreshold('1000000000000000000'), 'Governor: onlyGovernance'); - }); - - it('can setVotingDelay through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingDelay('0').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.execute(), 'VotingDelaySet', { oldVotingDelay: '4', newVotingDelay: '0' }); - - expect(await this.mock.votingDelay()).to.be.bignumber.equal('0'); - }); - - it('can setVotingPeriod through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingPeriod('32').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.execute(), 'VotingPeriodSet', { oldVotingPeriod: '16', newVotingPeriod: '32' }); - - expect(await this.mock.votingPeriod()).to.be.bignumber.equal('32'); - }); - - it('cannot setVotingPeriod to 0 through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.setVotingPeriod('0').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - await expectRevert(this.helper.execute(), 'GovernorSettings: voting period too low'); - }); - - it('can setProposalThreshold to 0 through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.setProposalThreshold('1000000000000000000').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.execute(), 'ProposalThresholdSet', { - oldProposalThreshold: '0', - newProposalThreshold: '1000000000000000000', - }); - - expect(await this.mock.proposalThreshold()).to.be.bignumber.equal('1000000000000000000'); - }); - }); - - describe('safe receive', function () { - describe('ERC721', function () { - const name = 'Non Fungible Token'; - const symbol = 'NFT'; - const tokenId = new BN(1); - - beforeEach(async function () { - this.token = await ERC721.new(name, symbol); - await this.token.$_mint(owner, tokenId); - }); - - it('can receive an ERC721 safeTransfer', async function () { - await this.token.safeTransferFrom(owner, this.mock.address, tokenId, { from: owner }); - }); - }); - - describe('ERC1155', function () { - const uri = 'https://token-cdn-domain/{id}.json'; - const tokenIds = { - 1: new BN(1000), - 2: new BN(2000), - 3: new BN(3000), - }; - - beforeEach(async function () { - this.token = await ERC1155.new(uri); - await this.token.$_mintBatch(owner, Object.keys(tokenIds), Object.values(tokenIds), '0x'); - }); - - it('can receive ERC1155 safeTransfer', async function () { - await this.token.safeTransferFrom( - owner, - this.mock.address, - ...Object.entries(tokenIds)[0], // id + amount - '0x', - { from: owner }, - ); - }); - - it('can receive ERC1155 safeBatchTransfer', async function () { - await this.token.safeBatchTransferFrom( - owner, - this.mock.address, - Object.keys(tokenIds), - Object.values(tokenIds), - '0x', - { from: owner }, - ); - }); - }); - }); + } }); diff --git a/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/test/governance/compatibility/GovernorCompatibilityBravo.test.js index 3666c4548..9e551949f 100644 --- a/test/governance/compatibility/GovernorCompatibilityBravo.test.js +++ b/test/governance/compatibility/GovernorCompatibilityBravo.test.js @@ -1,14 +1,16 @@ -const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const RLP = require('rlp'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); +const { clockFromReceipt } = require('../../helpers/time'); -const Token = artifacts.require('$ERC20VotesComp'); const Timelock = artifacts.require('CompTimelock'); const Governor = artifacts.require('$GovernorCompatibilityBravoMock'); const CallReceiver = artifacts.require('CallReceiverMock'); +const { shouldBehaveLikeEIP6372 } = require('../utils/EIP6372.behavior'); + function makeContractAddress(creator, nonce) { return web3.utils.toChecksumAddress( web3.utils @@ -18,6 +20,11 @@ function makeContractAddress(creator, nonce) { ); } +const TOKENS = [ + { Token: artifacts.require('$ERC20VotesComp'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesCompTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorCompatibilityBravo', function (accounts) { const [owner, proposer, voter1, voter2, voter3, voter4, other] = accounts; @@ -26,218 +33,236 @@ contract('GovernorCompatibilityBravo', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const proposalThreshold = web3.utils.toWei('10'); const value = web3.utils.toWei('1'); - beforeEach(async function () { - const [deployer] = await web3.eth.getAccounts(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + const [deployer] = await web3.eth.getAccounts(); - this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); - // Need to predict governance address to set it as timelock admin with a delayed transfer - const nonce = await web3.eth.getTransactionCount(deployer); - const predictGovernor = makeContractAddress(deployer, nonce + 1); + // Need to predict governance address to set it as timelock admin with a delayed transfer + const nonce = await web3.eth.getTransactionCount(deployer); + const predictGovernor = makeContractAddress(deployer, nonce + 1); - this.timelock = await Timelock.new(predictGovernor, 2 * 86400); - this.mock = await Governor.new( - name, - votingDelay, - votingPeriod, - proposalThreshold, - this.timelock.address, - this.token.address, - ); - this.receiver = await CallReceiver.new(); + this.timelock = await Timelock.new(predictGovernor, 2 * 86400); + this.mock = await Governor.new( + name, + votingDelay, + votingPeriod, + proposalThreshold, + this.timelock.address, + this.token.address, + ); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: proposer, value: proposalThreshold }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: proposer, value: proposalThreshold }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - signature: 'mockFunction()', - }, - ], - '', - ); - }); - - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - expect(await this.mock.quorumVotes()).to.be.bignumber.equal('0'); - expect(await this.mock.COUNTING_MODE()).to.be.equal('support=bravo&quorum=bravo'); - }); - - it('nominal workflow', async function () { - // Before - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal(value); - expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal('0'); - - // Run proposal - const txPropose = await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - // After - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); - - const proposal = await this.mock.proposals(this.proposal.id); - expect(proposal.id).to.be.bignumber.equal(this.proposal.id); - expect(proposal.proposer).to.be.equal(proposer); - expect(proposal.eta).to.be.bignumber.equal(await this.mock.proposalEta(this.proposal.id)); - expect(proposal.startBlock).to.be.bignumber.equal(await this.mock.proposalSnapshot(this.proposal.id)); - expect(proposal.endBlock).to.be.bignumber.equal(await this.mock.proposalDeadline(this.proposal.id)); - expect(proposal.canceled).to.be.equal(false); - expect(proposal.executed).to.be.equal(true); - - const action = await this.mock.getActions(this.proposal.id); - expect(action.targets).to.be.deep.equal(this.proposal.targets); - // expect(action.values).to.be.deep.equal(this.proposal.values); - expect(action.signatures).to.be.deep.equal(this.proposal.signatures); - expect(action.calldatas).to.be.deep.equal(this.proposal.data); - - const voteReceipt1 = await this.mock.getReceipt(this.proposal.id, voter1); - expect(voteReceipt1.hasVoted).to.be.equal(true); - expect(voteReceipt1.support).to.be.bignumber.equal(Enums.VoteType.For); - expect(voteReceipt1.votes).to.be.bignumber.equal(web3.utils.toWei('10')); - - const voteReceipt2 = await this.mock.getReceipt(this.proposal.id, voter2); - expect(voteReceipt2.hasVoted).to.be.equal(true); - expect(voteReceipt2.support).to.be.bignumber.equal(Enums.VoteType.For); - expect(voteReceipt2.votes).to.be.bignumber.equal(web3.utils.toWei('7')); - - const voteReceipt3 = await this.mock.getReceipt(this.proposal.id, voter3); - expect(voteReceipt3.hasVoted).to.be.equal(true); - expect(voteReceipt3.support).to.be.bignumber.equal(Enums.VoteType.Against); - expect(voteReceipt3.votes).to.be.bignumber.equal(web3.utils.toWei('5')); - - const voteReceipt4 = await this.mock.getReceipt(this.proposal.id, voter4); - expect(voteReceipt4.hasVoted).to.be.equal(true); - expect(voteReceipt4.support).to.be.bignumber.equal(Enums.VoteType.Abstain); - expect(voteReceipt4.votes).to.be.bignumber.equal(web3.utils.toWei('2')); - - expectEvent(txPropose, 'ProposalCreated', { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values, - signatures: this.proposal.signatures.map(() => ''), // this event doesn't contain the proposal detail - calldatas: this.proposal.fulldata, - startBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay), - endBlock: new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod), - description: this.proposal.description, - }); - expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - }); - - it('double voting is forbidden', async function () { - await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await expectRevert( - this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), - 'GovernorCompatibilityBravo: vote already cast', - ); - }); - - it('with function selector and arguments', async function () { - const target = this.receiver.address; - this.helper.setProposal( - [ - { target, data: this.receiver.contract.methods.mockFunction().encodeABI() }, - { target, data: this.receiver.contract.methods.mockFunctionWithArgs(17, 42).encodeABI() }, - { target, signature: 'mockFunctionNonPayable()' }, - { - target, - signature: 'mockFunctionWithArgs(uint256,uint256)', - data: web3.eth.abi.encodeParameters(['uint256', 'uint256'], [18, 43]), - }, - ], - '', - ); - - await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { a: '17', b: '42' }); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { a: '18', b: '43' }); - }); - - describe('should revert', function () { - describe('on propose', function () { - it('if proposal does not meet proposalThreshold', async function () { - await expectRevert(this.helper.propose({ from: other }), 'Governor: proposer votes below proposal threshold'); - }); - }); - - describe('on vote', function () { - it('if vote type is invalide', async function () { - await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await expectRevert( - this.helper.vote({ support: 5 }, { from: voter1 }), - 'GovernorCompatibilityBravo: invalid vote type', + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + signature: 'mockFunction()', + }, + ], + '', ); }); - }); - }); - describe('cancel', function () { - it('proposer can cancel', async function () { - await this.helper.propose({ from: proposer }); - await this.helper.cancel('external', { from: proposer }); - }); + shouldBehaveLikeEIP6372(mode); - it('anyone can cancel if proposer drop below threshold', async function () { - await this.helper.propose({ from: proposer }); - await this.token.transfer(voter1, web3.utils.toWei('1'), { from: proposer }); - await this.helper.cancel('external'); - }); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + expect(await this.mock.quorumVotes()).to.be.bignumber.equal('0'); + expect(await this.mock.COUNTING_MODE()).to.be.equal('support=bravo&quorum=bravo'); + }); - it('cannot cancel is proposer is still above threshold', async function () { - await this.helper.propose({ from: proposer }); - await expectRevert(this.helper.cancel('external'), 'GovernorBravo: proposer above threshold'); + it('nominal workflow', async function () { + // Before + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(false); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal(value); + expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal('0'); + + // Run proposal + const txPropose = await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + // After + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); + + const proposal = await this.mock.proposals(this.proposal.id); + expect(proposal.id).to.be.bignumber.equal(this.proposal.id); + expect(proposal.proposer).to.be.equal(proposer); + expect(proposal.eta).to.be.bignumber.equal(await this.mock.proposalEta(this.proposal.id)); + expect(proposal.startBlock).to.be.bignumber.equal(await this.mock.proposalSnapshot(this.proposal.id)); + expect(proposal.endBlock).to.be.bignumber.equal(await this.mock.proposalDeadline(this.proposal.id)); + expect(proposal.canceled).to.be.equal(false); + expect(proposal.executed).to.be.equal(true); + + const action = await this.mock.getActions(this.proposal.id); + expect(action.targets).to.be.deep.equal(this.proposal.targets); + // expect(action.values).to.be.deep.equal(this.proposal.values); + expect(action.signatures).to.be.deep.equal(this.proposal.signatures); + expect(action.calldatas).to.be.deep.equal(this.proposal.data); + + const voteReceipt1 = await this.mock.getReceipt(this.proposal.id, voter1); + expect(voteReceipt1.hasVoted).to.be.equal(true); + expect(voteReceipt1.support).to.be.bignumber.equal(Enums.VoteType.For); + expect(voteReceipt1.votes).to.be.bignumber.equal(web3.utils.toWei('10')); + + const voteReceipt2 = await this.mock.getReceipt(this.proposal.id, voter2); + expect(voteReceipt2.hasVoted).to.be.equal(true); + expect(voteReceipt2.support).to.be.bignumber.equal(Enums.VoteType.For); + expect(voteReceipt2.votes).to.be.bignumber.equal(web3.utils.toWei('7')); + + const voteReceipt3 = await this.mock.getReceipt(this.proposal.id, voter3); + expect(voteReceipt3.hasVoted).to.be.equal(true); + expect(voteReceipt3.support).to.be.bignumber.equal(Enums.VoteType.Against); + expect(voteReceipt3.votes).to.be.bignumber.equal(web3.utils.toWei('5')); + + const voteReceipt4 = await this.mock.getReceipt(this.proposal.id, voter4); + expect(voteReceipt4.hasVoted).to.be.equal(true); + expect(voteReceipt4.support).to.be.bignumber.equal(Enums.VoteType.Abstain); + expect(voteReceipt4.votes).to.be.bignumber.equal(web3.utils.toWei('2')); + + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values, + signatures: this.proposal.signatures.map(() => ''), // this event doesn't contain the proposal detail + calldatas: this.proposal.fulldata, + voteStart: web3.utils.toBN(await clockFromReceipt[mode](txPropose.receipt)).add(votingDelay), + voteEnd: web3.utils + .toBN(await clockFromReceipt[mode](txPropose.receipt)) + .add(votingDelay) + .add(votingPeriod), + description: this.proposal.description, + }); + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + }); + + it('double voting is forbidden', async function () { + await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await expectRevert( + this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), + 'GovernorCompatibilityBravo: vote already cast', + ); + }); + + it('with function selector and arguments', async function () { + const target = this.receiver.address; + this.helper.setProposal( + [ + { target, data: this.receiver.contract.methods.mockFunction().encodeABI() }, + { target, data: this.receiver.contract.methods.mockFunctionWithArgs(17, 42).encodeABI() }, + { target, signature: 'mockFunctionNonPayable()' }, + { + target, + signature: 'mockFunctionWithArgs(uint256,uint256)', + data: web3.eth.abi.encodeParameters(['uint256', 'uint256'], [18, 43]), + }, + ], + '', + ); + + await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { + a: '17', + b: '42', + }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalledWithArgs', { + a: '18', + b: '43', + }); + }); + + describe('should revert', function () { + describe('on propose', function () { + it('if proposal does not meet proposalThreshold', async function () { + await expectRevert( + this.helper.propose({ from: other }), + 'Governor: proposer votes below proposal threshold', + ); + }); + }); + + describe('on vote', function () { + it('if vote type is invalide', async function () { + await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await expectRevert( + this.helper.vote({ support: 5 }, { from: voter1 }), + 'GovernorCompatibilityBravo: invalid vote type', + ); + }); + }); + }); + + describe('cancel', function () { + it('proposer can cancel', async function () { + await this.helper.propose({ from: proposer }); + await this.helper.cancel('external', { from: proposer }); + }); + + it('anyone can cancel if proposer drop below threshold', async function () { + await this.helper.propose({ from: proposer }); + await this.token.transfer(voter1, web3.utils.toWei('1'), { from: proposer }); + await this.helper.cancel('external'); + }); + + it('cannot cancel is proposer is still above threshold', async function () { + await this.helper.propose({ from: proposer }); + await expectRevert(this.helper.cancel('external'), 'GovernorBravo: proposer above threshold'); + }); + }); }); - }); + } }); diff --git a/test/governance/extensions/GovernorComp.test.js b/test/governance/extensions/GovernorComp.test.js index 8d48b4ddc..bfcd0af38 100644 --- a/test/governance/extensions/GovernorComp.test.js +++ b/test/governance/extensions/GovernorComp.test.js @@ -1,12 +1,15 @@ -const { BN } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('$ERC20VotesComp'); const Governor = artifacts.require('$GovernorCompMock'); const CallReceiver = artifacts.require('CallReceiverMock'); +const TOKENS = [ + { Token: artifacts.require('$ERC20VotesComp'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesCompTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorComp', function (accounts) { const [owner, voter1, voter2, voter3, voter4] = accounts; @@ -15,67 +18,71 @@ contract('GovernorComp', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new(name, this.token.address); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.owner = owner; + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new(name, this.token.address); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); + }); - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - }); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + }); - it('voting with comp token', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); + it('voting with comp token', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); - await this.mock.proposalVotes(this.proposal.id).then(results => { - expect(results.forVotes).to.be.bignumber.equal(web3.utils.toWei('17')); - expect(results.againstVotes).to.be.bignumber.equal(web3.utils.toWei('5')); - expect(results.abstainVotes).to.be.bignumber.equal(web3.utils.toWei('2')); + await this.mock.proposalVotes(this.proposal.id).then(results => { + expect(results.forVotes).to.be.bignumber.equal(web3.utils.toWei('17')); + expect(results.againstVotes).to.be.bignumber.equal(web3.utils.toWei('5')); + expect(results.abstainVotes).to.be.bignumber.equal(web3.utils.toWei('2')); + }); + }); }); - }); + } }); diff --git a/test/governance/extensions/GovernorERC721.test.js b/test/governance/extensions/GovernorERC721.test.js index b0babbd37..c1f424c29 100644 --- a/test/governance/extensions/GovernorERC721.test.js +++ b/test/governance/extensions/GovernorERC721.test.js @@ -1,12 +1,16 @@ -const { BN, expectEvent } = require('@openzeppelin/test-helpers'); +const { expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('$ERC721Votes'); const Governor = artifacts.require('$GovernorVoteMocks'); const CallReceiver = artifacts.require('CallReceiverMock'); +const TOKENS = [ + { Token: artifacts.require('$ERC721Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC721VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorERC721', function (accounts) { const [owner, voter1, voter2, voter3, voter4] = accounts; @@ -14,94 +18,98 @@ contract('GovernorERC721', function (accounts) { // const version = '1'; const tokenName = 'MockNFToken'; const tokenSymbol = 'MTKN'; - const NFT0 = new BN(0); - const NFT1 = new BN(1); - const NFT2 = new BN(2); - const NFT3 = new BN(3); - const NFT4 = new BN(4); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const NFT0 = web3.utils.toBN(0); + const NFT1 = web3.utils.toBN(1); + const NFT2 = web3.utils.toBN(2); + const NFT3 = web3.utils.toBN(3); + const NFT4 = web3.utils.toBN(4); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol, tokenName, '1'); - this.mock = await Governor.new(name, this.token.address); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.owner = owner; + this.token = await Token.new(tokenName, tokenSymbol, tokenName, '1'); + this.mock = await Governor.new(name, this.token.address); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await Promise.all([NFT0, NFT1, NFT2, NFT3, NFT4].map(tokenId => this.token.$_mint(owner, tokenId))); - await this.helper.delegate({ token: this.token, to: voter1, tokenId: NFT0 }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT1 }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT2 }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, tokenId: NFT3 }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, tokenId: NFT4 }, { from: owner }); + await Promise.all([NFT0, NFT1, NFT2, NFT3, NFT4].map(tokenId => this.token.$_mint(owner, tokenId))); + await this.helper.delegate({ token: this.token, to: voter1, tokenId: NFT0 }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT1 }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, tokenId: NFT2 }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, tokenId: NFT3 }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, tokenId: NFT4 }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); + }); - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - }); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + }); - it('voting with ERC721 token', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); + it('voting with ERC721 token', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); - expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), 'VoteCast', { - voter: voter1, - support: Enums.VoteType.For, - weight: '1', + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }), 'VoteCast', { + voter: voter1, + support: Enums.VoteType.For, + weight: '1', + }); + + expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { + voter: voter2, + support: Enums.VoteType.For, + weight: '2', + }); + + expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { + voter: voter3, + support: Enums.VoteType.Against, + weight: '1', + }); + + expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { + voter: voter4, + support: Enums.VoteType.Abstain, + weight: '1', + }); + + await this.helper.waitForDeadline(); + await this.helper.execute(); + + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); + + await this.mock.proposalVotes(this.proposal.id).then(results => { + expect(results.forVotes).to.be.bignumber.equal('3'); + expect(results.againstVotes).to.be.bignumber.equal('1'); + expect(results.abstainVotes).to.be.bignumber.equal('1'); + }); + }); }); - - expectEvent(await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }), 'VoteCast', { - voter: voter2, - support: Enums.VoteType.For, - weight: '2', - }); - - expectEvent(await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }), 'VoteCast', { - voter: voter3, - support: Enums.VoteType.Against, - weight: '1', - }); - - expectEvent(await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }), 'VoteCast', { - voter: voter4, - support: Enums.VoteType.Abstain, - weight: '1', - }); - - await this.helper.waitForDeadline(); - await this.helper.execute(); - - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); - - await this.mock.proposalVotes(this.proposal.id).then(results => { - expect(results.forVotes).to.be.bignumber.equal('3'); - expect(results.againstVotes).to.be.bignumber.equal('1'); - expect(results.abstainVotes).to.be.bignumber.equal('1'); - }); - }); + } }); diff --git a/test/governance/extensions/GovernorPreventLateQuorum.test.js b/test/governance/extensions/GovernorPreventLateQuorum.test.js index ffec8ace6..f81bd5286 100644 --- a/test/governance/extensions/GovernorPreventLateQuorum.test.js +++ b/test/governance/extensions/GovernorPreventLateQuorum.test.js @@ -1,12 +1,17 @@ -const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); +const { clockFromReceipt } = require('../../helpers/time'); -const Token = artifacts.require('$ERC20VotesComp'); const Governor = artifacts.require('$GovernorPreventLateQuorumMock'); const CallReceiver = artifacts.require('CallReceiverMock'); +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorPreventLateQuorum', function (accounts) { const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; @@ -15,158 +20,170 @@ contract('GovernorPreventLateQuorum', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); - const lateQuorumVoteExtension = new BN(8); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); + const lateQuorumVoteExtension = web3.utils.toBN(8); const quorum = web3.utils.toWei('1'); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new( - name, - votingDelay, - votingPeriod, - 0, - this.token.address, - lateQuorumVoteExtension, - quorum, - ); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.owner = owner; + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new( + name, + votingDelay, + votingPeriod, + 0, + this.token.address, + lateQuorumVoteExtension, + quorum, + ); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); - - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal(quorum); - expect(await this.mock.lateQuorumVoteExtension()).to.be.bignumber.equal(lateQuorumVoteExtension); - }); - - it('nominal workflow unaffected', async function () { - const txPropose = await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); - - await this.mock.proposalVotes(this.proposal.id).then(results => { - expect(results.forVotes).to.be.bignumber.equal(web3.utils.toWei('17')); - expect(results.againstVotes).to.be.bignumber.equal(web3.utils.toWei('5')); - expect(results.abstainVotes).to.be.bignumber.equal(web3.utils.toWei('2')); - }); - - const startBlock = new BN(txPropose.receipt.blockNumber).add(votingDelay); - const endBlock = new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod); - expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); - expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(endBlock); - - expectEvent(txPropose, 'ProposalCreated', { - proposalId: this.proposal.id, - proposer, - targets: this.proposal.targets, - // values: this.proposal.values.map(value => new BN(value)), - signatures: this.proposal.signatures, - calldatas: this.proposal.data, - startBlock, - endBlock, - description: this.proposal.description, - }); - }); - - it('Delay is extended to prevent last minute take-over', async function () { - const txPropose = await this.helper.propose({ from: proposer }); - - // compute original schedule - const startBlock = new BN(txPropose.receipt.blockNumber).add(votingDelay); - const endBlock = new BN(txPropose.receipt.blockNumber).add(votingDelay).add(votingPeriod); - expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); - expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(endBlock); - - // wait for the last minute to vote - await this.helper.waitForDeadline(-1); - const txVote = await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - - // cannot execute yet - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); - - // compute new extended schedule - const extendedDeadline = new BN(txVote.receipt.blockNumber).add(lateQuorumVoteExtension); - expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); - expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(extendedDeadline); - - // still possible to vote - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter1 }); - - await this.helper.waitForDeadline(); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); - await this.helper.waitForDeadline(+1); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Defeated); - - // check extension event - expectEvent(txVote, 'ProposalExtended', { proposalId: this.proposal.id, extendedDeadline }); - }); - - describe('onlyGovernance updates', function () { - it('setLateQuorumVoteExtension is protected', async function () { - await expectRevert(this.mock.setLateQuorumVoteExtension(0), 'Governor: onlyGovernance'); - }); - - it('can setLateQuorumVoteExtension through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.setLateQuorumVoteExtension('0').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.execute(), 'LateQuorumVoteExtensionSet', { - oldVoteExtension: lateQuorumVoteExtension, - newVoteExtension: '0', + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); - expect(await this.mock.lateQuorumVoteExtension()).to.be.bignumber.equal('0'); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal(quorum); + expect(await this.mock.lateQuorumVoteExtension()).to.be.bignumber.equal(lateQuorumVoteExtension); + }); + + it('nominal workflow unaffected', async function () { + const txPropose = await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter3)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter4)).to.be.equal(true); + + await this.mock.proposalVotes(this.proposal.id).then(results => { + expect(results.forVotes).to.be.bignumber.equal(web3.utils.toWei('17')); + expect(results.againstVotes).to.be.bignumber.equal(web3.utils.toWei('5')); + expect(results.abstainVotes).to.be.bignumber.equal(web3.utils.toWei('2')); + }); + + const voteStart = web3.utils.toBN(await clockFromReceipt[mode](txPropose.receipt)).add(votingDelay); + const voteEnd = web3.utils + .toBN(await clockFromReceipt[mode](txPropose.receipt)) + .add(votingDelay) + .add(votingPeriod); + expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(voteStart); + expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(voteEnd); + + expectEvent(txPropose, 'ProposalCreated', { + proposalId: this.proposal.id, + proposer, + targets: this.proposal.targets, + // values: this.proposal.values.map(value => web3.utils.toBN(value)), + signatures: this.proposal.signatures, + calldatas: this.proposal.data, + voteStart, + voteEnd, + description: this.proposal.description, + }); + }); + + it('Delay is extended to prevent last minute take-over', async function () { + const txPropose = await this.helper.propose({ from: proposer }); + + // compute original schedule + const startBlock = web3.utils.toBN(await clockFromReceipt[mode](txPropose.receipt)).add(votingDelay); + const endBlock = web3.utils + .toBN(await clockFromReceipt[mode](txPropose.receipt)) + .add(votingDelay) + .add(votingPeriod); + expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); + expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(endBlock); + + // wait for the last minute to vote + await this.helper.waitForDeadline(-1); + const txVote = await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + + // cannot execute yet + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); + + // compute new extended schedule + const extendedDeadline = web3.utils + .toBN(await clockFromReceipt[mode](txVote.receipt)) + .add(lateQuorumVoteExtension); + expect(await this.mock.proposalSnapshot(this.proposal.id)).to.be.bignumber.equal(startBlock); + expect(await this.mock.proposalDeadline(this.proposal.id)).to.be.bignumber.equal(extendedDeadline); + + // still possible to vote + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter1 }); + + await this.helper.waitForDeadline(); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Active); + await this.helper.waitForDeadline(+1); + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Defeated); + + // check extension event + expectEvent(txVote, 'ProposalExtended', { proposalId: this.proposal.id, extendedDeadline }); + }); + + describe('onlyGovernance updates', function () { + it('setLateQuorumVoteExtension is protected', async function () { + await expectRevert(this.mock.setLateQuorumVoteExtension(0), 'Governor: onlyGovernance'); + }); + + it('can setLateQuorumVoteExtension through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.setLateQuorumVoteExtension('0').encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + expectEvent(await this.helper.execute(), 'LateQuorumVoteExtensionSet', { + oldVoteExtension: lateQuorumVoteExtension, + newVoteExtension: '0', + }); + + expect(await this.mock.lateQuorumVoteExtension()).to.be.bignumber.equal('0'); + }); + }); }); - }); + } }); diff --git a/test/governance/extensions/GovernorTimelockCompound.test.js b/test/governance/extensions/GovernorTimelockCompound.test.js index 446d74999..23d0adbd8 100644 --- a/test/governance/extensions/GovernorTimelockCompound.test.js +++ b/test/governance/extensions/GovernorTimelockCompound.test.js @@ -1,4 +1,4 @@ -const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const RLP = require('rlp'); const Enums = require('../../helpers/enums'); @@ -6,7 +6,6 @@ const { GovernorHelper } = require('../../helpers/governance'); const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); -const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('CompTimelock'); const Governor = artifacts.require('$GovernorTimelockCompoundMock'); const CallReceiver = artifacts.require('CallReceiverMock'); @@ -20,6 +19,11 @@ function makeContractAddress(creator, nonce) { ); } +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorTimelockCompound', function (accounts) { const [owner, voter1, voter2, voter3, voter4, other] = accounts; @@ -28,306 +32,321 @@ contract('GovernorTimelockCompound', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - const [deployer] = await web3.eth.getAccounts(); - - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - - // Need to predict governance address to set it as timelock admin with a delayed transfer - const nonce = await web3.eth.getTransactionCount(deployer); - const predictGovernor = makeContractAddress(deployer, nonce + 1); - - this.timelock = await Timelock.new(predictGovernor, 2 * 86400); - this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.timelock.address, this.token.address, 0); - this.receiver = await CallReceiver.new(); - - this.helper = new GovernorHelper(this.mock); - - await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); - - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); - - shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); - - it("doesn't accept ether transfers", async function () { - await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); - }); - - it('post deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - - expect(await this.mock.timelock()).to.be.equal(this.timelock.address); - expect(await this.timelock.admin()).to.be.equal(this.mock.address); - }); - - it('nominal', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - const txQueue = await this.helper.queue(); - const eta = await this.mock.proposalEta(this.proposal.id); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txQueue.tx, this.timelock, 'QueueTransaction', { eta }); - - expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txExecute.tx, this.timelock, 'ExecuteTransaction', { eta }); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - }); - - describe('should revert', function () { - describe('on queue', function () { - it('if already queued', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); - }); - - it('if proposal contains duplicate calls', async function () { - const action = { - target: this.token.address, - data: this.token.contract.methods.approve(this.receiver.address, constants.MAX_UINT256).encodeABI(), - }; - this.helper.setProposal([action, action], ''); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await expectRevert(this.helper.queue(), 'GovernorTimelockCompound: identical proposal action already queued'); - await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); - }); - }); - - describe('on execute', function () { - it('if not queued', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(+1); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); - - await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); - }); - - it('if too early', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); - - await expectRevert( - this.helper.execute(), - "Timelock::executeTransaction: Transaction hasn't surpassed time lock", - ); - }); - - it('if too late', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(+30 * 86400); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Expired); - - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('if already executed', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - await this.helper.execute(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - }); - }); - - describe('cancel', function () { - it('cancel before queue prevents scheduling', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); - }); - - it('cancel after queue prevents executing', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - - expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - }); - - describe('onlyGovernance', function () { - describe('relay', function () { + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { beforeEach(async function () { - await this.token.$_mint(this.mock.address, 1); - }); + const [deployer] = await web3.eth.getAccounts(); - it('is protected', async function () { - await expectRevert( - this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), - 'Governor: onlyGovernance', + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + + // Need to predict governance address to set it as timelock admin with a delayed transfer + const nonce = await web3.eth.getTransactionCount(deployer); + const predictGovernor = makeContractAddress(deployer, nonce + 1); + + this.timelock = await Timelock.new(predictGovernor, 2 * 86400); + this.mock = await Governor.new( + name, + votingDelay, + votingPeriod, + 0, + this.timelock.address, + this.token.address, + 0, ); - }); + this.receiver = await CallReceiver.new(); - it('can be executed through governance', async function () { - this.helper.setProposal( + this.helper = new GovernorHelper(this.mock, mode); + + await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); + + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + + // default proposal + this.proposal = this.helper.setProposal( [ { - target: this.mock.address, - data: this.mock.contract.methods - .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) - .encodeABI(), + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), }, ], '', ); + }); - expect(await this.token.balanceOf(this.mock.address), 1); - expect(await this.token.balanceOf(other), 0); + shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); + it("doesn't accept ether transfers", async function () { + await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); + }); + + it('post deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + + expect(await this.mock.timelock()).to.be.equal(this.timelock.address); + expect(await this.timelock.admin()).to.be.equal(this.mock.address); + }); + + it('nominal', async function () { await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); await this.helper.waitForDeadline(); - await this.helper.queue(); + const txQueue = await this.helper.queue(); + const eta = await this.mock.proposalEta(this.proposal.id); await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - expect(await this.token.balanceOf(this.mock.address), 0); - expect(await this.token.balanceOf(other), 1); + expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txQueue.tx, this.timelock, 'QueueTransaction', { eta }); - await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { - from: this.mock.address, - to: other, - value: '1', + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txExecute.tx, this.timelock, 'ExecuteTransaction', { eta }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + }); + + describe('should revert', function () { + describe('on queue', function () { + it('if already queued', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); + }); + + it('if proposal contains duplicate calls', async function () { + const action = { + target: this.token.address, + data: this.token.contract.methods.approve(this.receiver.address, constants.MAX_UINT256).encodeABI(), + }; + this.helper.setProposal([action, action], ''); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await expectRevert( + this.helper.queue(), + 'GovernorTimelockCompound: identical proposal action already queued', + ); + await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); + }); + }); + + describe('on execute', function () { + it('if not queued', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(+1); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); + + await expectRevert(this.helper.execute(), 'GovernorTimelockCompound: proposal not yet queued'); + }); + + it('if too early', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); + + await expectRevert( + this.helper.execute(), + "Timelock::executeTransaction: Transaction hasn't surpassed time lock", + ); + }); + + it('if too late', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(+30 * 86400); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Expired); + + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('if already executed', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + }); + }); + + describe('cancel', function () { + it('cancel before queue prevents scheduling', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); + }); + + it('cancel after queue prevents executing', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + }); + + describe('onlyGovernance', function () { + describe('relay', function () { + beforeEach(async function () { + await this.token.$_mint(this.mock.address, 1); + }); + + it('is protected', async function () { + await expectRevert( + this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), + 'Governor: onlyGovernance', + ); + }); + + it('can be executed through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods + .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) + .encodeABI(), + }, + ], + '', + ); + + expect(await this.token.balanceOf(this.mock.address), 1); + expect(await this.token.balanceOf(other), 0); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + expect(await this.token.balanceOf(this.mock.address), 0); + expect(await this.token.balanceOf(other), 1); + + await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + from: this.mock.address, + to: other, + value: '1', + }); + }); + }); + + describe('updateTimelock', function () { + beforeEach(async function () { + this.newTimelock = await Timelock.new(this.mock.address, 7 * 86400); + }); + + it('is protected', async function () { + await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); + }); + + it('can be executed through governance to', async function () { + this.helper.setProposal( + [ + { + target: this.timelock.address, + data: this.timelock.contract.methods.setPendingAdmin(owner).encodeABI(), + }, + { + target: this.mock.address, + data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + expectEvent(txExecute, 'TimelockChange', { + oldTimelock: this.timelock.address, + newTimelock: this.newTimelock.address, + }); + + expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); + }); + }); + + it('can transfer timelock to new governor', async function () { + const newGovernor = await Governor.new(name, 8, 32, 0, this.timelock.address, this.token.address, 0); + this.helper.setProposal( + [ + { + target: this.timelock.address, + data: this.timelock.contract.methods.setPendingAdmin(newGovernor.address).encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + await expectEvent.inTransaction(txExecute.tx, this.timelock, 'NewPendingAdmin', { + newPendingAdmin: newGovernor.address, + }); + + await newGovernor.__acceptAdmin(); + expect(await this.timelock.admin()).to.be.bignumber.equal(newGovernor.address); }); }); }); - - describe('updateTimelock', function () { - beforeEach(async function () { - this.newTimelock = await Timelock.new(this.mock.address, 7 * 86400); - }); - - it('is protected', async function () { - await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); - }); - - it('can be executed through governance to', async function () { - this.helper.setProposal( - [ - { - target: this.timelock.address, - data: this.timelock.contract.methods.setPendingAdmin(owner).encodeABI(), - }, - { - target: this.mock.address, - data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - expectEvent(txExecute, 'TimelockChange', { - oldTimelock: this.timelock.address, - newTimelock: this.newTimelock.address, - }); - - expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); - }); - }); - - it('can transfer timelock to new governor', async function () { - const newGovernor = await Governor.new(name, 8, 32, 0, this.timelock.address, this.token.address, 0); - this.helper.setProposal( - [ - { - target: this.timelock.address, - data: this.timelock.contract.methods.setPendingAdmin(newGovernor.address).encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - await expectEvent.inTransaction(txExecute.tx, this.timelock, 'NewPendingAdmin', { - newPendingAdmin: newGovernor.address, - }); - - await newGovernor.__acceptAdmin(); - expect(await this.timelock.admin()).to.be.bignumber.equal(newGovernor.address); - }); - }); + } }); diff --git a/test/governance/extensions/GovernorTimelockControl.test.js b/test/governance/extensions/GovernorTimelockControl.test.js index 2a55787cb..ef50dc708 100644 --- a/test/governance/extensions/GovernorTimelockControl.test.js +++ b/test/governance/extensions/GovernorTimelockControl.test.js @@ -1,15 +1,19 @@ -const { BN, constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); +const { constants, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior'); -const Token = artifacts.require('$ERC20Votes'); const Timelock = artifacts.require('TimelockController'); const Governor = artifacts.require('$GovernorTimelockControlMock'); const CallReceiver = artifacts.require('CallReceiverMock'); +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorTimelockControl', function (accounts) { const [owner, voter1, voter2, voter3, voter4, other] = accounts; @@ -23,372 +27,419 @@ contract('GovernorTimelockControl', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - const [deployer] = await web3.eth.getAccounts(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + const [deployer] = await web3.eth.getAccounts(); - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.timelock = await Timelock.new(3600, [], [], deployer); - this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.timelock.address, this.token.address, 0); - this.receiver = await CallReceiver.new(); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.timelock = await Timelock.new(3600, [], [], deployer); + this.mock = await Governor.new( + name, + votingDelay, + votingPeriod, + 0, + this.timelock.address, + this.token.address, + 0, + ); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - this.TIMELOCK_ADMIN_ROLE = await this.timelock.TIMELOCK_ADMIN_ROLE(); - this.PROPOSER_ROLE = await this.timelock.PROPOSER_ROLE(); - this.EXECUTOR_ROLE = await this.timelock.EXECUTOR_ROLE(); - this.CANCELLER_ROLE = await this.timelock.CANCELLER_ROLE(); + this.TIMELOCK_ADMIN_ROLE = await this.timelock.TIMELOCK_ADMIN_ROLE(); + this.PROPOSER_ROLE = await this.timelock.PROPOSER_ROLE(); + this.EXECUTOR_ROLE = await this.timelock.EXECUTOR_ROLE(); + this.CANCELLER_ROLE = await this.timelock.CANCELLER_ROLE(); - await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.timelock.address, value }); - // normal setup: governor is proposer, everyone is executor, timelock is its own admin - await this.timelock.grantRole(PROPOSER_ROLE, this.mock.address); - await this.timelock.grantRole(PROPOSER_ROLE, owner); - await this.timelock.grantRole(CANCELLER_ROLE, this.mock.address); - await this.timelock.grantRole(CANCELLER_ROLE, owner); - await this.timelock.grantRole(EXECUTOR_ROLE, constants.ZERO_ADDRESS); - await this.timelock.revokeRole(TIMELOCK_ADMIN_ROLE, deployer); + // normal setup: governor is proposer, everyone is executor, timelock is its own admin + await this.timelock.grantRole(PROPOSER_ROLE, this.mock.address); + await this.timelock.grantRole(PROPOSER_ROLE, owner); + await this.timelock.grantRole(CANCELLER_ROLE, this.mock.address); + await this.timelock.grantRole(CANCELLER_ROLE, owner); + await this.timelock.grantRole(EXECUTOR_ROLE, constants.ZERO_ADDRESS); + await this.timelock.revokeRole(TIMELOCK_ADMIN_ROLE, deployer); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - this.proposal.timelockid = await this.timelock.hashOperationBatch( - ...this.proposal.shortProposal.slice(0, 3), - '0x0', - this.proposal.shortProposal[3], - ); - }); - - shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); - - it("doesn't accept ether transfers", async function () { - await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); - }); - - it('post deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - - expect(await this.mock.timelock()).to.be.equal(this.timelock.address); - }); - - it('nominal', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - const txQueue = await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallScheduled', { id: this.proposal.timelockid }); - await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallSalt', { - id: this.proposal.timelockid, - }); - - expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); - await expectEvent.inTransaction(txExecute.tx, this.timelock, 'CallExecuted', { id: this.proposal.timelockid }); - await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); - }); - - describe('should revert', function () { - describe('on queue', function () { - it('if already queued', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); - }); - }); - - describe('on execute', function () { - it('if not queued', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(+1); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); - - await expectRevert(this.helper.execute(), 'TimelockController: operation is not ready'); - }); - - it('if too early', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); - - await expectRevert(this.helper.execute(), 'TimelockController: operation is not ready'); - }); - - it('if already executed', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - await this.helper.execute(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('if already executed by another proposer', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - - await this.timelock.executeBatch( + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); + this.proposal.timelockid = await this.timelock.hashOperationBatch( ...this.proposal.shortProposal.slice(0, 3), '0x0', this.proposal.shortProposal[3], ); - - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - }); - }); - - describe('cancel', function () { - it('cancel before queue prevents scheduling', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); - }); - - it('cancel after queue prevents executing', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - - expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - it('cancel on timelock is reflected on governor', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); - - expectEvent(await this.timelock.cancel(this.proposal.timelockid, { from: owner }), 'Cancelled', { - id: this.proposal.timelockid, }); - expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); - }); - }); + shouldSupportInterfaces(['ERC165', 'Governor', 'GovernorWithParams', 'GovernorTimelock']); - describe('onlyGovernance', function () { - describe('relay', function () { - beforeEach(async function () { - await this.token.$_mint(this.mock.address, 1); + it("doesn't accept ether transfers", async function () { + await expectRevert.unspecified(web3.eth.sendTransaction({ from: owner, to: this.mock.address, value: 1 })); }); - it('is protected', async function () { - await expectRevert( - this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), - 'Governor: onlyGovernance', - ); + it('post deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + + expect(await this.mock.timelock()).to.be.equal(this.timelock.address); }); - it('can be executed through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods - .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) - .encodeABI(), - }, - ], - '', - ); - - expect(await this.token.balanceOf(this.mock.address), 1); - expect(await this.token.balanceOf(other), 0); - + it('nominal', async function () { await this.helper.propose(); await this.helper.waitForSnapshot(); await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); await this.helper.waitForDeadline(); - await this.helper.queue(); + const txQueue = await this.helper.queue(); await this.helper.waitForEta(); const txExecute = await this.helper.execute(); - expect(await this.token.balanceOf(this.mock.address), 0); - expect(await this.token.balanceOf(other), 1); - - await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { - from: this.mock.address, - to: other, - value: '1', - }); - }); - - it('is payable and can transfer eth to EOA', async function () { - const t2g = web3.utils.toBN(128); // timelock to governor - const g2o = web3.utils.toBN(100); // governor to eoa (other) - - this.helper.setProposal( - [ - { - target: this.mock.address, - value: t2g, - data: this.mock.contract.methods.relay(other, g2o, '0x').encodeABI(), - }, - ], - '', - ); - - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); - const timelockBalance = await web3.eth.getBalance(this.timelock.address).then(web3.utils.toBN); - const otherBalance = await web3.eth.getBalance(other).then(web3.utils.toBN); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - await this.helper.execute(); - - expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal(timelockBalance.sub(t2g)); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(t2g.sub(g2o)); - expect(await web3.eth.getBalance(other)).to.be.bignumber.equal(otherBalance.add(g2o)); - }); - - it('protected against other proposers', async function () { - await this.timelock.schedule( - this.mock.address, - web3.utils.toWei('0'), - this.mock.contract.methods.relay(constants.ZERO_ADDRESS, 0, '0x').encodeABI(), - constants.ZERO_BYTES32, - constants.ZERO_BYTES32, - 3600, - { from: owner }, - ); - - await time.increase(3600); - - await expectRevert( - this.timelock.execute( - this.mock.address, - web3.utils.toWei('0'), - this.mock.contract.methods.relay(constants.ZERO_ADDRESS, 0, '0x').encodeABI(), - constants.ZERO_BYTES32, - constants.ZERO_BYTES32, - { from: owner }, - ), - 'TimelockController: underlying transaction reverted', - ); - }); - }); - - describe('updateTimelock', function () { - beforeEach(async function () { - this.newTimelock = await Timelock.new(3600, [this.mock.address], [this.mock.address], constants.ZERO_ADDRESS); - }); - - it('is protected', async function () { - await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); - }); - - it('can be executed through governance to', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - const txExecute = await this.helper.execute(); - - expectEvent(txExecute, 'TimelockChange', { - oldTimelock: this.timelock.address, - newTimelock: this.newTimelock.address, + expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallScheduled', { id: this.proposal.timelockid }); + await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallSalt', { + id: this.proposal.timelockid, }); - expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txExecute.tx, this.timelock, 'CallExecuted', { id: this.proposal.timelockid }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + }); + + describe('should revert', function () { + describe('on queue', function () { + it('if already queued', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); + await this.helper.waitForDeadline(); + const txQueue = await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + expectEvent(txQueue, 'ProposalQueued', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txQueue.tx, this.timelock, 'CallScheduled', { + id: this.proposal.timelockid, + }); + + expectEvent(txExecute, 'ProposalExecuted', { proposalId: this.proposal.id }); + await expectEvent.inTransaction(txExecute.tx, this.timelock, 'CallExecuted', { + id: this.proposal.timelockid, + }); + await expectEvent.inTransaction(txExecute.tx, this.receiver, 'MockFunctionCalled'); + }); + + describe('should revert', function () { + describe('on queue', function () { + it('if already queued', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); + }); + }); + + describe('on execute', function () { + it('if not queued', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(+1); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Succeeded); + + await expectRevert(this.helper.execute(), 'TimelockController: operation is not ready'); + }); + + it('if too early', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); + + await expectRevert(this.helper.execute(), 'TimelockController: operation is not ready'); + }); + + it('if already executed', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('if already executed by another proposer', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + + await this.timelock.executeBatch( + ...this.proposal.shortProposal.slice(0, 3), + '0x0', + this.proposal.shortProposal[3], + ); + + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + }); + }); + + describe('cancel', function () { + it('cancel before queue prevents scheduling', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + await expectRevert(this.helper.queue(), 'Governor: proposal not successful'); + }); + + it('cancel after queue prevents executing', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + + expectEvent(await this.helper.cancel('internal'), 'ProposalCanceled', { proposalId: this.proposal.id }); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); + + it('cancel on timelock is reflected on governor', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Queued); + + expectEvent(await this.timelock.cancel(this.proposal.timelockid, { from: owner }), 'Cancelled', { + id: this.proposal.timelockid, + }); + + expect(await this.mock.state(this.proposal.id)).to.be.bignumber.equal(Enums.ProposalState.Canceled); + }); + }); + + describe('onlyGovernance', function () { + describe('relay', function () { + beforeEach(async function () { + await this.token.$_mint(this.mock.address, 1); + }); + + it('is protected', async function () { + await expectRevert( + this.mock.relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()), + 'Governor: onlyGovernance', + ); + }); + + it('can be executed through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods + .relay(this.token.address, 0, this.token.contract.methods.transfer(other, 1).encodeABI()) + .encodeABI(), + }, + ], + '', + ); + + expect(await this.token.balanceOf(this.mock.address), 1); + expect(await this.token.balanceOf(other), 0); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + expect(await this.token.balanceOf(this.mock.address), 0); + expect(await this.token.balanceOf(other), 1); + + await expectEvent.inTransaction(txExecute.tx, this.token, 'Transfer', { + from: this.mock.address, + to: other, + value: '1', + }); + }); + + it('is payable and can transfer eth to EOA', async function () { + const t2g = web3.utils.toBN(128); // timelock to governor + const g2o = web3.utils.toBN(100); // governor to eoa (other) + + this.helper.setProposal( + [ + { + target: this.mock.address, + value: t2g, + data: this.mock.contract.methods.relay(other, g2o, '0x').encodeABI(), + }, + ], + '', + ); + + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(web3.utils.toBN(0)); + const timelockBalance = await web3.eth.getBalance(this.timelock.address).then(web3.utils.toBN); + const otherBalance = await web3.eth.getBalance(other).then(web3.utils.toBN); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + + expect(await web3.eth.getBalance(this.timelock.address)).to.be.bignumber.equal( + timelockBalance.sub(t2g), + ); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal(t2g.sub(g2o)); + expect(await web3.eth.getBalance(other)).to.be.bignumber.equal(otherBalance.add(g2o)); + }); + + it('protected against other proposers', async function () { + await this.timelock.schedule( + this.mock.address, + web3.utils.toWei('0'), + this.mock.contract.methods.relay(constants.ZERO_ADDRESS, 0, '0x').encodeABI(), + constants.ZERO_BYTES32, + constants.ZERO_BYTES32, + 3600, + { from: owner }, + ); + + await time.increase(3600); + + await expectRevert( + this.timelock.execute( + this.mock.address, + web3.utils.toWei('0'), + this.mock.contract.methods.relay(constants.ZERO_ADDRESS, 0, '0x').encodeABI(), + constants.ZERO_BYTES32, + constants.ZERO_BYTES32, + { from: owner }, + ), + 'TimelockController: underlying transaction reverted', + ); + }); + }); + + describe('updateTimelock', function () { + beforeEach(async function () { + this.newTimelock = await Timelock.new( + 3600, + [this.mock.address], + [this.mock.address], + constants.ZERO_ADDRESS, + ); + }); + + it('is protected', async function () { + await expectRevert(this.mock.updateTimelock(this.newTimelock.address), 'Governor: onlyGovernance'); + }); + + it('can be executed through governance to', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateTimelock(this.newTimelock.address).encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + const txExecute = await this.helper.execute(); + + expectEvent(txExecute, 'TimelockChange', { + oldTimelock: this.timelock.address, + newTimelock: this.newTimelock.address, + }); + + expect(await this.mock.timelock()).to.be.bignumber.equal(this.newTimelock.address); + }); + }); + }); + + it('clear queue of pending governor calls', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.nonGovernanceFunction().encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.queue(); + await this.helper.waitForEta(); + await this.helper.execute(); + + // This path clears _governanceCall as part of the afterExecute call, + // but we have not way to check that the cleanup actually happened other + // then coverage reports. + }); + }); }); }); - }); - - it('clear queue of pending governor calls', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.nonGovernanceFunction().encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.queue(); - await this.helper.waitForEta(); - await this.helper.execute(); - - // This path clears _governanceCall as part of the afterExecute call, - // but we have not way to check that the cleanup actually happened other - // then coverage reports. - }); + } }); diff --git a/test/governance/extensions/GovernorVotesQuorumFraction.test.js b/test/governance/extensions/GovernorVotesQuorumFraction.test.js index 84d36f926..ca915806f 100644 --- a/test/governance/extensions/GovernorVotesQuorumFraction.test.js +++ b/test/governance/extensions/GovernorVotesQuorumFraction.test.js @@ -1,12 +1,17 @@ -const { BN, expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); +const { expectEvent, expectRevert, time } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const Enums = require('../../helpers/enums'); const { GovernorHelper } = require('../../helpers/governance'); +const { clock } = require('../../helpers/time'); -const Token = artifacts.require('$ERC20Votes'); const Governor = artifacts.require('$GovernorMock'); const CallReceiver = artifacts.require('CallReceiverMock'); +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorVotesQuorumFraction', function (accounts) { const [owner, voter1, voter2, voter3, voter4] = accounts; @@ -14,129 +19,136 @@ contract('GovernorVotesQuorumFraction', function (accounts) { // const version = '1'; const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; - const tokenSupply = new BN(web3.utils.toWei('100')); - const ratio = new BN(8); // percents - const newRatio = new BN(6); // percents - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const tokenSupply = web3.utils.toBN(web3.utils.toWei('100')); + const ratio = web3.utils.toBN(8); // percents + const newRatio = web3.utils.toBN(6); // percents + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.owner = owner; - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.token.address, ratio); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.owner = owner; + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new(name, votingDelay, votingPeriod, 0, this.token.address, ratio); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); - - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); - expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(ratio); - expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( - tokenSupply.mul(ratio).divn(100), - ); - }); - - it('quroum reached', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); - }); - - it('quroum not reached', async function () { - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.waitForDeadline(); - await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); - }); - - describe('onlyGovernance updates', function () { - it('updateQuorumNumerator is protected', async function () { - await expectRevert(this.mock.updateQuorumNumerator(newRatio), 'Governor: onlyGovernance'); - }); - - it('can updateQuorumNumerator through governance', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.updateQuorumNumerator(newRatio).encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - expectEvent(await this.helper.execute(), 'QuorumNumeratorUpdated', { - oldQuorumNumerator: ratio, - newQuorumNumerator: newRatio, + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); }); - expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(newRatio); - expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + expect(await this.mock.quorum(0)).to.be.bignumber.equal('0'); + expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(ratio); + expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); + expect(await clock[mode]().then(timepoint => this.mock.quorum(timepoint - 1))).to.be.bignumber.equal( + tokenSupply.mul(ratio).divn(100), + ); + }); - // it takes one block for the new quorum to take effect - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( - tokenSupply.mul(ratio).divn(100), - ); + it('quroum reached', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); + }); - await time.advanceBlock(); + it('quroum not reached', async function () { + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.waitForDeadline(); + await expectRevert(this.helper.execute(), 'Governor: proposal not successful'); + }); - expect(await time.latestBlock().then(blockNumber => this.mock.quorum(blockNumber.subn(1)))).to.be.bignumber.equal( - tokenSupply.mul(newRatio).divn(100), - ); + describe('onlyGovernance updates', function () { + it('updateQuorumNumerator is protected', async function () { + await expectRevert(this.mock.updateQuorumNumerator(newRatio), 'Governor: onlyGovernance'); + }); + + it('can updateQuorumNumerator through governance', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateQuorumNumerator(newRatio).encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + expectEvent(await this.helper.execute(), 'QuorumNumeratorUpdated', { + oldQuorumNumerator: ratio, + newQuorumNumerator: newRatio, + }); + + expect(await this.mock.quorumNumerator()).to.be.bignumber.equal(newRatio); + expect(await this.mock.quorumDenominator()).to.be.bignumber.equal('100'); + + // it takes one block for the new quorum to take effect + expect(await clock[mode]().then(blockNumber => this.mock.quorum(blockNumber - 1))).to.be.bignumber.equal( + tokenSupply.mul(ratio).divn(100), + ); + + await time.advanceBlock(); + + expect(await clock[mode]().then(blockNumber => this.mock.quorum(blockNumber - 1))).to.be.bignumber.equal( + tokenSupply.mul(newRatio).divn(100), + ); + }); + + it('cannot updateQuorumNumerator over the maximum', async function () { + this.helper.setProposal( + [ + { + target: this.mock.address, + data: this.mock.contract.methods.updateQuorumNumerator('101').encodeABI(), + }, + ], + '', + ); + + await this.helper.propose(); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); + await this.helper.waitForDeadline(); + + await expectRevert( + this.helper.execute(), + 'GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator', + ); + }); + }); }); - - it('cannot updateQuorumNumerator over the maximum', async function () { - this.helper.setProposal( - [ - { - target: this.mock.address, - data: this.mock.contract.methods.updateQuorumNumerator('101').encodeABI(), - }, - ], - '', - ); - - await this.helper.propose(); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter1 }); - await this.helper.waitForDeadline(); - - await expectRevert(this.helper.execute(), 'GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator'); - }); - }); + } }); diff --git a/test/governance/extensions/GovernorWithParams.test.js b/test/governance/extensions/GovernorWithParams.test.js index 86ebacc08..4e146947c 100644 --- a/test/governance/extensions/GovernorWithParams.test.js +++ b/test/governance/extensions/GovernorWithParams.test.js @@ -1,4 +1,4 @@ -const { BN, expectEvent } = require('@openzeppelin/test-helpers'); +const { expectEvent } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; @@ -7,17 +7,21 @@ const Enums = require('../../helpers/enums'); const { getDomain, domainType } = require('../../helpers/eip712'); const { GovernorHelper } = require('../../helpers/governance'); -const Token = artifacts.require('$ERC20VotesComp'); const Governor = artifacts.require('$GovernorWithParamsMock'); const CallReceiver = artifacts.require('CallReceiverMock'); const rawParams = { - uintParam: new BN('42'), + uintParam: web3.utils.toBN('42'), strParam: 'These are my params', }; const encodedParams = web3.eth.abi.encodeParameters(['uint256', 'string'], Object.values(rawParams)); +const TOKENS = [ + { Token: artifacts.require('$ERC20Votes'), mode: 'blocknumber' }, + { Token: artifacts.require('$ERC20VotesTimestampMock'), mode: 'timestamp' }, +]; + contract('GovernorWithParams', function (accounts) { const [owner, proposer, voter1, voter2, voter3, voter4] = accounts; @@ -25,141 +29,145 @@ contract('GovernorWithParams', function (accounts) { const tokenName = 'MockToken'; const tokenSymbol = 'MTKN'; const tokenSupply = web3.utils.toWei('100'); - const votingDelay = new BN(4); - const votingPeriod = new BN(16); + const votingDelay = web3.utils.toBN(4); + const votingPeriod = web3.utils.toBN(16); const value = web3.utils.toWei('1'); - beforeEach(async function () { - this.chainId = await web3.eth.getChainId(); - this.token = await Token.new(tokenName, tokenSymbol, tokenName); - this.mock = await Governor.new(name, this.token.address); - this.receiver = await CallReceiver.new(); + for (const { mode, Token } of TOKENS) { + describe(`using ${Token._json.contractName}`, function () { + beforeEach(async function () { + this.chainId = await web3.eth.getChainId(); + this.token = await Token.new(tokenName, tokenSymbol, tokenName); + this.mock = await Governor.new(name, this.token.address); + this.receiver = await CallReceiver.new(); - this.helper = new GovernorHelper(this.mock); + this.helper = new GovernorHelper(this.mock, mode); - await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); + await web3.eth.sendTransaction({ from: owner, to: this.mock.address, value }); - await this.token.$_mint(owner, tokenSupply); - await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); - await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); + await this.token.$_mint(owner, tokenSupply); + await this.helper.delegate({ token: this.token, to: voter1, value: web3.utils.toWei('10') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter2, value: web3.utils.toWei('7') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter3, value: web3.utils.toWei('5') }, { from: owner }); + await this.helper.delegate({ token: this.token, to: voter4, value: web3.utils.toWei('2') }, { from: owner }); - // default proposal - this.proposal = this.helper.setProposal( - [ - { - target: this.receiver.address, - value, - data: this.receiver.contract.methods.mockFunction().encodeABI(), - }, - ], - '', - ); - }); + // default proposal + this.proposal = this.helper.setProposal( + [ + { + target: this.receiver.address, + value, + data: this.receiver.contract.methods.mockFunction().encodeABI(), + }, + ], + '', + ); + }); - it('deployment check', async function () { - expect(await this.mock.name()).to.be.equal(name); - expect(await this.mock.token()).to.be.equal(this.token.address); - expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); - expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); - }); + it('deployment check', async function () { + expect(await this.mock.name()).to.be.equal(name); + expect(await this.mock.token()).to.be.equal(this.token.address); + expect(await this.mock.votingDelay()).to.be.bignumber.equal(votingDelay); + expect(await this.mock.votingPeriod()).to.be.bignumber.equal(votingPeriod); + }); - it('nominal is unaffected', async function () { - await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); - await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); - await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); - await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); - await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); - await this.helper.waitForDeadline(); - await this.helper.execute(); + it('nominal is unaffected', async function () { + await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); + await this.helper.vote({ support: Enums.VoteType.For, reason: 'This is nice' }, { from: voter1 }); + await this.helper.vote({ support: Enums.VoteType.For }, { from: voter2 }); + await this.helper.vote({ support: Enums.VoteType.Against }, { from: voter3 }); + await this.helper.vote({ support: Enums.VoteType.Abstain }, { from: voter4 }); + await this.helper.waitForDeadline(); + await this.helper.execute(); - expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); - expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); - expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); - expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); - expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); - }); + expect(await this.mock.hasVoted(this.proposal.id, owner)).to.be.equal(false); + expect(await this.mock.hasVoted(this.proposal.id, voter1)).to.be.equal(true); + expect(await this.mock.hasVoted(this.proposal.id, voter2)).to.be.equal(true); + expect(await web3.eth.getBalance(this.mock.address)).to.be.bignumber.equal('0'); + expect(await web3.eth.getBalance(this.receiver.address)).to.be.bignumber.equal(value); + }); - it('Voting with params is properly supported', async function () { - await this.helper.propose({ from: proposer }); - await this.helper.waitForSnapshot(); + it('Voting with params is properly supported', async function () { + await this.helper.propose({ from: proposer }); + await this.helper.waitForSnapshot(); - const weight = new BN(web3.utils.toWei('7')).sub(rawParams.uintParam); + const weight = web3.utils.toBN(web3.utils.toWei('7')).sub(rawParams.uintParam); - const tx = await this.helper.vote( - { - support: Enums.VoteType.For, - reason: 'no particular reason', - params: encodedParams, - }, - { from: voter2 }, - ); - - expectEvent(tx, 'CountParams', { ...rawParams }); - expectEvent(tx, 'VoteCastWithParams', { - voter: voter2, - proposalId: this.proposal.id, - support: Enums.VoteType.For, - weight, - reason: 'no particular reason', - params: encodedParams, - }); - - const votes = await this.mock.proposalVotes(this.proposal.id); - expect(votes.forVotes).to.be.bignumber.equal(weight); - }); - - it('Voting with params by signature is properly supported', async function () { - const voterBySig = Wallet.generate(); - const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - - const signature = (contract, message) => - getDomain(contract) - .then(domain => ({ - primaryType: 'ExtendedBallot', - types: { - EIP712Domain: domainType(domain), - ExtendedBallot: [ - { name: 'proposalId', type: 'uint256' }, - { name: 'support', type: 'uint8' }, - { name: 'reason', type: 'string' }, - { name: 'params', type: 'bytes' }, - ], + const tx = await this.helper.vote( + { + support: Enums.VoteType.For, + reason: 'no particular reason', + params: encodedParams, }, - domain, - message, - })) - .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) - .then(fromRpcSig); + { from: voter2 }, + ); - await this.token.delegate(voterBySigAddress, { from: voter2 }); + expectEvent(tx, 'CountParams', { ...rawParams }); + expectEvent(tx, 'VoteCastWithParams', { + voter: voter2, + proposalId: this.proposal.id, + support: Enums.VoteType.For, + weight, + reason: 'no particular reason', + params: encodedParams, + }); - // Run proposal - await this.helper.propose(); - await this.helper.waitForSnapshot(); + const votes = await this.mock.proposalVotes(this.proposal.id); + expect(votes.forVotes).to.be.bignumber.equal(weight); + }); - const weight = new BN(web3.utils.toWei('7')).sub(rawParams.uintParam); + it('Voting with params by signature is properly supported', async function () { + const voterBySig = Wallet.generate(); + const voterBySigAddress = web3.utils.toChecksumAddress(voterBySig.getAddressString()); - const tx = await this.helper.vote({ - support: Enums.VoteType.For, - reason: 'no particular reason', - params: encodedParams, - signature, + const signature = (contract, message) => + getDomain(contract) + .then(domain => ({ + primaryType: 'ExtendedBallot', + types: { + EIP712Domain: domainType(domain), + ExtendedBallot: [ + { name: 'proposalId', type: 'uint256' }, + { name: 'support', type: 'uint8' }, + { name: 'reason', type: 'string' }, + { name: 'params', type: 'bytes' }, + ], + }, + domain, + message, + })) + .then(data => ethSigUtil.signTypedMessage(voterBySig.getPrivateKey(), { data })) + .then(fromRpcSig); + + await this.token.delegate(voterBySigAddress, { from: voter2 }); + + // Run proposal + await this.helper.propose(); + await this.helper.waitForSnapshot(); + + const weight = web3.utils.toBN(web3.utils.toWei('7')).sub(rawParams.uintParam); + + const tx = await this.helper.vote({ + support: Enums.VoteType.For, + reason: 'no particular reason', + params: encodedParams, + signature, + }); + + expectEvent(tx, 'CountParams', { ...rawParams }); + expectEvent(tx, 'VoteCastWithParams', { + voter: voterBySigAddress, + proposalId: this.proposal.id, + support: Enums.VoteType.For, + weight, + reason: 'no particular reason', + params: encodedParams, + }); + + const votes = await this.mock.proposalVotes(this.proposal.id); + expect(votes.forVotes).to.be.bignumber.equal(weight); + }); }); - - expectEvent(tx, 'CountParams', { ...rawParams }); - expectEvent(tx, 'VoteCastWithParams', { - voter: voterBySigAddress, - proposalId: this.proposal.id, - support: Enums.VoteType.For, - weight, - reason: 'no particular reason', - params: encodedParams, - }); - - const votes = await this.mock.proposalVotes(this.proposal.id); - expect(votes.forVotes).to.be.bignumber.equal(weight); - }); + } }); diff --git a/test/governance/utils/EIP6372.behavior.js b/test/governance/utils/EIP6372.behavior.js new file mode 100644 index 000000000..022ec3568 --- /dev/null +++ b/test/governance/utils/EIP6372.behavior.js @@ -0,0 +1,23 @@ +const { clock } = require('../../helpers/time'); + +function shouldBehaveLikeEIP6372(mode = 'blocknumber') { + describe('should implement EIP6372', function () { + beforeEach(async function () { + this.mock = this.mock ?? this.token ?? this.votes; + }); + + it('clock is correct', async function () { + expect(await this.mock.clock()).to.be.bignumber.equal(await clock[mode]().then(web3.utils.toBN)); + }); + + it('CLOCK_MODE is correct', async function () { + const params = new URLSearchParams(await this.mock.CLOCK_MODE()); + expect(params.get('mode')).to.be.equal(mode); + expect(params.get('from')).to.be.equal(mode == 'blocknumber' ? 'default' : null); + }); + }); +} + +module.exports = { + shouldBehaveLikeEIP6372, +}; diff --git a/test/governance/utils/Votes.behavior.js b/test/governance/utils/Votes.behavior.js index 8fe34dc47..864a2f976 100644 --- a/test/governance/utils/Votes.behavior.js +++ b/test/governance/utils/Votes.behavior.js @@ -6,7 +6,10 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; +const { shouldBehaveLikeEIP6372 } = require('./EIP6372.behavior'); + const { getDomain, domainType, domainSeparator } = require('../../helpers/eip712'); +const { clockFromReceipt } = require('../../helpers/time'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -14,7 +17,9 @@ const Delegation = [ { name: 'expiry', type: 'uint256' }, ]; -function shouldBehaveLikeVotes() { +function shouldBehaveLikeVotes(mode = 'blocknumber') { + shouldBehaveLikeEIP6372(mode); + describe('run votes workflow', function () { it('initial nonce is 0', async function () { expect(await this.votes.nonces(this.account1)).to.be.bignumber.equal('0'); @@ -57,6 +62,8 @@ function shouldBehaveLikeVotes() { expect(await this.votes.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); const { receipt } = await this.votes.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + const timepoint = await clockFromReceipt[mode](receipt); + expectEvent(receipt, 'DelegateChanged', { delegator: delegatorAddress, fromDelegate: ZERO_ADDRESS, @@ -71,9 +78,9 @@ function shouldBehaveLikeVotes() { expect(await this.votes.delegates(delegatorAddress)).to.be.equal(delegatorAddress); expect(await this.votes.getVotes(delegatorAddress)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastVotes(delegatorAddress, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastVotes(delegatorAddress, timepoint - 1)).to.be.bignumber.equal('0'); await time.advanceBlock(); - expect(await this.votes.getPastVotes(delegatorAddress, receipt.blockNumber)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastVotes(delegatorAddress, timepoint)).to.be.bignumber.equal('1'); }); it('rejects reused signature', async function () { @@ -157,6 +164,8 @@ function shouldBehaveLikeVotes() { expect(await this.votes.delegates(this.account1)).to.be.equal(ZERO_ADDRESS); const { receipt } = await this.votes.delegate(this.account1, { from: this.account1 }); + const timepoint = await clockFromReceipt[mode](receipt); + expectEvent(receipt, 'DelegateChanged', { delegator: this.account1, fromDelegate: ZERO_ADDRESS, @@ -171,9 +180,9 @@ function shouldBehaveLikeVotes() { expect(await this.votes.delegates(this.account1)).to.be.equal(this.account1); expect(await this.votes.getVotes(this.account1)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastVotes(this.account1, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastVotes(this.account1, timepoint - 1)).to.be.bignumber.equal('0'); await time.advanceBlock(); - expect(await this.votes.getPastVotes(this.account1, receipt.blockNumber)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastVotes(this.account1, timepoint)).to.be.bignumber.equal('1'); }); it('delegation without tokens', async function () { @@ -202,6 +211,8 @@ function shouldBehaveLikeVotes() { expect(await this.votes.delegates(this.account1)).to.be.equal(this.account1); const { receipt } = await this.votes.delegate(this.account1Delegatee, { from: this.account1 }); + const timepoint = await clockFromReceipt[mode](receipt); + expectEvent(receipt, 'DelegateChanged', { delegator: this.account1, fromDelegate: this.account1, @@ -217,16 +228,16 @@ function shouldBehaveLikeVotes() { previousBalance: '0', newBalance: '1', }); - const prevBlock = receipt.blockNumber - 1; + expect(await this.votes.delegates(this.account1)).to.be.equal(this.account1Delegatee); expect(await this.votes.getVotes(this.account1)).to.be.bignumber.equal('0'); expect(await this.votes.getVotes(this.account1Delegatee)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastVotes(this.account1, receipt.blockNumber - 1)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastVotes(this.account1Delegatee, prevBlock)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastVotes(this.account1, timepoint - 1)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastVotes(this.account1Delegatee, timepoint - 1)).to.be.bignumber.equal('0'); await time.advanceBlock(); - expect(await this.votes.getPastVotes(this.account1, receipt.blockNumber)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastVotes(this.account1Delegatee, receipt.blockNumber)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastVotes(this.account1, timepoint)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastVotes(this.account1Delegatee, timepoint)).to.be.bignumber.equal('1'); }); }); @@ -236,7 +247,7 @@ function shouldBehaveLikeVotes() { }); it('reverts if block number >= current block', async function () { - await expectRevert(this.votes.getPastTotalSupply(5e10), 'block not yet mined'); + await expectRevert(this.votes.getPastTotalSupply(5e10), 'future lookup'); }); it('returns 0 if there are no checkpoints', async function () { @@ -244,22 +255,24 @@ function shouldBehaveLikeVotes() { }); it('returns the latest block if >= last checkpoint block', async function () { - const t1 = await this.votes.$_mint(this.account1, this.NFT0); + const { receipt } = await this.votes.$_mint(this.account1, this.NFT0); + const timepoint = await clockFromReceipt[mode](receipt); await time.advanceBlock(); await time.advanceBlock(); - expect(await this.votes.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal('1'); }); it('returns zero if < first checkpoint block', async function () { await time.advanceBlock(); - const t2 = await this.votes.$_mint(this.account1, this.NFT1); + const { receipt } = await this.votes.$_mint(this.account1, this.NFT1); + const timepoint = await clockFromReceipt[mode](receipt); await time.advanceBlock(); await time.advanceBlock(); - expect(await this.votes.getPastTotalSupply(t2.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal('1'); }); it('generally returns the voting balance at the appropriate checkpoint', async function () { @@ -279,17 +292,23 @@ function shouldBehaveLikeVotes() { await time.advanceBlock(); await time.advanceBlock(); - expect(await this.votes.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal('0'); - expect(await this.votes.getPastTotalSupply(t5.receipt.blockNumber)).to.be.bignumber.equal('1'); - expect(await this.votes.getPastTotalSupply(t5.receipt.blockNumber + 1)).to.be.bignumber.equal('1'); + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + t5.timepoint = await clockFromReceipt[mode](t5.receipt); + + expect(await this.votes.getPastTotalSupply(t1.timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(t1.timepoint)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(t1.timepoint + 1)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(t2.timepoint)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(t2.timepoint + 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(t3.timepoint)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(t3.timepoint + 1)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(t4.timepoint)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(t4.timepoint + 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastTotalSupply(t5.timepoint)).to.be.bignumber.equal('1'); + expect(await this.votes.getPastTotalSupply(t5.timepoint + 1)).to.be.bignumber.equal('1'); }); }); @@ -305,7 +324,7 @@ function shouldBehaveLikeVotes() { describe('getPastVotes', function () { it('reverts if block number >= current block', async function () { - await expectRevert(this.votes.getPastVotes(this.account2, 5e10), 'block not yet mined'); + await expectRevert(this.votes.getPastVotes(this.account2, 5e10), 'future lookup'); }); it('returns 0 if there are no checkpoints', async function () { @@ -313,22 +332,24 @@ function shouldBehaveLikeVotes() { }); it('returns the latest block if >= last checkpoint block', async function () { - const t1 = await this.votes.delegate(this.account2, { from: this.account1 }); + const { receipt } = await this.votes.delegate(this.account2, { from: this.account1 }); + const timepoint = await clockFromReceipt[mode](receipt); await time.advanceBlock(); await time.advanceBlock(); + const latest = await this.votes.getVotes(this.account2); - const nextBlock = t1.receipt.blockNumber + 1; - expect(await this.votes.getPastVotes(this.account2, t1.receipt.blockNumber)).to.be.bignumber.equal(latest); - expect(await this.votes.getPastVotes(this.account2, nextBlock)).to.be.bignumber.equal(latest); + expect(await this.votes.getPastVotes(this.account2, timepoint)).to.be.bignumber.equal(latest); + expect(await this.votes.getPastVotes(this.account2, timepoint + 1)).to.be.bignumber.equal(latest); }); it('returns zero if < first checkpoint block', async function () { await time.advanceBlock(); - const t1 = await this.votes.delegate(this.account2, { from: this.account1 }); + const { receipt } = await this.votes.delegate(this.account2, { from: this.account1 }); + const timepoint = await clockFromReceipt[mode](receipt); await time.advanceBlock(); await time.advanceBlock(); - expect(await this.votes.getPastVotes(this.account2, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); + expect(await this.votes.getPastVotes(this.account2, timepoint - 1)).to.be.bignumber.equal('0'); }); }); }); diff --git a/test/governance/utils/Votes.test.js b/test/governance/utils/Votes.test.js index 7cf998b2d..62b1ab2cd 100644 --- a/test/governance/utils/Votes.test.js +++ b/test/governance/utils/Votes.test.js @@ -3,56 +3,69 @@ const { expectRevert, BN } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const { getChainId } = require('../../helpers/chainid'); +const { clockFromReceipt } = require('../../helpers/time'); const { shouldBehaveLikeVotes } = require('./Votes.behavior'); -const Votes = artifacts.require('$VotesMock'); +const MODES = { + blocknumber: artifacts.require('$VotesMock'), + timestamp: artifacts.require('$VotesTimestampMock'), +}; contract('Votes', function (accounts) { const [account1, account2, account3] = accounts; - beforeEach(async function () { - this.name = 'My Vote'; - this.votes = await Votes.new(this.name, '1'); - }); - it('starts with zero votes', async function () { - expect(await this.votes.getTotalSupply()).to.be.bignumber.equal('0'); - }); + for (const [mode, artifact] of Object.entries(MODES)) { + describe(`vote with ${mode}`, function () { + beforeEach(async function () { + this.name = 'My Vote'; + this.votes = await artifact.new(this.name, '1'); + }); - describe('performs voting operations', function () { - beforeEach(async function () { - this.tx1 = await this.votes.$_mint(account1, 1); - this.tx2 = await this.votes.$_mint(account2, 1); - this.tx3 = await this.votes.$_mint(account3, 1); + it('starts with zero votes', async function () { + expect(await this.votes.getTotalSupply()).to.be.bignumber.equal('0'); + }); + + describe('performs voting operations', function () { + beforeEach(async function () { + this.tx1 = await this.votes.$_mint(account1, 1); + this.tx2 = await this.votes.$_mint(account2, 1); + this.tx3 = await this.votes.$_mint(account3, 1); + this.tx1.timepoint = await clockFromReceipt[mode](this.tx1.receipt); + this.tx2.timepoint = await clockFromReceipt[mode](this.tx2.receipt); + this.tx3.timepoint = await clockFromReceipt[mode](this.tx3.receipt); + }); + + it('reverts if block number >= current block', async function () { + await expectRevert(this.votes.getPastTotalSupply(this.tx3.timepoint + 1), 'Votes: future lookup'); + }); + + it('delegates', async function () { + await this.votes.delegate(account3, account2); + + expect(await this.votes.delegates(account3)).to.be.equal(account2); + }); + + it('returns total amount of votes', async function () { + expect(await this.votes.getTotalSupply()).to.be.bignumber.equal('3'); + }); + }); + + describe('performs voting workflow', function () { + beforeEach(async function () { + this.chainId = await getChainId(); + this.account1 = account1; + this.account2 = account2; + this.account1Delegatee = account2; + this.NFT0 = new BN('10000000000000000000000000'); + this.NFT1 = new BN('10'); + this.NFT2 = new BN('20'); + this.NFT3 = new BN('30'); + }); + + // includes EIP6372 behavior check + shouldBehaveLikeVotes(mode); + }); }); - - it('reverts if block number >= current block', async function () { - await expectRevert(this.votes.getPastTotalSupply(this.tx3.receipt.blockNumber + 1), 'Votes: block not yet mined'); - }); - - it('delegates', async function () { - await this.votes.delegate(account3, account2); - - expect(await this.votes.delegates(account3)).to.be.equal(account2); - }); - - it('returns total amount of votes', async function () { - expect(await this.votes.getTotalSupply()).to.be.bignumber.equal('3'); - }); - }); - - describe('performs voting workflow', function () { - beforeEach(async function () { - this.chainId = await getChainId(); - this.account1 = account1; - this.account2 = account2; - this.account1Delegatee = account2; - this.NFT0 = new BN('10000000000000000000000000'); - this.NFT1 = new BN('10'); - this.NFT2 = new BN('20'); - this.NFT3 = new BN('30'); - }); - - shouldBehaveLikeVotes(); - }); + } }); diff --git a/test/helpers/governance.js b/test/helpers/governance.js index b945a16e0..ae88e151a 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -1,4 +1,4 @@ -const { time } = require('@openzeppelin/test-helpers'); +const { forward } = require('../helpers/time'); function zip(...args) { return Array(Math.max(...args.map(array => array.length))) @@ -15,8 +15,9 @@ function concatOpts(args, opts = null) { } class GovernorHelper { - constructor(governor) { + constructor(governor, mode = 'blocknumber') { this.governor = governor; + this.mode = mode; } delegate(delegation = {}, opts = null) { @@ -116,21 +117,17 @@ class GovernorHelper { waitForSnapshot(offset = 0) { const proposal = this.currentProposal; - return this.governor - .proposalSnapshot(proposal.id) - .then(blockNumber => time.advanceBlockTo(blockNumber.addn(offset))); + return this.governor.proposalSnapshot(proposal.id).then(timepoint => forward[this.mode](timepoint.addn(offset))); } waitForDeadline(offset = 0) { const proposal = this.currentProposal; - return this.governor - .proposalDeadline(proposal.id) - .then(blockNumber => time.advanceBlockTo(blockNumber.addn(offset))); + return this.governor.proposalDeadline(proposal.id).then(timepoint => forward[this.mode](timepoint.addn(offset))); } waitForEta(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalEta(proposal.id).then(timestamp => time.increaseTo(timestamp.addn(offset))); + return this.governor.proposalEta(proposal.id).then(timestamp => forward.timestamp(timestamp.addn(offset))); } /** diff --git a/test/helpers/time.js b/test/helpers/time.js new file mode 100644 index 000000000..2e5f6d85a --- /dev/null +++ b/test/helpers/time.js @@ -0,0 +1,16 @@ +const { time } = require('@openzeppelin/test-helpers'); + +module.exports = { + clock: { + blocknumber: () => web3.eth.getBlock('latest').then(block => block.number), + timestamp: () => web3.eth.getBlock('latest').then(block => block.timestamp), + }, + clockFromReceipt: { + blocknumber: receipt => Promise.resolve(receipt.blockNumber), + timestamp: receipt => web3.eth.getBlock(receipt.blockNumber).then(block => block.timestamp), + }, + forward: { + blocknumber: time.advanceBlockTo, + timestamp: time.increaseTo, + }, +}; diff --git a/test/token/ERC20/extensions/ERC20Votes.test.js b/test/token/ERC20/extensions/ERC20Votes.test.js index 9759c1162..e722ed1a1 100644 --- a/test/token/ERC20/extensions/ERC20Votes.test.js +++ b/test/token/ERC20/extensions/ERC20Votes.test.js @@ -8,11 +8,11 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const ERC20Votes = artifacts.require('$ERC20Votes'); - const { batchInBlock } = require('../../../helpers/txpool'); const { getDomain, domainType, domainSeparator } = require('../../../helpers/eip712'); -const { getChainId } = require('../../../helpers/chainid'); +const { clock, clockFromReceipt } = require('../../../helpers/time'); + +const { shouldBehaveLikeEIP6372 } = require('../../../governance/utils/EIP6372.behavior'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -20,541 +20,559 @@ const Delegation = [ { name: 'expiry', type: 'uint256' }, ]; +const MODES = { + blocknumber: artifacts.require('$ERC20Votes'), + timestamp: artifacts.require('$ERC20VotesTimestampMock'), +}; + contract('ERC20Votes', function (accounts) { const [holder, recipient, holderDelegatee, other1, other2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; - const version = '1'; const supply = new BN('10000000000000000000000000'); - beforeEach(async function () { - this.chainId = await getChainId(); - this.token = await ERC20Votes.new(name, symbol, name); - }); - - it('initial nonce is 0', async function () { - expect(await this.token.nonces(holder)).to.be.bignumber.equal('0'); - }); - - it('domain separator', async function () { - expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); - }); - - it('minting restriction', async function () { - const amount = new BN('2').pow(new BN('224')); - await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); - }); - - it('recent checkpoints', async function () { - await this.token.delegate(holder, { from: holder }); - for (let i = 0; i < 6; i++) { - await this.token.$_mint(holder, 1); - } - const block = await web3.eth.getBlockNumber(); - expect(await this.token.numCheckpoints(holder)).to.be.bignumber.equal('6'); - // recent - expect(await this.token.getPastVotes(holder, block - 1)).to.be.bignumber.equal('5'); - // non-recent - expect(await this.token.getPastVotes(holder, block - 6)).to.be.bignumber.equal('0'); - }); - - describe('set delegation', function () { - describe('call', function () { - it('delegation with balance', async function () { - await this.token.$_mint(holder, supply); - expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); - - const { receipt } = await this.token.delegate(holder, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: ZERO_ADDRESS, - toDelegate: holder, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: '0', - newBalance: supply, - }); - - expect(await this.token.delegates(holder)).to.be.equal(holder); - - expect(await this.token.getVotes(holder)).to.be.bignumber.equal(supply); - expect(await this.token.getPastVotes(holder, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPastVotes(holder, receipt.blockNumber)).to.be.bignumber.equal(supply); - }); - - it('delegation without balance', async function () { - expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); - - const { receipt } = await this.token.delegate(holder, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: ZERO_ADDRESS, - toDelegate: holder, - }); - expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); - - expect(await this.token.delegates(holder)).to.be.equal(holder); - }); - }); - - describe('with signature', function () { - const delegator = Wallet.generate(); - const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); - const nonce = 0; - - const buildData = (contract, message) => - getDomain(contract).then(domain => ({ - primaryType: 'Delegation', - types: { EIP712Domain: domainType(domain), Delegation }, - domain, - message, - })); - + for (const [mode, artifact] of Object.entries(MODES)) { + describe(`vote with ${mode}`, function () { beforeEach(async function () { - await this.token.$_mint(delegatorAddress, supply); + this.token = await artifact.new(name, symbol, name); }); - it('accept signed delegation', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + shouldBehaveLikeEIP6372(mode); - expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); + it('initial nonce is 0', async function () { + expect(await this.token.nonces(holder)).to.be.bignumber.equal('0'); + }); - const { receipt } = await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); - expectEvent(receipt, 'DelegateChanged', { - delegator: delegatorAddress, - fromDelegate: ZERO_ADDRESS, - toDelegate: delegatorAddress, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: delegatorAddress, - previousBalance: '0', - newBalance: supply, + it('domain separator', async function () { + expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); + }); + + it('minting restriction', async function () { + const amount = new BN('2').pow(new BN('224')); + await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); + }); + + it('recent checkpoints', async function () { + await this.token.delegate(holder, { from: holder }); + for (let i = 0; i < 6; i++) { + await this.token.$_mint(holder, 1); + } + const block = await clock[mode](); + expect(await this.token.numCheckpoints(holder)).to.be.bignumber.equal('6'); + // recent + expect(await this.token.getPastVotes(holder, block - 1)).to.be.bignumber.equal('5'); + // non-recent + expect(await this.token.getPastVotes(holder, block - 6)).to.be.bignumber.equal('0'); + }); + + describe('set delegation', function () { + describe('call', function () { + it('delegation with balance', async function () { + await this.token.$_mint(holder, supply); + expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegate(holder, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: ZERO_ADDRESS, + toDelegate: holder, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(holder)).to.be.equal(holder); + + expect(await this.token.getVotes(holder)).to.be.bignumber.equal(supply); + expect(await this.token.getPastVotes(holder, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPastVotes(holder, timepoint)).to.be.bignumber.equal(supply); + }); + + it('delegation without balance', async function () { + expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegate(holder, { from: holder }); + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: ZERO_ADDRESS, + toDelegate: holder, + }); + expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); + + expect(await this.token.delegates(holder)).to.be.equal(holder); + }); }); - expect(await this.token.delegates(delegatorAddress)).to.be.equal(delegatorAddress); + describe('with signature', function () { + const delegator = Wallet.generate(); + const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); + const nonce = 0; - expect(await this.token.getVotes(delegatorAddress)).to.be.bignumber.equal(supply); - expect(await this.token.getPastVotes(delegatorAddress, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPastVotes(delegatorAddress, receipt.blockNumber)).to.be.bignumber.equal(supply); + const buildData = (contract, message) => + getDomain(contract).then(domain => ({ + primaryType: 'Delegation', + types: { EIP712Domain: domainType(domain), Delegation }, + domain, + message, + })); + + beforeEach(async function () { + await this.token.$_mint(delegatorAddress, supply); + }); + + it('accept signed delegation', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: delegatorAddress, + fromDelegate: ZERO_ADDRESS, + toDelegate: delegatorAddress, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: delegatorAddress, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(delegatorAddress)).to.be.equal(delegatorAddress); + + expect(await this.token.getVotes(delegatorAddress)).to.be.bignumber.equal(supply); + expect(await this.token.getPastVotes(delegatorAddress, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPastVotes(delegatorAddress, timepoint)).to.be.bignumber.equal(supply); + }); + + it('rejects reused signature', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s), + 'ERC20Votes: invalid nonce', + ); + }); + + it('rejects bad delegatee', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); + const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); + expect(args.delegator).to.not.be.equal(delegatorAddress); + expect(args.fromDelegate).to.be.equal(ZERO_ADDRESS); + expect(args.toDelegate).to.be.equal(holderDelegatee); + }); + + it('rejects bad nonce', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), + 'ERC20Votes: invalid nonce', + ); + }); + + it('rejects expired permit', async function () { + const expiry = (await time.latest()) - time.duration.weeks(1); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), + 'ERC20Votes: signature expired', + ); + }); + }); }); - it('rejects reused signature', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + describe('change delegation', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + await this.token.delegate(holder, { from: holder }); + }); - await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + it('call', async function () { + expect(await this.token.delegates(holder)).to.be.equal(holder); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s), - 'ERC20Votes: invalid nonce', - ); + const { receipt } = await this.token.delegate(holderDelegatee, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: holder, + toDelegate: holderDelegatee, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: '0', + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holderDelegatee, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(holder)).to.be.equal(holderDelegatee); + + expect(await this.token.getVotes(holder)).to.be.bignumber.equal('0'); + expect(await this.token.getVotes(holderDelegatee)).to.be.bignumber.equal(supply); + expect(await this.token.getPastVotes(holder, timepoint - 1)).to.be.bignumber.equal(supply); + expect(await this.token.getPastVotes(holderDelegatee, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPastVotes(holder, timepoint)).to.be.bignumber.equal('0'); + expect(await this.token.getPastVotes(holderDelegatee, timepoint)).to.be.bignumber.equal(supply); + }); }); - it('rejects bad delegatee', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + describe('transfers', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + }); - const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); - const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); - expect(args.delegator).to.not.be.equal(delegatorAddress); - expect(args.fromDelegate).to.be.equal(ZERO_ADDRESS); - expect(args.toDelegate).to.be.equal(holderDelegatee); + it('no delegation', async function () { + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); + + this.holderVotes = '0'; + this.recipientVotes = '0'; + }); + + it('sender delegation', async function () { + await this.token.delegate(holder, { from: holder }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); + + const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); + + this.holderVotes = supply.subn(1); + this.recipientVotes = '0'; + }); + + it('receiver delegation', async function () { + await this.token.delegate(recipient, { from: recipient }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); + + const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); + + this.holderVotes = '0'; + this.recipientVotes = '1'; + }); + + it('full delegation', async function () { + await this.token.delegate(holder, { from: holder }); + await this.token.delegate(recipient, { from: recipient }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); + expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); + + const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); + expect( + receipt.logs + .filter(({ event }) => event == 'DelegateVotesChanged') + .every(({ logIndex }) => transferLogIndex < logIndex), + ).to.be.equal(true); + + this.holderVotes = supply.subn(1); + this.recipientVotes = '1'; + }); + + afterEach(async function () { + expect(await this.token.getVotes(holder)).to.be.bignumber.equal(this.holderVotes); + expect(await this.token.getVotes(recipient)).to.be.bignumber.equal(this.recipientVotes); + + // need to advance 2 blocks to see the effect of a transfer on "getPastVotes" + const timepoint = await clock[mode](); + await time.advanceBlock(); + expect(await this.token.getPastVotes(holder, timepoint)).to.be.bignumber.equal(this.holderVotes); + expect(await this.token.getPastVotes(recipient, timepoint)).to.be.bignumber.equal(this.recipientVotes); + }); }); - it('rejects bad nonce', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. + describe('Compound test suite', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + }); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), - 'ERC20Votes: invalid nonce', - ); + describe('balanceOf', function () { + it('grants to initial account', async function () { + expect(await this.token.balanceOf(holder)).to.be.bignumber.equal('10000000000000000000000000'); + }); + }); + + describe('numCheckpoints', function () { + it('returns the number of checkpoints for a delegate', async function () { + await this.token.transfer(recipient, '100', { from: holder }); //give an account a few tokens for readability + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); + + const t1 = await this.token.delegate(other1, { from: recipient }); + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); + + const t2 = await this.token.transfer(other2, 10, { from: recipient }); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); + + const t3 = await this.token.transfer(other2, 10, { from: recipient }); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('3'); + + const t4 = await this.token.transfer(recipient, 20, { from: holder }); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); + + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.timepoint.toString(), '100']); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.timepoint.toString(), '90']); + expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.timepoint.toString(), '80']); + expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.timepoint.toString(), '100']); + + await time.advanceBlock(); + expect(await this.token.getPastVotes(other1, t1.timepoint)).to.be.bignumber.equal('100'); + expect(await this.token.getPastVotes(other1, t2.timepoint)).to.be.bignumber.equal('90'); + expect(await this.token.getPastVotes(other1, t3.timepoint)).to.be.bignumber.equal('80'); + expect(await this.token.getPastVotes(other1, t4.timepoint)).to.be.bignumber.equal('100'); + }); + + it('does not add more than one checkpoint in a block', async function () { + await this.token.transfer(recipient, '100', { from: holder }); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); + + const [t1, t2, t3] = await batchInBlock([ + () => this.token.delegate(other1, { from: recipient, gas: 100000 }), + () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), + () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), + ]); + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.timepoint.toString(), '80']); + + const t4 = await this.token.transfer(recipient, 20, { from: holder }); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.timepoint.toString(), '100']); + }); + }); + + describe('getPastVotes', function () { + it('reverts if block number >= current block', async function () { + await expectRevert(this.token.getPastVotes(other1, 5e10), 'ERC20Votes: future lookup'); + }); + + it('returns 0 if there are no checkpoints', async function () { + expect(await this.token.getPastVotes(other1, 0)).to.be.bignumber.equal('0'); + }); + + it('returns the latest block if >= last checkpoint block', async function () { + const { receipt } = await this.token.delegate(other1, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastVotes(other1, timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('returns zero if < first checkpoint block', async function () { + await time.advanceBlock(); + const { receipt } = await this.token.delegate(other1, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastVotes(other1, timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastVotes(other1, timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('generally returns the voting balance at the appropriate checkpoint', async function () { + const t1 = await this.token.delegate(other1, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t2 = await this.token.transfer(other2, 10, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t3 = await this.token.transfer(other2, 10, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t4 = await this.token.transfer(holder, 20, { from: other2 }); + await time.advanceBlock(); + await time.advanceBlock(); + + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.getPastVotes(other1, t1.timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastVotes(other1, t1.timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t1.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t2.timepoint)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastVotes(other1, t2.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastVotes(other1, t3.timepoint)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastVotes(other1, t3.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastVotes(other1, t4.timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastVotes(other1, t4.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + }); }); - it('rejects expired permit', async function () { - const expiry = (await time.latest()) - time.duration.weeks(1); + describe('getPastTotalSupply', function () { + beforeEach(async function () { + await this.token.delegate(holder, { from: holder }); + }); - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + it('reverts if block number >= current block', async function () { + await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: future lookup'); + }); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), - 'ERC20Votes: signature expired', - ); + it('returns 0 if there are no checkpoints', async function () { + expect(await this.token.getPastTotalSupply(0)).to.be.bignumber.equal('0'); + }); + + it('returns the latest block if >= last checkpoint block', async function () { + const { receipt } = await this.token.$_mint(holder, supply); + const timepoint = await clockFromReceipt[mode](receipt); + + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastTotalSupply(timepoint)).to.be.bignumber.equal(supply); + expect(await this.token.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal(supply); + }); + + it('returns zero if < first checkpoint block', async function () { + await time.advanceBlock(); + const { receipt } = await this.token.$_mint(holder, supply); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastTotalSupply(timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('generally returns the voting balance at the appropriate checkpoint', async function () { + const t1 = await this.token.$_mint(holder, supply); + await time.advanceBlock(); + await time.advanceBlock(); + const t2 = await this.token.$_burn(holder, 10); + await time.advanceBlock(); + await time.advanceBlock(); + const t3 = await this.token.$_burn(holder, 10); + await time.advanceBlock(); + await time.advanceBlock(); + const t4 = await this.token.$_mint(holder, 20); + await time.advanceBlock(); + await time.advanceBlock(); + + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.getPastTotalSupply(t1.timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastTotalSupply(t1.timepoint)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t2.timepoint)).to.be.bignumber.equal('9999999999999999999999990'); + expect(await this.token.getPastTotalSupply(t2.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t3.timepoint)).to.be.bignumber.equal('9999999999999999999999980'); + expect(await this.token.getPastTotalSupply(t3.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t4.timepoint)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t4.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); }); }); - }); - - describe('change delegation', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - await this.token.delegate(holder, { from: holder }); - }); - - it('call', async function () { - expect(await this.token.delegates(holder)).to.be.equal(holder); - - const { receipt } = await this.token.delegate(holderDelegatee, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: holder, - toDelegate: holderDelegatee, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: '0', - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holderDelegatee, - previousBalance: '0', - newBalance: supply, - }); - - expect(await this.token.delegates(holder)).to.be.equal(holderDelegatee); - - expect(await this.token.getVotes(holder)).to.be.bignumber.equal('0'); - expect(await this.token.getVotes(holderDelegatee)).to.be.bignumber.equal(supply); - expect(await this.token.getPastVotes(holder, receipt.blockNumber - 1)).to.be.bignumber.equal(supply); - expect(await this.token.getPastVotes(holderDelegatee, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPastVotes(holder, receipt.blockNumber)).to.be.bignumber.equal('0'); - expect(await this.token.getPastVotes(holderDelegatee, receipt.blockNumber)).to.be.bignumber.equal(supply); - }); - }); - - describe('transfers', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - }); - - it('no delegation', async function () { - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); - - this.holderVotes = '0'; - this.recipientVotes = '0'; - }); - - it('sender delegation', async function () { - await this.token.delegate(holder, { from: holder }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: supply.subn(1), - }); - - const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect( - receipt.logs - .filter(({ event }) => event == 'DelegateVotesChanged') - .every(({ logIndex }) => transferLogIndex < logIndex), - ).to.be.equal(true); - - this.holderVotes = supply.subn(1); - this.recipientVotes = '0'; - }); - - it('receiver delegation', async function () { - await this.token.delegate(recipient, { from: recipient }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); - - const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect( - receipt.logs - .filter(({ event }) => event == 'DelegateVotesChanged') - .every(({ logIndex }) => transferLogIndex < logIndex), - ).to.be.equal(true); - - this.holderVotes = '0'; - this.recipientVotes = '1'; - }); - - it('full delegation', async function () { - await this.token.delegate(holder, { from: holder }); - await this.token.delegate(recipient, { from: recipient }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: supply.subn(1), - }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); - - const { logIndex: transferLogIndex } = receipt.logs.find(({ event }) => event == 'Transfer'); - expect( - receipt.logs - .filter(({ event }) => event == 'DelegateVotesChanged') - .every(({ logIndex }) => transferLogIndex < logIndex), - ).to.be.equal(true); - - this.holderVotes = supply.subn(1); - this.recipientVotes = '1'; - }); - - afterEach(async function () { - expect(await this.token.getVotes(holder)).to.be.bignumber.equal(this.holderVotes); - expect(await this.token.getVotes(recipient)).to.be.bignumber.equal(this.recipientVotes); - - // need to advance 2 blocks to see the effect of a transfer on "getPastVotes" - const blockNumber = await time.latestBlock(); - await time.advanceBlock(); - expect(await this.token.getPastVotes(holder, blockNumber)).to.be.bignumber.equal(this.holderVotes); - expect(await this.token.getPastVotes(recipient, blockNumber)).to.be.bignumber.equal(this.recipientVotes); - }); - }); - - // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. - describe('Compound test suite', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - }); - - describe('balanceOf', function () { - it('grants to initial account', async function () { - expect(await this.token.balanceOf(holder)).to.be.bignumber.equal('10000000000000000000000000'); - }); - }); - - describe('numCheckpoints', function () { - it('returns the number of checkpoints for a delegate', async function () { - await this.token.transfer(recipient, '100', { from: holder }); //give an account a few tokens for readability - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - - const t1 = await this.token.delegate(other1, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - - const t2 = await this.token.transfer(other2, 10, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - - const t3 = await this.token.transfer(other2, 10, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('3'); - - const t4 = await this.token.transfer(recipient, 20, { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); - - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '100']); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.receipt.blockNumber.toString(), '90']); - expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.receipt.blockNumber.toString(), '80']); - expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); - - await time.advanceBlock(); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('100'); - expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal('90'); - expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal('80'); - expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal('100'); - }); - - it('does not add more than one checkpoint in a block', async function () { - await this.token.transfer(recipient, '100', { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - - const [t1, t2, t3] = await batchInBlock([ - () => this.token.delegate(other1, { from: recipient, gas: 100000 }), - () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), - () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), - ]); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '80']); - // expectReve(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check - // expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check - - const t4 = await this.token.transfer(recipient, 20, { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); - }); - }); - - describe('getPastVotes', function () { - it('reverts if block number >= current block', async function () { - await expectRevert(this.token.getPastVotes(other1, 5e10), 'ERC20Votes: block not yet mined'); - }); - - it('returns 0 if there are no checkpoints', async function () { - expect(await this.token.getPastVotes(other1, 0)).to.be.bignumber.equal('0'); - }); - - it('returns the latest block if >= last checkpoint block', async function () { - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('returns zero if < first checkpoint block', async function () { - await time.advanceBlock(); - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t2 = await this.token.transfer(other2, 10, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t3 = await this.token.transfer(other2, 10, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t4 = await this.token.transfer(holder, 20, { from: other2 }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - }); - }); - - describe('getPastTotalSupply', function () { - beforeEach(async function () { - await this.token.delegate(holder, { from: holder }); - }); - - it('reverts if block number >= current block', async function () { - await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: block not yet mined'); - }); - - it('returns 0 if there are no checkpoints', async function () { - expect(await this.token.getPastTotalSupply(0)).to.be.bignumber.equal('0'); - }); - - it('returns the latest block if >= last checkpoint block', async function () { - t1 = await this.token.$_mint(holder, supply); - - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal(supply); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal(supply); - }); - - it('returns zero if < first checkpoint block', async function () { - await time.advanceBlock(); - const t1 = await this.token.$_mint(holder, supply); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.$_mint(holder, supply); - await time.advanceBlock(); - await time.advanceBlock(); - const t2 = await this.token.$_burn(holder, 10); - await time.advanceBlock(); - await time.advanceBlock(); - const t3 = await this.token.$_burn(holder, 10); - await time.advanceBlock(); - await time.advanceBlock(); - const t4 = await this.token.$_mint(holder, 20); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - }); + } }); diff --git a/test/token/ERC20/extensions/ERC20VotesComp.test.js b/test/token/ERC20/extensions/ERC20VotesComp.test.js index 660ed2124..5f95722ad 100644 --- a/test/token/ERC20/extensions/ERC20VotesComp.test.js +++ b/test/token/ERC20/extensions/ERC20VotesComp.test.js @@ -8,11 +8,11 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; -const ERC20VotesComp = artifacts.require('$ERC20VotesComp'); - const { batchInBlock } = require('../../../helpers/txpool'); const { getDomain, domainType, domainSeparator } = require('../../../helpers/eip712'); -const { getChainId } = require('../../../helpers/chainid'); +const { clock, clockFromReceipt } = require('../../../helpers/time'); + +const { shouldBehaveLikeEIP6372 } = require('../../../governance/utils/EIP6372.behavior'); const Delegation = [ { name: 'delegatee', type: 'address' }, @@ -20,507 +20,524 @@ const Delegation = [ { name: 'expiry', type: 'uint256' }, ]; +const MODES = { + blocknumber: artifacts.require('$ERC20VotesComp'), + // no timestamp mode for ERC20VotesComp yet +}; + contract('ERC20VotesComp', function (accounts) { const [holder, recipient, holderDelegatee, other1, other2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; - const version = '1'; const supply = new BN('10000000000000000000000000'); - beforeEach(async function () { - this.chainId = await getChainId(); - this.token = await ERC20VotesComp.new(name, symbol, name); - }); - - it('initial nonce is 0', async function () { - expect(await this.token.nonces(holder)).to.be.bignumber.equal('0'); - }); - - it('domain separator', async function () { - expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); - }); - - it('minting restriction', async function () { - const amount = new BN('2').pow(new BN('96')); - await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); - }); - - describe('set delegation', function () { - describe('call', function () { - it('delegation with balance', async function () { - await this.token.$_mint(holder, supply); - expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); - - const { receipt } = await this.token.delegate(holder, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: ZERO_ADDRESS, - toDelegate: holder, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: '0', - newBalance: supply, - }); - - expect(await this.token.delegates(holder)).to.be.equal(holder); - - expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal(supply); - expect(await this.token.getPriorVotes(holder, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPriorVotes(holder, receipt.blockNumber)).to.be.bignumber.equal(supply); - }); - - it('delegation without balance', async function () { - expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); - - const { receipt } = await this.token.delegate(holder, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: ZERO_ADDRESS, - toDelegate: holder, - }); - expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); - - expect(await this.token.delegates(holder)).to.be.equal(holder); - }); - }); - - describe('with signature', function () { - const delegator = Wallet.generate(); - const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); - const nonce = 0; - - const buildData = (contract, message) => - getDomain(contract).then(domain => ({ - primaryType: 'Delegation', - types: { EIP712Domain: domainType(domain), Delegation }, - domain, - message, - })); - + for (const [mode, artifact] of Object.entries(MODES)) { + describe(`vote with ${mode}`, function () { beforeEach(async function () { - await this.token.$_mint(delegatorAddress, supply); + this.token = await artifact.new(name, symbol, name); }); - it('accept signed delegation', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + shouldBehaveLikeEIP6372(mode); - expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); + it('initial nonce is 0', async function () { + expect(await this.token.nonces(holder)).to.be.bignumber.equal('0'); + }); - const { receipt } = await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); - expectEvent(receipt, 'DelegateChanged', { - delegator: delegatorAddress, - fromDelegate: ZERO_ADDRESS, - toDelegate: delegatorAddress, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: delegatorAddress, - previousBalance: '0', - newBalance: supply, + it('domain separator', async function () { + expect(await this.token.DOMAIN_SEPARATOR()).to.equal(await getDomain(this.token).then(domainSeparator)); + }); + + it('minting restriction', async function () { + const amount = new BN('2').pow(new BN('96')); + await expectRevert(this.token.$_mint(holder, amount), 'ERC20Votes: total supply risks overflowing votes'); + }); + + describe('set delegation', function () { + describe('call', function () { + it('delegation with balance', async function () { + await this.token.$_mint(holder, supply); + expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegate(holder, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: ZERO_ADDRESS, + toDelegate: holder, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(holder)).to.be.equal(holder); + + expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal(supply); + expect(await this.token.getPriorVotes(holder, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPriorVotes(holder, timepoint)).to.be.bignumber.equal(supply); + }); + + it('delegation without balance', async function () { + expect(await this.token.delegates(holder)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegate(holder, { from: holder }); + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: ZERO_ADDRESS, + toDelegate: holder, + }); + expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); + + expect(await this.token.delegates(holder)).to.be.equal(holder); + }); }); - expect(await this.token.delegates(delegatorAddress)).to.be.equal(delegatorAddress); + describe('with signature', function () { + const delegator = Wallet.generate(); + const delegatorAddress = web3.utils.toChecksumAddress(delegator.getAddressString()); + const nonce = 0; - expect(await this.token.getCurrentVotes(delegatorAddress)).to.be.bignumber.equal(supply); - expect(await this.token.getPriorVotes(delegatorAddress, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPriorVotes(delegatorAddress, receipt.blockNumber)).to.be.bignumber.equal(supply); + const buildData = (contract, message) => + getDomain(contract).then(domain => ({ + primaryType: 'Delegation', + types: { EIP712Domain: domainType(domain), Delegation }, + domain, + message, + })); + + beforeEach(async function () { + await this.token.$_mint(delegatorAddress, supply); + }); + + it('accept signed delegation', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + expect(await this.token.delegates(delegatorAddress)).to.be.equal(ZERO_ADDRESS); + + const { receipt } = await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: delegatorAddress, + fromDelegate: ZERO_ADDRESS, + toDelegate: delegatorAddress, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: delegatorAddress, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(delegatorAddress)).to.be.equal(delegatorAddress); + + expect(await this.token.getCurrentVotes(delegatorAddress)).to.be.bignumber.equal(supply); + expect(await this.token.getPriorVotes(delegatorAddress, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPriorVotes(delegatorAddress, timepoint)).to.be.bignumber.equal(supply); + }); + + it('rejects reused signature', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s), + 'ERC20Votes: invalid nonce', + ); + }); + + it('rejects bad delegatee', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); + const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); + expect(args.delegator).to.not.be.equal(delegatorAddress); + expect(args.fromDelegate).to.be.equal(ZERO_ADDRESS); + expect(args.toDelegate).to.be.equal(holderDelegatee); + }); + + it('rejects bad nonce', async function () { + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry: MAX_UINT256, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), + 'ERC20Votes: invalid nonce', + ); + }); + + it('rejects expired permit', async function () { + const expiry = (await time.latest()) - time.duration.weeks(1); + const { v, r, s } = await buildData(this.token, { + delegatee: delegatorAddress, + nonce, + expiry, + }).then(data => fromRpcSig(ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data }))); + + await expectRevert( + this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), + 'ERC20Votes: signature expired', + ); + }); + }); }); - it('rejects reused signature', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + describe('change delegation', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + await this.token.delegate(holder, { from: holder }); + }); - await this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s); + it('call', async function () { + expect(await this.token.delegates(holder)).to.be.equal(holder); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce, MAX_UINT256, v, r, s), - 'ERC20Votes: invalid nonce', - ); + const { receipt } = await this.token.delegate(holderDelegatee, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + + expectEvent(receipt, 'DelegateChanged', { + delegator: holder, + fromDelegate: holder, + toDelegate: holderDelegatee, + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: '0', + }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holderDelegatee, + previousBalance: '0', + newBalance: supply, + }); + + expect(await this.token.delegates(holder)).to.be.equal(holderDelegatee); + + expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal('0'); + expect(await this.token.getCurrentVotes(holderDelegatee)).to.be.bignumber.equal(supply); + expect(await this.token.getPriorVotes(holder, timepoint - 1)).to.be.bignumber.equal(supply); + expect(await this.token.getPriorVotes(holderDelegatee, timepoint - 1)).to.be.bignumber.equal('0'); + await time.advanceBlock(); + expect(await this.token.getPriorVotes(holder, timepoint)).to.be.bignumber.equal('0'); + expect(await this.token.getPriorVotes(holderDelegatee, timepoint)).to.be.bignumber.equal(supply); + }); }); - it('rejects bad delegatee', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + describe('transfers', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + }); - const receipt = await this.token.delegateBySig(holderDelegatee, nonce, MAX_UINT256, v, r, s); - const { args } = receipt.logs.find(({ event }) => event == 'DelegateChanged'); - expect(args.delegator).to.not.be.equal(delegatorAddress); - expect(args.fromDelegate).to.be.equal(ZERO_ADDRESS); - expect(args.toDelegate).to.be.equal(holderDelegatee); + it('no delegation', async function () { + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); + + this.holderVotes = '0'; + this.recipientVotes = '0'; + }); + + it('sender delegation', async function () { + await this.token.delegate(holder, { from: holder }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); + + this.holderVotes = supply.subn(1); + this.recipientVotes = '0'; + }); + + it('receiver delegation', async function () { + await this.token.delegate(recipient, { from: recipient }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); + + this.holderVotes = '0'; + this.recipientVotes = '1'; + }); + + it('full delegation', async function () { + await this.token.delegate(holder, { from: holder }); + await this.token.delegate(recipient, { from: recipient }); + + const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); + expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); + expectEvent(receipt, 'DelegateVotesChanged', { + delegate: holder, + previousBalance: supply, + newBalance: supply.subn(1), + }); + expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); + + this.holderVotes = supply.subn(1); + this.recipientVotes = '1'; + }); + + afterEach(async function () { + expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal(this.holderVotes); + expect(await this.token.getCurrentVotes(recipient)).to.be.bignumber.equal(this.recipientVotes); + + // need to advance 2 blocks to see the effect of a transfer on "getPriorVotes" + const timepoint = await clock[mode](); + await time.advanceBlock(); + expect(await this.token.getPriorVotes(holder, timepoint)).to.be.bignumber.equal(this.holderVotes); + expect(await this.token.getPriorVotes(recipient, timepoint)).to.be.bignumber.equal(this.recipientVotes); + }); }); - it('rejects bad nonce', async function () { - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry: MAX_UINT256, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. + describe('Compound test suite', function () { + beforeEach(async function () { + await this.token.$_mint(holder, supply); + }); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce + 1, MAX_UINT256, v, r, s), - 'ERC20Votes: invalid nonce', - ); + describe('balanceOf', function () { + it('grants to initial account', async function () { + expect(await this.token.balanceOf(holder)).to.be.bignumber.equal('10000000000000000000000000'); + }); + }); + + describe('numCheckpoints', function () { + it('returns the number of checkpoints for a delegate', async function () { + await this.token.transfer(recipient, '100', { from: holder }); //give an account a few tokens for readability + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); + + const t1 = await this.token.delegate(other1, { from: recipient }); + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); + + const t2 = await this.token.transfer(other2, 10, { from: recipient }); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); + + const t3 = await this.token.transfer(other2, 10, { from: recipient }); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('3'); + + const t4 = await this.token.transfer(recipient, 20, { from: holder }); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); + + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.timepoint.toString(), '100']); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.timepoint.toString(), '90']); + expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.timepoint.toString(), '80']); + expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.timepoint.toString(), '100']); + + await time.advanceBlock(); + expect(await this.token.getPriorVotes(other1, t1.timepoint)).to.be.bignumber.equal('100'); + expect(await this.token.getPriorVotes(other1, t2.timepoint)).to.be.bignumber.equal('90'); + expect(await this.token.getPriorVotes(other1, t3.timepoint)).to.be.bignumber.equal('80'); + expect(await this.token.getPriorVotes(other1, t4.timepoint)).to.be.bignumber.equal('100'); + }); + + it('does not add more than one checkpoint in a block', async function () { + await this.token.transfer(recipient, '100', { from: holder }); + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); + + const [t1, t2, t3] = await batchInBlock([ + () => this.token.delegate(other1, { from: recipient, gas: 100000 }), + () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), + () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), + ]); + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); + expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.timepoint.toString(), '80']); + + const t4 = await this.token.transfer(recipient, 20, { from: holder }); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); + expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.timepoint.toString(), '100']); + }); + }); + + describe('getPriorVotes', function () { + it('reverts if block number >= current block', async function () { + await expectRevert(this.token.getPriorVotes(other1, 5e10), 'ERC20Votes: future lookup'); + }); + + it('returns 0 if there are no checkpoints', async function () { + expect(await this.token.getPriorVotes(other1, 0)).to.be.bignumber.equal('0'); + }); + + it('returns the latest block if >= last checkpoint block', async function () { + const { receipt } = await this.token.delegate(other1, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPriorVotes(other1, timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('returns zero if < first checkpoint block', async function () { + await time.advanceBlock(); + const { receipt } = await this.token.delegate(other1, { from: holder }); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPriorVotes(other1, timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPriorVotes(other1, timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('generally returns the voting balance at the appropriate checkpoint', async function () { + const t1 = await this.token.delegate(other1, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t2 = await this.token.transfer(other2, 10, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t3 = await this.token.transfer(other2, 10, { from: holder }); + await time.advanceBlock(); + await time.advanceBlock(); + const t4 = await this.token.transfer(holder, 20, { from: other2 }); + await time.advanceBlock(); + await time.advanceBlock(); + + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.getPriorVotes(other1, t1.timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPriorVotes(other1, t1.timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t1.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t2.timepoint)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPriorVotes(other1, t2.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPriorVotes(other1, t3.timepoint)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPriorVotes(other1, t3.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPriorVotes(other1, t4.timepoint)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPriorVotes(other1, t4.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + }); }); - it('rejects expired permit', async function () { - const expiry = (await time.latest()) - time.duration.weeks(1); + describe('getPastTotalSupply', function () { + beforeEach(async function () { + await this.token.delegate(holder, { from: holder }); + }); - const { v, r, s } = await buildData(this.token, { - delegatee: delegatorAddress, - nonce, - expiry, - }) - .then(data => ethSigUtil.signTypedMessage(delegator.getPrivateKey(), { data })) - .then(fromRpcSig); + it('reverts if block number >= current block', async function () { + await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: future lookup'); + }); - await expectRevert( - this.token.delegateBySig(delegatorAddress, nonce, expiry, v, r, s), - 'ERC20Votes: signature expired', - ); + it('returns 0 if there are no checkpoints', async function () { + expect(await this.token.getPastTotalSupply(0)).to.be.bignumber.equal('0'); + }); + + it('returns the latest block if >= last checkpoint block', async function () { + const { receipt } = await this.token.$_mint(holder, supply); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastTotalSupply(timepoint)).to.be.bignumber.equal(supply); + expect(await this.token.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal(supply); + }); + + it('returns zero if < first checkpoint block', async function () { + await time.advanceBlock(); + const { receipt } = await this.token.$_mint(holder, supply); + const timepoint = await clockFromReceipt[mode](receipt); + await time.advanceBlock(); + await time.advanceBlock(); + + expect(await this.token.getPastTotalSupply(timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastTotalSupply(timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); + + it('generally returns the voting balance at the appropriate checkpoint', async function () { + const t1 = await this.token.$_mint(holder, supply); + await time.advanceBlock(); + await time.advanceBlock(); + const t2 = await this.token.$_burn(holder, 10); + await time.advanceBlock(); + await time.advanceBlock(); + const t3 = await this.token.$_burn(holder, 10); + await time.advanceBlock(); + await time.advanceBlock(); + const t4 = await this.token.$_mint(holder, 20); + await time.advanceBlock(); + await time.advanceBlock(); + + t1.timepoint = await clockFromReceipt[mode](t1.receipt); + t2.timepoint = await clockFromReceipt[mode](t2.receipt); + t3.timepoint = await clockFromReceipt[mode](t3.receipt); + t4.timepoint = await clockFromReceipt[mode](t4.receipt); + + expect(await this.token.getPastTotalSupply(t1.timepoint - 1)).to.be.bignumber.equal('0'); + expect(await this.token.getPastTotalSupply(t1.timepoint)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t1.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + expect(await this.token.getPastTotalSupply(t2.timepoint)).to.be.bignumber.equal('9999999999999999999999990'); + expect(await this.token.getPastTotalSupply(t2.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999990', + ); + expect(await this.token.getPastTotalSupply(t3.timepoint)).to.be.bignumber.equal('9999999999999999999999980'); + expect(await this.token.getPastTotalSupply(t3.timepoint + 1)).to.be.bignumber.equal( + '9999999999999999999999980', + ); + expect(await this.token.getPastTotalSupply(t4.timepoint)).to.be.bignumber.equal('10000000000000000000000000'); + expect(await this.token.getPastTotalSupply(t4.timepoint + 1)).to.be.bignumber.equal( + '10000000000000000000000000', + ); + }); }); }); - }); - - describe('change delegation', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - await this.token.delegate(holder, { from: holder }); - }); - - it('call', async function () { - expect(await this.token.delegates(holder)).to.be.equal(holder); - - const { receipt } = await this.token.delegate(holderDelegatee, { from: holder }); - expectEvent(receipt, 'DelegateChanged', { - delegator: holder, - fromDelegate: holder, - toDelegate: holderDelegatee, - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: '0', - }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holderDelegatee, - previousBalance: '0', - newBalance: supply, - }); - - expect(await this.token.delegates(holder)).to.be.equal(holderDelegatee); - - expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal('0'); - expect(await this.token.getCurrentVotes(holderDelegatee)).to.be.bignumber.equal(supply); - expect(await this.token.getPriorVotes(holder, receipt.blockNumber - 1)).to.be.bignumber.equal(supply); - expect(await this.token.getPriorVotes(holderDelegatee, receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - await time.advanceBlock(); - expect(await this.token.getPriorVotes(holder, receipt.blockNumber)).to.be.bignumber.equal('0'); - expect(await this.token.getPriorVotes(holderDelegatee, receipt.blockNumber)).to.be.bignumber.equal(supply); - }); - }); - - describe('transfers', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - }); - - it('no delegation', async function () { - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent.notEmitted(receipt, 'DelegateVotesChanged'); - - this.holderVotes = '0'; - this.recipientVotes = '0'; - }); - - it('sender delegation', async function () { - await this.token.delegate(holder, { from: holder }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: supply.subn(1), - }); - - this.holderVotes = supply.subn(1); - this.recipientVotes = '0'; - }); - - it('receiver delegation', async function () { - await this.token.delegate(recipient, { from: recipient }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); - - this.holderVotes = '0'; - this.recipientVotes = '1'; - }); - - it('full delegation', async function () { - await this.token.delegate(holder, { from: holder }); - await this.token.delegate(recipient, { from: recipient }); - - const { receipt } = await this.token.transfer(recipient, 1, { from: holder }); - expectEvent(receipt, 'Transfer', { from: holder, to: recipient, value: '1' }); - expectEvent(receipt, 'DelegateVotesChanged', { - delegate: holder, - previousBalance: supply, - newBalance: supply.subn(1), - }); - expectEvent(receipt, 'DelegateVotesChanged', { delegate: recipient, previousBalance: '0', newBalance: '1' }); - - this.holderVotes = supply.subn(1); - this.recipientVotes = '1'; - }); - - afterEach(async function () { - expect(await this.token.getCurrentVotes(holder)).to.be.bignumber.equal(this.holderVotes); - expect(await this.token.getCurrentVotes(recipient)).to.be.bignumber.equal(this.recipientVotes); - - // need to advance 2 blocks to see the effect of a transfer on "getPriorVotes" - const blockNumber = await time.latestBlock(); - await time.advanceBlock(); - expect(await this.token.getPriorVotes(holder, blockNumber)).to.be.bignumber.equal(this.holderVotes); - expect(await this.token.getPriorVotes(recipient, blockNumber)).to.be.bignumber.equal(this.recipientVotes); - }); - }); - - // The following tests are a adaptation of https://github.com/compound-finance/compound-protocol/blob/master/tests/Governance/CompTest.js. - describe('Compound test suite', function () { - beforeEach(async function () { - await this.token.$_mint(holder, supply); - }); - - describe('balanceOf', function () { - it('grants to initial account', async function () { - expect(await this.token.balanceOf(holder)).to.be.bignumber.equal('10000000000000000000000000'); - }); - }); - - describe('numCheckpoints', function () { - it('returns the number of checkpoints for a delegate', async function () { - await this.token.transfer(recipient, '100', { from: holder }); //give an account a few tokens for readability - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - - const t1 = await this.token.delegate(other1, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - - const t2 = await this.token.transfer(other2, 10, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - - const t3 = await this.token.transfer(other2, 10, { from: recipient }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('3'); - - const t4 = await this.token.transfer(recipient, 20, { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('4'); - - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '100']); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t2.receipt.blockNumber.toString(), '90']); - expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([t3.receipt.blockNumber.toString(), '80']); - expect(await this.token.checkpoints(other1, 3)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); - - await time.advanceBlock(); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal('100'); - expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal('90'); - expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal('80'); - expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal('100'); - }); - - it('does not add more than one checkpoint in a block', async function () { - await this.token.transfer(recipient, '100', { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('0'); - - const [t1, t2, t3] = await batchInBlock([ - () => this.token.delegate(other1, { from: recipient, gas: 100000 }), - () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), - () => this.token.transfer(other2, 10, { from: recipient, gas: 100000 }), - ]); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('1'); - expect(await this.token.checkpoints(other1, 0)).to.be.deep.equal([t1.receipt.blockNumber.toString(), '80']); - // expectReve(await this.token.checkpoints(other1, 1)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check - // expect(await this.token.checkpoints(other1, 2)).to.be.deep.equal([ '0', '0' ]); // Reverts due to array overflow check - - const t4 = await this.token.transfer(recipient, 20, { from: holder }); - expect(await this.token.numCheckpoints(other1)).to.be.bignumber.equal('2'); - expect(await this.token.checkpoints(other1, 1)).to.be.deep.equal([t4.receipt.blockNumber.toString(), '100']); - }); - }); - - describe('getPriorVotes', function () { - it('reverts if block number >= current block', async function () { - await expectRevert(this.token.getPriorVotes(other1, 5e10), 'ERC20Votes: block not yet mined'); - }); - - it('returns 0 if there are no checkpoints', async function () { - expect(await this.token.getPriorVotes(other1, 0)).to.be.bignumber.equal('0'); - }); - - it('returns the latest block if >= last checkpoint block', async function () { - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('returns zero if < first checkpoint block', async function () { - await time.advanceBlock(); - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.delegate(other1, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t2 = await this.token.transfer(other2, 10, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t3 = await this.token.transfer(other2, 10, { from: holder }); - await time.advanceBlock(); - await time.advanceBlock(); - const t4 = await this.token.transfer(holder, 20, { from: other2 }); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPriorVotes(other1, t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPriorVotes(other1, t2.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPriorVotes(other1, t3.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPriorVotes(other1, t4.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - }); - }); - - describe('getPastTotalSupply', function () { - beforeEach(async function () { - await this.token.delegate(holder, { from: holder }); - }); - - it('reverts if block number >= current block', async function () { - await expectRevert(this.token.getPastTotalSupply(5e10), 'ERC20Votes: block not yet mined'); - }); - - it('returns 0 if there are no checkpoints', async function () { - expect(await this.token.getPastTotalSupply(0)).to.be.bignumber.equal('0'); - }); - - it('returns the latest block if >= last checkpoint block', async function () { - t1 = await this.token.$_mint(holder, supply); - - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal(supply); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal(supply); - }); - - it('returns zero if < first checkpoint block', async function () { - await time.advanceBlock(); - const t1 = await this.token.$_mint(holder, supply); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - - it('generally returns the voting balance at the appropriate checkpoint', async function () { - const t1 = await this.token.$_mint(holder, supply); - await time.advanceBlock(); - await time.advanceBlock(); - const t2 = await this.token.$_burn(holder, 10); - await time.advanceBlock(); - await time.advanceBlock(); - const t3 = await this.token.$_burn(holder, 10); - await time.advanceBlock(); - await time.advanceBlock(); - const t4 = await this.token.$_mint(holder, 20); - await time.advanceBlock(); - await time.advanceBlock(); - - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber - 1)).to.be.bignumber.equal('0'); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t1.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastTotalSupply(t2.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999990', - ); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastTotalSupply(t3.receipt.blockNumber + 1)).to.be.bignumber.equal( - '9999999999999999999999980', - ); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - expect(await this.token.getPastTotalSupply(t4.receipt.blockNumber + 1)).to.be.bignumber.equal( - '10000000000000000000000000', - ); - }); - }); + } }); diff --git a/test/token/ERC721/extensions/ERC721Votes.test.js b/test/token/ERC721/extensions/ERC721Votes.test.js index f7baef4c1..92032db87 100644 --- a/test/token/ERC721/extensions/ERC721Votes.test.js +++ b/test/token/ERC721/extensions/ERC721Votes.test.js @@ -178,6 +178,7 @@ contract('ERC721Votes', function (accounts) { this.name = 'My Vote'; }); + // includes EIP6372 behavior check shouldBehaveLikeVotes(); }); }); diff --git a/test/utils/Checkpoints.test.js b/test/utils/Checkpoints.test.js index d43d469cc..48a00e31a 100644 --- a/test/utils/Checkpoints.test.js +++ b/test/utils/Checkpoints.test.js @@ -117,8 +117,10 @@ contract('Checkpoints', function () { const latestCheckpoint = (self, ...args) => self.methods[`$latestCheckpoint_Checkpoints_Trace${length}(uint256)`](0, ...args); const push = (self, ...args) => self.methods[`$push(uint256,uint${256 - length},uint${length})`](0, ...args); - const upperLookup = (self, ...args) => self.methods[`$upperLookup(uint256,uint${256 - length})`](0, ...args); const lowerLookup = (self, ...args) => self.methods[`$lowerLookup(uint256,uint${256 - length})`](0, ...args); + const upperLookup = (self, ...args) => self.methods[`$upperLookup(uint256,uint${256 - length})`](0, ...args); + const upperLookupRecent = (self, ...args) => + self.methods[`$upperLookupRecent(uint256,uint${256 - length})`](0, ...args); const getLength = (self, ...args) => self.methods[`$length_Checkpoints_Trace${length}(uint256)`](0, ...args); describe('without checkpoints', function () { @@ -134,6 +136,7 @@ contract('Checkpoints', function () { it('lookup returns 0', async function () { expect(await lowerLookup(this.mock, 0)).to.be.bignumber.equal('0'); expect(await upperLookup(this.mock, 0)).to.be.bignumber.equal('0'); + expect(await upperLookupRecent(this.mock, 0)).to.be.bignumber.equal('0'); }); }); @@ -190,11 +193,33 @@ contract('Checkpoints', function () { } }); - it('upper lookup', async function () { + it('upper lookup & upperLookupRecent', async function () { for (let i = 0; i < 14; ++i) { const value = last(this.checkpoints.filter(x => i >= x.key))?.value || '0'; expect(await upperLookup(this.mock, i)).to.be.bignumber.equal(value); + expect(await upperLookupRecent(this.mock, i)).to.be.bignumber.equal(value); + } + }); + + it('upperLookupRecent with more than 5 checkpoints', async function () { + const moreCheckpoints = [ + { key: '12', value: '22' }, + { key: '13', value: '131' }, + { key: '17', value: '45' }, + { key: '19', value: '31452' }, + { key: '21', value: '0' }, + ]; + const allCheckpoints = [].concat(this.checkpoints, moreCheckpoints); + + for (const { key, value } of moreCheckpoints) { + await push(this.mock, key, value); + } + + for (let i = 0; i < 25; ++i) { + const value = last(allCheckpoints.filter(x => i >= x.key))?.value || '0'; + expect(await upperLookup(this.mock, i)).to.be.bignumber.equal(value); + expect(await upperLookupRecent(this.mock, i)).to.be.bignumber.equal(value); } }); }); From 6259e13a0c92547646f1dd1764583e86bb997441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Thu, 9 Feb 2023 15:36:14 -0600 Subject: [PATCH 164/197] Improve ERC721 Wrapper tests (#4039) --- test/token/ERC721/extensions/ERC721Wrapper.test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/token/ERC721/extensions/ERC721Wrapper.test.js b/test/token/ERC721/extensions/ERC721Wrapper.test.js index 5c83d73cc..def6ca7ee 100644 --- a/test/token/ERC721/extensions/ERC721Wrapper.test.js +++ b/test/token/ERC721/extensions/ERC721Wrapper.test.js @@ -196,11 +196,21 @@ contract('ERC721Wrapper', function (accounts) { to: initialHolder, tokenId: firstTokenId, }); + await expectEvent.inTransaction(tx, this.underlying, 'Transfer', { + from: this.token.address, + to: initialHolder, + tokenId: secondTokenId, + }); await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: initialHolder, to: constants.ZERO_ADDRESS, tokenId: firstTokenId, }); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: initialHolder, + to: constants.ZERO_ADDRESS, + tokenId: secondTokenId, + }); }); it('works to another account', async function () { From dfcc1d16c5efd0fd2a7abac56680810c861a9cd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 18:42:08 -0300 Subject: [PATCH 165/197] Bump http-cache-semantics from 4.1.0 to 4.1.1 (#4024) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a663055fd..4f808cf30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8426,9 +8426,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-errors": { @@ -22946,9 +22946,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-errors": { From 5a00628ed3d6ce3154cee4d2cc93fad920e8ea30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 15:21:45 -0300 Subject: [PATCH 166/197] Update getsentry/action-github-app-token action to v2 (#4036) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/upgradeable.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upgradeable.yml b/.github/workflows/upgradeable.yml index a94f78c98..a7ed8da88 100644 --- a/.github/workflows/upgradeable.yml +++ b/.github/workflows/upgradeable.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - id: app - uses: getsentry/action-github-app-token@v1 + uses: getsentry/action-github-app-token@v2 with: app_id: ${{ secrets.UPGRADEABLE_APP_ID }} private_key: ${{ secrets.UPGRADEABLE_APP_PK }} From 2c711d0b0513d283b27a3b28df06d558a19c3aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Tue, 14 Feb 2023 14:47:07 -0600 Subject: [PATCH 167/197] Restrict ERC721Wrapper wrap by direct transfer (#4043) Co-authored-by: Hadrien Croubois --- .../token/ERC721/extensions/ERC721Wrapper.sol | 17 +++----- .../ERC721/extensions/ERC721Wrapper.test.js | 39 ++----------------- 2 files changed, 9 insertions(+), 47 deletions(-) diff --git a/contracts/token/ERC721/extensions/ERC721Wrapper.sol b/contracts/token/ERC721/extensions/ERC721Wrapper.sol index 87729188a..f10d55564 100644 --- a/contracts/token/ERC721/extensions/ERC721Wrapper.sol +++ b/contracts/token/ERC721/extensions/ERC721Wrapper.sol @@ -17,10 +17,6 @@ import "../utils/ERC721Holder.sol"; abstract contract ERC721Wrapper is ERC721, ERC721Holder { IERC721 private immutable _underlying; - // Kept as bytes12 so it can be packed with an address - // Equal to 0xb125e89df18e2ceac5fd2fa8 - bytes12 public constant WRAPPER_ACCEPT_MAGIC = bytes12(keccak256("WRAPPER_ACCEPT_MAGIC")); - constructor(IERC721 underlyingToken) { _underlying = underlyingToken; } @@ -29,7 +25,7 @@ abstract contract ERC721Wrapper is ERC721, ERC721Holder { * @dev Allow a user to deposit underlying tokens and mint the corresponding tokenIds. */ function depositFor(address account, uint256[] memory tokenIds) public virtual returns (bool) { - bytes memory data = abi.encodePacked(WRAPPER_ACCEPT_MAGIC, account); + bytes memory data = abi.encodePacked(account); uint256 length = tokenIds.length; for (uint256 i = 0; i < length; ++i) { @@ -61,23 +57,22 @@ abstract contract ERC721Wrapper is ERC721, ERC721Holder { * @dev Overrides {IERC721Receiver-onERC721Received} to allow minting on direct ERC721 transfers to * this contract. * - * In case there's data attached, it validates that the sender is aware of this contract's existence and behavior - * by checking a magic value (`WRAPPER_ACCEPT_MAGIC`) in the first 12 bytes. If it also matches, the rest 20 - * bytes are used as an address to send the tokens to. + * In case there's data attached, it validates that the operator is this contract, so only trusted data + * is accepted from {depositFor}. * * WARNING: Doesn't work with unsafe transfers (eg. {IERC721-transferFrom}). Use {ERC721Wrapper-_recover} * for recovering in that scenario. */ function onERC721Received( - address, + address operator, address from, uint256 tokenId, bytes memory data ) public override returns (bytes4) { require(address(underlying()) == _msgSender(), "ERC721Wrapper: caller is not underlying"); if (data.length > 0) { - require(data.length == 32 && WRAPPER_ACCEPT_MAGIC == bytes12(data), "ERC721Wrapper: Invalid data format"); - from = address(bytes20(bytes32(data) << 96)); + require(data.length == 20 && operator == address(this), "ERC721Wrapper: Invalid data format"); + from = address(bytes20(data)); } _safeMint(from, tokenId); return IERC721Receiver.onERC721Received.selector; diff --git a/test/token/ERC721/extensions/ERC721Wrapper.test.js b/test/token/ERC721/extensions/ERC721Wrapper.test.js index def6ca7ee..0558dfa37 100644 --- a/test/token/ERC721/extensions/ERC721Wrapper.test.js +++ b/test/token/ERC721/extensions/ERC721Wrapper.test.js @@ -1,6 +1,5 @@ const { BN, expectEvent, constants, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); -const { keccakFromString, bufferToHex } = require('ethereumjs-util'); const { shouldBehaveLikeERC721 } = require('../ERC721.behavior'); @@ -230,27 +229,13 @@ contract('ERC721Wrapper', function (accounts) { }); describe('onERC721Received', function () { - const WRAPPER_ACCEPT_MAGIC = bufferToHex(keccakFromString('WRAPPER_ACCEPT_MAGIC')).slice(0, 26); // Include 0x - - const magicWithAddresss = address => - web3.utils.encodePacked( - { - value: WRAPPER_ACCEPT_MAGIC, - type: 'bytes12', - }, - { - value: address, - type: 'address', - }, - ); - it('only allows calls from underlying', async function () { await expectRevert( this.token.onERC721Received( initialHolder, this.token.address, firstTokenId, - magicWithAddresss(anotherAccount), // Correct data + anotherAccount, // Correct data { from: anotherAccount }, ), 'ERC721Wrapper: caller is not underlying', @@ -273,13 +258,13 @@ contract('ERC721Wrapper', function (accounts) { ); }); - it('reverts with the magic value and data length different to 32', async function () { + it('reverts with correct data from an untrusted operator', async function () { await expectRevert( this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( initialHolder, this.token.address, firstTokenId, - WRAPPER_ACCEPT_MAGIC, // Reverts for any non-32 bytes value + anotherAccount, { from: initialHolder, }, @@ -287,24 +272,6 @@ contract('ERC721Wrapper', function (accounts) { 'ERC721Wrapper: Invalid data format', ); }); - - it('mints token to specific holder with address after magic value', async function () { - const { tx } = await this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( - initialHolder, - this.token.address, - firstTokenId, - magicWithAddresss(anotherAccount), - { - from: initialHolder, - }, - ); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: anotherAccount, - tokenId: firstTokenId, - }); - }); }); it('mints a token to from if no data is specified', async function () { From 6d18435098c797bc8c3cfbf51fe10d450a2f6595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Tue, 14 Feb 2023 17:03:37 -0600 Subject: [PATCH 168/197] Add `RELEASING.md` docs (#3981) Co-authored-by: Francisco Giordano --- .github/workflows/release-cycle.yml | 12 +++++++ CONTRIBUTING.md | 2 ++ RELEASING.md | 55 +++++++++++++++++------------ 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index 4fe09a4eb..1831bd519 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -1,3 +1,15 @@ +# D: Manual Dispatch +# M: Merge release PR +# C: Commit +# ┌───────────┐ ┌─────────────┐ ┌────────────────┐ +# │Development├──D──►RC-Unreleased│ ┌──►Final-Unreleased│ +# └───────────┘ └─┬─────────▲─┘ │ └─┬────────────▲─┘ +# │ │ │ │ │ +# M C D M C +# │ │ │ │ │ +# ┌▼─────────┴┐ │ ┌▼────────────┴┐ +# │RC-Released├───┘ │Final-Released│ +# └───────────┘ └──────────────┘ name: Release Cycle on: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ecbc2d400..1a44cc27d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,6 +29,8 @@ Any non-trivial code contribution must be first discussed with the maintainers i Make sure to read and follow the [engineering guidelines](./GUIDELINES.md). Run linter and tests to make sure your pull request is good before submitting it. +Changelog entries should be added to each pull request by using [Changesets](https://github.com/changesets/changesets/). + When opening the pull request you will be presented with a template and a series of instructions. Read through it carefully and follow all the steps. Expect a review and feedback from the maintainers afterwards. If you're looking for a good place to start, look for issues labelled ["good first issue"](https://github.com/OpenZeppelin/openzeppelin-contracts/labels/good%20first%20issue)! diff --git a/RELEASING.md b/RELEASING.md index f356ab2e4..0318f6338 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,36 +1,47 @@ # Releasing -> Visit the documentation for [details about release schedule]. +> Visit the documentation for [details about release schedule](https://docs.openzeppelin.com/contracts/releases-stability). -Start on an up-to-date `master` branch. +OpenZeppelin Contracts uses a fully automated release process that takes care of compiling, packaging, and publishing the library, all of which is carried out in a clean CI environment (GitHub Actions), implemented in the ([`release-cycle`](.github/workflows/release-cycle.yml)) workflow. This helps to reduce the potential for human error and inconsistencies, and ensures that the release process is ongoing and reliable. -Create the release branch with `npm run release start minor`. +## Changesets -Publish a release candidate with `npm run release rc`. +[Changesets](https://github.com/changesets/changesets/) is used as part of our release process for `CHANGELOG.md` management. Each change that is relevant for the codebase is expected to include a changeset. -Publish the final release with `npm run release final`. +## Branching model -Follow the general [OpenZeppelin Contracts release checklist]. +The release cycle happens on release branches called `release-vX.Y`. Each of these branches starts as a release candidate (rc) and is eventually promoted to final. -[details about release schedule]: https://docs.openzeppelin.com/contracts/releases-stability -[OpenZeppelin Contracts release checklist]: https://github.com/OpenZeppelin/code-style/blob/master/RELEASE_CHECKLIST.md +A release branch can be updated with cherry-picked patches from `master`, or may sometimes be committed to directly in the case of old releases. These commits will lead to a new release candidate or a patch increment depending on the state of the release branch. +```mermaid + %%{init: {'gitGraph': {'mainBranchName': 'master'}} }%% + gitGraph + commit id: "Feature A" + commit id: "Feature B" + branch release-vX.Y + commit id: "Start release" + commit id: "Release vX.Y.0-rc.0" -## Merging the release branch + checkout master + commit id: "Feature C" + commit id: "Fix A" -After the final release, the release branch should be merged back into `master`. This merge must not be squashed because it would lose the tagged release commit. Since the GitHub repo is set up to only allow squashed merges, the merge should be done locally and pushed. + checkout release-vX.Y + cherry-pick id: "Fix A" tag: "" + commit id: "Release vX.Y.0-rc.1" + commit id: "Release vX.Y.0" -Make sure to have the latest changes from `upstream` in your local release branch. + checkout master + merge release-vX.Y + commit id: "Feature D" + commit id: "Patch B" + checkout release-vX.Y + cherry-pick id: "Patch B" tag: "" + commit id: "Release vX.Y.1" + + checkout master + merge release-vX.Y + commit id: "Feature E" ``` -git checkout release-vX.Y.Z -git pull upstream -``` - -``` -git checkout master -git merge --no-ff release-vX.Y.Z -git push upstream master -``` - -The release branch can then be deleted on GitHub. From 4e8aa43a900c6fa715c6f64f7c5b6d4d0c041c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Wed, 15 Feb 2023 15:21:29 -0600 Subject: [PATCH 169/197] Add publishing integrity check after releasing (#4045) Co-authored-by: Francisco --- .github/workflows/release-cycle.yml | 25 +++++++++++++++++++++ scripts/release/workflow/integrity-check.sh | 20 +++++++++++++++++ scripts/release/workflow/pack.sh | 1 + scripts/release/workflow/publish.sh | 2 +- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 scripts/release/workflow/integrity-check.sh diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index 1831bd519..2fd66458d 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -142,6 +142,11 @@ jobs: run: bash scripts/release/workflow/pack.sh env: PRERELEASE: ${{ needs.state.outputs.is_prerelease }} + - name: Upload tarball artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ github.ref_name }} + path: ${{ steps.pack.outputs.tarball }} - name: Tag run: npx changeset tag - name: Publish @@ -158,6 +163,26 @@ jobs: PRERELEASE: ${{ needs.state.outputs.is_prerelease }} with: script: await require('./scripts/release/workflow/github-release.js')({ github, context }) + outputs: + tarball_name: ${{ steps.pack.outputs.tarball_name }} + + integrity_check: + needs: publish + name: Tarball Integrity Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Download tarball artifact + id: artifact + # Replace with actions/upload-artifact@v3 when + # https://github.com/actions/download-artifact/pull/194 gets released + uses: actions/download-artifact@e9ef242655d12993efdcda9058dee2db83a2cb9b + with: + name: ${{ github.ref_name }} + - name: Check integrity + run: bash scripts/release/workflow/integrity-check.sh + env: + TARBALL: ${{ steps.artifact.outputs.download-path }}/${{ needs.publish.outputs.tarball_name }} merge: needs: state diff --git a/scripts/release/workflow/integrity-check.sh b/scripts/release/workflow/integrity-check.sh new file mode 100644 index 000000000..86e99f929 --- /dev/null +++ b/scripts/release/workflow/integrity-check.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -euo pipefail + +CHECKSUMS="$RUNNER_TEMP/checksums.txt" + +# Extract tarball content into a tmp directory +tar xf "$TARBALL" -C "$RUNNER_TEMP" + +# Move to extracted directory +cd "$RUNNER_TEMP/package" + +# Checksum all Solidity files +find . -type f -name "*.sol" | xargs shasum > "$CHECKSUMS" + +# Back to directory with git contents +cd "$GITHUB_WORKSPACE/contracts" + +# Check against tarball contents +shasum -c "$CHECKSUMS" diff --git a/scripts/release/workflow/pack.sh b/scripts/release/workflow/pack.sh index 798417d3d..ce30712f8 100644 --- a/scripts/release/workflow/pack.sh +++ b/scripts/release/workflow/pack.sh @@ -20,6 +20,7 @@ dist_tag() { cd contracts TARBALL="$(npm pack | tee /dev/stderr | tail -1)" +echo "tarball_name=$TARBALL" >> $GITHUB_OUTPUT echo "tarball=$(pwd)/$TARBALL" >> $GITHUB_OUTPUT echo "tag=$(dist_tag)" >> $GITHUB_OUTPUT cd .. diff --git a/scripts/release/workflow/publish.sh b/scripts/release/workflow/publish.sh index f9e2802d9..41a9975cb 100644 --- a/scripts/release/workflow/publish.sh +++ b/scripts/release/workflow/publish.sh @@ -15,6 +15,6 @@ delete_tag() { if [ "$TAG" = tmp ]; then delete_tag "$TAG" -elif ["$TAG" = latest ]; then +elif [ "$TAG" = latest ]; then delete_tag next fi From 4ff538af58455987a45243a5ecefca76544969cd Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 15 Feb 2023 19:16:22 -0300 Subject: [PATCH 170/197] Fix flaky timestamp tests (#4046) --- .github/workflows/checks.yml | 1 + test/helpers/governance.js | 15 +++++++++------ test/helpers/time.js | 11 ++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 02664e85c..8bb32dcc3 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -26,6 +26,7 @@ jobs: runs-on: ubuntu-latest env: FORCE_COLOR: 1 + NODE_OPTIONS: --max_old_space_size=4096 GAS: true steps: - uses: actions/checkout@v3 diff --git a/test/helpers/governance.js b/test/helpers/governance.js index ae88e151a..1ffa086cb 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -115,19 +115,22 @@ class GovernorHelper { : this.governor.castVote(...concatOpts([proposal.id, vote.support], opts)); } - waitForSnapshot(offset = 0) { + async waitForSnapshot(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalSnapshot(proposal.id).then(timepoint => forward[this.mode](timepoint.addn(offset))); + const timepoint = await this.governor.proposalSnapshot(proposal.id); + return forward[this.mode](timepoint.addn(offset)); } - waitForDeadline(offset = 0) { + async waitForDeadline(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalDeadline(proposal.id).then(timepoint => forward[this.mode](timepoint.addn(offset))); + const timepoint = await this.governor.proposalDeadline(proposal.id); + return forward[this.mode](timepoint.addn(offset)); } - waitForEta(offset = 0) { + async waitForEta(offset = 0) { const proposal = this.currentProposal; - return this.governor.proposalEta(proposal.id).then(timestamp => forward.timestamp(timestamp.addn(offset))); + const timestamp = await this.governor.proposalEta(proposal.id); + return forward.timestamp(timestamp.addn(offset)); } /** diff --git a/test/helpers/time.js b/test/helpers/time.js index 2e5f6d85a..30df8dc32 100644 --- a/test/helpers/time.js +++ b/test/helpers/time.js @@ -1,16 +1,17 @@ -const { time } = require('@openzeppelin/test-helpers'); +const ozHelpers = require('@openzeppelin/test-helpers'); +const helpers = require('@nomicfoundation/hardhat-network-helpers'); module.exports = { clock: { - blocknumber: () => web3.eth.getBlock('latest').then(block => block.number), - timestamp: () => web3.eth.getBlock('latest').then(block => block.timestamp), + blocknumber: () => helpers.time.latestBlock(), + timestamp: () => helpers.time.latest(), }, clockFromReceipt: { blocknumber: receipt => Promise.resolve(receipt.blockNumber), timestamp: receipt => web3.eth.getBlock(receipt.blockNumber).then(block => block.timestamp), }, forward: { - blocknumber: time.advanceBlockTo, - timestamp: time.increaseTo, + blocknumber: ozHelpers.time.advanceBlockTo, + timestamp: helpers.time.increaseTo, }, }; From 5e76b2622546a2e42e5c19e4ce1a96ee2691c7fe Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 16 Feb 2023 14:33:56 -0300 Subject: [PATCH 171/197] Add Subgraphs to docs sidebar --- docs/modules/ROOT/nav.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 6604c2de5..fd206aacd 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -19,3 +19,5 @@ * xref:crosschain.adoc[Crosschain] * xref:utilities.adoc[Utilities] + +* xref:subgraphs::index.adoc[Subgraphs] From d5d9d4bd3db23444a06bd1a5e2f33fc81e143795 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 17 Feb 2023 03:35:43 +0100 Subject: [PATCH 172/197] Simplify ERC721Wrapper.depositFor to save gas (#4048) --- .../token/ERC721/extensions/ERC721Wrapper.sol | 23 ++++++------- .../ERC721/extensions/ERC721Wrapper.test.js | 34 +------------------ 2 files changed, 12 insertions(+), 45 deletions(-) diff --git a/contracts/token/ERC721/extensions/ERC721Wrapper.sol b/contracts/token/ERC721/extensions/ERC721Wrapper.sol index f10d55564..83e59ce88 100644 --- a/contracts/token/ERC721/extensions/ERC721Wrapper.sol +++ b/contracts/token/ERC721/extensions/ERC721Wrapper.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; import "../ERC721.sol"; -import "../utils/ERC721Holder.sol"; /** * @dev Extension of the ERC721 token contract to support token wrapping. @@ -14,7 +13,7 @@ import "../utils/ERC721Holder.sol"; * * _Available since v4.9.0_ */ -abstract contract ERC721Wrapper is ERC721, ERC721Holder { +abstract contract ERC721Wrapper is ERC721, IERC721Receiver { IERC721 private immutable _underlying; constructor(IERC721 underlyingToken) { @@ -25,11 +24,15 @@ abstract contract ERC721Wrapper is ERC721, ERC721Holder { * @dev Allow a user to deposit underlying tokens and mint the corresponding tokenIds. */ function depositFor(address account, uint256[] memory tokenIds) public virtual returns (bool) { - bytes memory data = abi.encodePacked(account); - uint256 length = tokenIds.length; for (uint256 i = 0; i < length; ++i) { - underlying().safeTransferFrom(_msgSender(), address(this), tokenIds[i], data); + uint256 tokenId = tokenIds[i]; + + // This is an "unsafe" transfer that doesn't call any hook on the receiver. With underlying() being trusted + // (by design of this contract) and no other contracts expected to be called from there, we are safe. + // slither-disable-next-line reentrancy-no-eth + underlying().transferFrom(_msgSender(), address(this), tokenId); + _safeMint(account, tokenId); } return true; @@ -64,16 +67,12 @@ abstract contract ERC721Wrapper is ERC721, ERC721Holder { * for recovering in that scenario. */ function onERC721Received( - address operator, + address, address from, uint256 tokenId, - bytes memory data - ) public override returns (bytes4) { + bytes memory + ) public virtual override returns (bytes4) { require(address(underlying()) == _msgSender(), "ERC721Wrapper: caller is not underlying"); - if (data.length > 0) { - require(data.length == 20 && operator == address(this), "ERC721Wrapper: Invalid data format"); - from = address(bytes20(data)); - } _safeMint(from, tokenId); return IERC721Receiver.onERC721Received.selector; } diff --git a/test/token/ERC721/extensions/ERC721Wrapper.test.js b/test/token/ERC721/extensions/ERC721Wrapper.test.js index 0558dfa37..6e46d2e5a 100644 --- a/test/token/ERC721/extensions/ERC721Wrapper.test.js +++ b/test/token/ERC721/extensions/ERC721Wrapper.test.js @@ -242,39 +242,7 @@ contract('ERC721Wrapper', function (accounts) { ); }); - describe('when data length is > 0', function () { - it('reverts with arbitrary data', async function () { - await expectRevert( - this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( - initialHolder, - this.token.address, - firstTokenId, - '0x0123', - { - from: initialHolder, - }, - ), - 'ERC721Wrapper: Invalid data format', - ); - }); - - it('reverts with correct data from an untrusted operator', async function () { - await expectRevert( - this.underlying.methods['safeTransferFrom(address,address,uint256,bytes)']( - initialHolder, - this.token.address, - firstTokenId, - anotherAccount, - { - from: initialHolder, - }, - ), - 'ERC721Wrapper: Invalid data format', - ); - }); - }); - - it('mints a token to from if no data is specified', async function () { + it('mints a token to from', async function () { const { tx } = await this.underlying.safeTransferFrom(initialHolder, this.token.address, firstTokenId, { from: initialHolder, }); From d64d7aa5d1dac7dd7bf60dae917e400120340002 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 17 Feb 2023 10:08:31 +0100 Subject: [PATCH 173/197] ERC4626 inflation attack mitigation (#3979) Co-authored-by: Francisco --- .changeset/perfect-insects-listen.md | 5 + contracts/mocks/token/ERC4626DecimalsMock.sol | 33 - contracts/mocks/token/ERC4626OffsetMock.sol | 17 + contracts/token/ERC20/extensions/ERC4626.sol | 75 +- .../modules/ROOT/images/erc4626-attack-3a.png | Bin 0 -> 60433 bytes .../modules/ROOT/images/erc4626-attack-3b.png | Bin 0 -> 66184 bytes docs/modules/ROOT/images/erc4626-attack-6.png | Bin 0 -> 56290 bytes docs/modules/ROOT/images/erc4626-attack.png | Bin 0 -> 58886 bytes docs/modules/ROOT/images/erc4626-deposit.png | Bin 0 -> 115497 bytes docs/modules/ROOT/images/erc4626-mint.png | Bin 0 -> 112787 bytes .../ROOT/images/erc4626-rate-linear.png | Bin 0 -> 50813 bytes .../ROOT/images/erc4626-rate-loglog.png | Bin 0 -> 72818 bytes .../ROOT/images/erc4626-rate-loglogext.png | Bin 0 -> 109923 bytes docs/modules/ROOT/nav.adoc | 1 + docs/modules/ROOT/pages/erc4626.adoc | 193 +++++ test/token/ERC20/extensions/ERC4626.t.sol | 18 - test/token/ERC20/extensions/ERC4626.test.js | 772 +++++++++--------- test/utils/math/Math.t.sol | 2 +- 18 files changed, 628 insertions(+), 488 deletions(-) create mode 100644 .changeset/perfect-insects-listen.md delete mode 100644 contracts/mocks/token/ERC4626DecimalsMock.sol create mode 100644 contracts/mocks/token/ERC4626OffsetMock.sol create mode 100644 docs/modules/ROOT/images/erc4626-attack-3a.png create mode 100644 docs/modules/ROOT/images/erc4626-attack-3b.png create mode 100644 docs/modules/ROOT/images/erc4626-attack-6.png create mode 100644 docs/modules/ROOT/images/erc4626-attack.png create mode 100644 docs/modules/ROOT/images/erc4626-deposit.png create mode 100644 docs/modules/ROOT/images/erc4626-mint.png create mode 100644 docs/modules/ROOT/images/erc4626-rate-linear.png create mode 100644 docs/modules/ROOT/images/erc4626-rate-loglog.png create mode 100644 docs/modules/ROOT/images/erc4626-rate-loglogext.png create mode 100644 docs/modules/ROOT/pages/erc4626.adoc diff --git a/.changeset/perfect-insects-listen.md b/.changeset/perfect-insects-listen.md new file mode 100644 index 000000000..9e60120ed --- /dev/null +++ b/.changeset/perfect-insects-listen.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC4626`: Add mitigation to the inflation attack through virtual shares and assets. diff --git a/contracts/mocks/token/ERC4626DecimalsMock.sol b/contracts/mocks/token/ERC4626DecimalsMock.sol deleted file mode 100644 index 9cce5139c..000000000 --- a/contracts/mocks/token/ERC4626DecimalsMock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../token/ERC20/extensions/ERC4626.sol"; - -abstract contract ERC4626DecimalsMock is ERC4626 { - using Math for uint256; - - uint8 private immutable _decimals; - - constructor(uint8 decimals_) { - _decimals = decimals_; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function _initialConvertToShares( - uint256 assets, - Math.Rounding rounding - ) internal view virtual override returns (uint256 shares) { - return assets.mulDiv(10 ** decimals(), 10 ** super.decimals(), rounding); - } - - function _initialConvertToAssets( - uint256 shares, - Math.Rounding rounding - ) internal view virtual override returns (uint256 assets) { - return shares.mulDiv(10 ** super.decimals(), 10 ** decimals(), rounding); - } -} diff --git a/contracts/mocks/token/ERC4626OffsetMock.sol b/contracts/mocks/token/ERC4626OffsetMock.sol new file mode 100644 index 000000000..6e270ca73 --- /dev/null +++ b/contracts/mocks/token/ERC4626OffsetMock.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/extensions/ERC4626.sol"; + +abstract contract ERC4626OffsetMock is ERC4626 { + uint8 private immutable _offset; + + constructor(uint8 offset_) { + _offset = offset_; + } + + function _decimalsOffset() internal view virtual override returns (uint8) { + return _offset; + } +} diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 663377dad..16656bd4f 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -17,28 +17,48 @@ import "../../../utils/math/Math.sol"; * the ERC20 standard. Any additional extensions included along it would affect the "shares" token represented by this * contract and not the "assets" token which is an independent contract. * - * CAUTION: When the vault is empty or nearly empty, deposits are at high risk of being stolen through frontrunning with - * a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation + * [CAUTION] + * ==== + * In empty (or nearly empty) ERC-4626 vaults, deposits are at high risk of being stolen through frontrunning + * with a "donation" to the vault that inflates the price of a share. This is variously known as a donation or inflation * attack and is essentially a problem of slippage. Vault deployers can protect against this attack by making an initial * deposit of a non-trivial amount of the asset, such that price manipulation becomes infeasible. Withdrawals may - * similarly be affected by slippage. Users can protect against this attack as well unexpected slippage in general by + * similarly be affected by slippage. Users can protect against this attack as well as unexpected slippage in general by * verifying the amount received is as expected, using a wrapper that performs these checks such as * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router]. * + * Since v4.9, this implementation uses virtual assets and shares to mitigate that risk. The `_decimalsOffset()` + * corresponds to an offset in the decimal representation between the underlying asset's decimals and the vault + * decimals. This offset also determines the rate of virtual shares to virtual assets in the vault, which itself + * determines the initial exchange rate. While not fully preventing the attack, analysis shows that the default offset + * (0) makes it non-profitable, as a result of the value being captured by the virtual shares (out of the attacker's + * donation) matching the attacker's expected gains. With a larger offset, the attack becomes orders of magnitude more + * expensive than it is profitable. More details about the underlying math can be found + * xref:erc4626.adoc#inflation-attack[here]. + * + * The drawback of this approach is that the virtual shares do capture (a very small) part of the value being accrued + * to the vault. Also, if the vault experiences losses, the users try to exit the vault, the virtual shares and assets + * will cause the first user to exit to experience reduced losses in detriment to the last users that will experience + * bigger losses. Developers willing to revert back to the pre-v4.9 behavior just need to override the + * `_convertToShares` and `_convertToAssets` functions. + * + * To learn more, check out our xref:ROOT:erc4626.adoc[ERC-4626 guide]. + * ==== + * * _Available since v4.7._ */ abstract contract ERC4626 is ERC20, IERC4626 { using Math for uint256; IERC20 private immutable _asset; - uint8 private immutable _decimals; + uint8 private immutable _underlyingDecimals; /** * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC20 or ERC777). */ constructor(IERC20 asset_) { (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_); - _decimals = success ? assetDecimals : super.decimals(); + _underlyingDecimals = success ? assetDecimals : 18; _asset = asset_; } @@ -65,7 +85,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { * See {IERC20Metadata-decimals}. */ function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) { - return _decimals; + return _underlyingDecimals + _decimalsOffset(); } /** @dev See {IERC4626-asset}. */ @@ -90,7 +110,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { /** @dev See {IERC4626-maxDeposit}. */ function maxDeposit(address) public view virtual override returns (uint256) { - return _isVaultHealthy() ? type(uint256).max : 0; + return type(uint256).max; } /** @dev See {IERC4626-maxMint}. */ @@ -179,44 +199,14 @@ abstract contract ERC4626 is ERC20, IERC4626 { * would represent an infinite amount of shares. */ function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) { - uint256 supply = totalSupply(); - return - (assets == 0 || supply == 0) - ? _initialConvertToShares(assets, rounding) - : assets.mulDiv(supply, totalAssets(), rounding); - } - - /** - * @dev Internal conversion function (from assets to shares) to apply when the vault is empty. - * - * NOTE: Make sure to keep this function consistent with {_initialConvertToAssets} when overriding it. - */ - function _initialConvertToShares( - uint256 assets, - Math.Rounding /*rounding*/ - ) internal view virtual returns (uint256 shares) { - return assets; + return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding); } /** * @dev Internal conversion function (from shares to assets) with support for rounding direction. */ function _convertToAssets(uint256 shares, Math.Rounding rounding) internal view virtual returns (uint256) { - uint256 supply = totalSupply(); - return - (supply == 0) ? _initialConvertToAssets(shares, rounding) : shares.mulDiv(totalAssets(), supply, rounding); - } - - /** - * @dev Internal conversion function (from shares to assets) to apply when the vault is empty. - * - * NOTE: Make sure to keep this function consistent with {_initialConvertToShares} when overriding it. - */ - function _initialConvertToAssets( - uint256 shares, - Math.Rounding /*rounding*/ - ) internal view virtual returns (uint256) { - return shares; + return shares.mulDiv(totalAssets() + 1, totalSupply() + 10 ** _decimalsOffset(), rounding); } /** @@ -262,10 +252,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { emit Withdraw(caller, receiver, owner, assets, shares); } - /** - * @dev Checks if vault is "healthy" in the sense of having assets backing the circulating shares. - */ - function _isVaultHealthy() private view returns (bool) { - return totalAssets() > 0 || totalSupply() == 0; + function _decimalsOffset() internal view virtual returns (uint8) { + return 0; } } diff --git a/docs/modules/ROOT/images/erc4626-attack-3a.png b/docs/modules/ROOT/images/erc4626-attack-3a.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb52237d635f634085d87337322ac5e0741ff01 GIT binary patch literal 60433 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¨> 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 W72fFO~av*&4wv-#`&9xxJ7DPz*Q3{XF6KYttW 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 ZvU7})GO|xKx>5WWyCiin@%)Vk{~s{kR%ZYJ literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/erc4626-attack-6.png b/docs/modules/ROOT/images/erc4626-attack-6.png new file mode 100644 index 0000000000000000000000000000000000000000..1587fb5c1360e59243297ebca9f097ed116dcdc4 GIT binary patch literal 56290 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 O?BA=lCt1P7>wf@z+Op{Y literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/erc4626-attack.png b/docs/modules/ROOT/images/erc4626-attack.png new file mode 100644 index 0000000000000000000000000000000000000000..dc059b228bf86b49a55f9afac01baf1188b51904 GIT binary patch literal 58886 zcmeFZcRbd8`#*lljD*T2qtdXmcV>e!lD#RiWp9y)5Gq83gsfz5vP(u;*_-UW$M1M` zUHARD@6YGH|Ni~+^|(AdE}hQvJzlTlc&_99OzF;bVnP~13%z5% zb6BKg@TL5#=Gc=!^mXe55h*kJy28zN?ay!0>ONtZ&~K7X)&9R1{l81_|Hmqrm($Xs z8FF6|+uq%kN>nn~-(Cp}4)&8utbW61k-4k&`0-;ZVTZJPVVZBurace$cOt^i|{EBLI>syiF1-`(vbptFZnF|lTzu{B5 zbVkr|_T~HSHu1d^7TuXOfn?`CSq}=AZ**%@giOzLBuDdG(L_W>vI~c@>y$bi|M}sz zw2qEWqUX2Q?0IgIYIGkI6GHi|`rdi&Z5E!rmAiYmx0Gwvk!0jeukAI=dhg?tts!@k zyQy~yn&(c3dm6$AI~gwxRhab`vL_`aElBu#1H1a$k5#Pp` zw#L;ARk#OlI0iNy=E5#63xDwfqo~++%9Z{4_3MIyf-jpaUdax7Zqa{z#To!F?RUGB zl#-g-??#Yx>D4W`ev;{ILr0SWmc696-|&WeuE@(2HbND!G@oftv~_f>uW;XLFS5}u zE-g)ZH2D<@hL2Vj-ttk;r{PjZA`z!~AE`w6k88Wf8zbm_DEjmyeUMgxc};Wk@yg0d zm+808FQTK<=6J07copIV$uLTJ557w^^5)}BOnr}~;xfQoQOhKtq@>KZ>ZgErYoAM| zpHq}Lcmm&N_{=+fA|p?iIxPgv_2f_rF%;PhH^A*yuJZB}6cI^QNx22@;4|c|oA-bi z?*tVFGc!<Hmv@{mx=FOXM@YmpWj?T^!Iy*bB&;L3- z-TIc5H#9SoO(B+_cw@H94?garT2|2E!QOa72(4Tr2f?wYBn+Xeli$Xt6TJC%#EYy4 zgW&F0cXi#%5#!}O0~f6(MLw#%#NM>HxcHsh#%#2Rvvs2J`Sa&T2Azlf!@@}7;^Iip zoOx1U(euVbH>q7qQ*jv>Mzx$Hk>oBq1U~tE{Y?b~p7T z9XjDA=wo^c8R$)e-Q*Dw^xgstsW93WO6FNe&Y~hEdJdp$$`37VzjqXPC=u)ar0))K#BcI z1Fg--_R2WR^w>mmq@dgSB|Yy0$IdimY&$zUjYp=?@to*S^MR6?5_VzZ$MeUl^U@18^-id2aOvvEKIIH$g zy%l!+0*gQ?ON(!CYdj@NPs-Ag4SnEqT7i>_3F7sOgJmmQ!`{ho8hBL!OXX`P`7L{W z*tH8s>M8YkchB0}+uN;9+O{bl6vqGJ4rKc(Kaqr-!hK8qYfShCT)4^O?}w+f0E zb3cZG5`t9`I~3oIy0otLtEoF|&X({xI%GM_u=XnO6#?bxR?GiDBR-NfhQo>#wORsZC% z^C(W#_0;uHy2pNg*y1}Ar{BMSKQionR1f>$B&IY;KDpx^oSLA=HW%6v5XvX2q`BLMD?`X9)_5C!405T zp=fxv4{psR4C&@Vzj~TC+#CNpZ-vRt+rEDN5poxHinecZa`MoAj#j}f3?rLP@uzlf zUYZb&lRjKFL!wLq0_s$Pw(myf=h^n5%diY5FcN&(nCrpCe2KUqPq;AGnSM8M>&@G@ z?9ep{bIMnPvaLFjWZ}5WmMVW1OioM?w25uSjm*wodH>|wOpu4-PGfv*Y;awj3|u<=`1tsU#_Y+NnKW(ucWN2o z(a{9z>gt_2`ua<~u>v+vi;4sqo>SkQp(6B`vJts>5g)dFH5_;@d?f6=TlQAO`Abg^r5_&gj{+eXej~jl&{o(Dy#@4=)OVP~K2F$?@c8lL zsGmRsa#-N3+-9cXH8ZfCpE~p~uSyMLkf0FbV7?-v;X@k!9X^e`biMi8HzLJ&(Qt?I z_wUc6+9fV7ZtLVEH~ICIa^8d6m}|Fg1-&;Os`R9VRmjb?T^cKABTdS+|JpJyEY1+lcrr{ov7aw;wf<=9q?6RPr7=} zS=ewnlm(I(FuwRTdKDVWn}K-_n>PrdGzfwU-@RA1!@~Ccj5w}XVtS+Dd;?9KBiz8eIhS|Y;eDJY)mmN^+N4wMiO6L;+emvXvbN%I`n9CL& zX1r#7`Ijj;bj)n45)u-+^zRaKOC>So<5|h>4xqe zpbWwd@-_87A0LcP$)gmdJy`#ads(Q9KxHGKVAFVK@$Ku^E9;r3?ivde+Q9DtHSwrr z>!kO@$HirC5g9`_x7**go0yuSaAh4UwCW%8BN4Bb=d5^wg^gzbI9N7bXk}|FATN){ zda(5V=Y-2p7ZCV^OEaWN$~_zgy-AuBr(&nnZQ}}NW-$G0?;LhpJmuXCHFjP1J9kdP zpZUZ0@4n}r66QVGA@dcFYTeDq67w^PX14wqT`u+R&_H0HD zDHWAj!8c>oEB6v}IW<4OZ)aD$9a16XPl(q~Oz)1$vUSDoSJs>nC@mVL4i6KJsf39- zva|*E0j8mzIpj8%#oYD*@btTT8ES|?G<$tmhfgA55U+!pZC+b)AcD6*jfNtI?9MN-~>+S ziEly29|fF_$KV26DZQ*;ZMf1C)-AW^?z)tH>`_68=P;3Z*GF;$63JQBW(F6xiiW*v zC64xuS5H2W74qEW6%`e2FSavoZe&dQ5oU^3iJi0ab-;ey&Wk#5SCasxBK&#cut0b3 z{Dz|V4h{f4VLCdx_A+OiLC&q6+wr2*68p>8ZkzMZ;6f%D)dwLif^Hj}hxP)K4QIvr zDcG#|BqSuf=A8ua=CuG$9HQ7C^4Sd0U3o=lKh+|6>lPtYfet8As_81Y(2^1Ide9p8 zOxSVu-K|$wW`3j)>AC&BppYO=52#DJ%xS@P^b2mLewE%5=Qd_}v)^XC-=?bm$??;+ zV|B+JpoqgA?aebKkqf1J7Nzf1(q6o`xeyHK1{Kn$Wo06j`>XPiOKX!+`VAKoJbXJl zRiSnU$ES|g28@5>tg3^KZnwMs5C;#>2v)w}qX_~)3pfG-Ma*H!IeKE{dy8d)uB+!g zJUl*`cU`G#Y%~U1Alm@jgZl0V1xW`7UOkslTm(MVvvq1d-~ZNL>S$3RyACJU`^gZS zMIqV;E(fIC81Ez#WA z^ui7Z_>IoY1V&y|Oadwu&1dm?(eVV__D8n1)p0`hT$a6D4zr!dQEM4|D!|1>%HXw~ z7`XJL5&(9x^U{zGwv^0=Uo(r^GOBpgWyChHvIsXqf`U#FddbAN(++tb9jHT(P8j+9 z`?8CR3jwq>(#7E_P7Em!)b%mbmS`r`96ep7E3e#&CfHqQ^`Nx_Qy|Ex-2I6D1~|)c zCMKpYa5fveW;U*+cH<4qjSrjPfS*8jIu5YiHzOm1l!Agqr_$rsh)d<+u0^6+mXdZw)Xa?F*DZR-@JNt!DGGSx>VQ4d$`c%6M*&BaQ8VuW0%Ps(B>kj@ z1*C;yhk=UwLyI6ddGe%hSXdYr5S-EG$ct{CKYsjp0?3gF@WU}o#a4J^WV!vu0Jgw|!@iU*;5&B9Ba(6Ao^N2+H=WPM0$DFMFevDU7+>7HwviEY<<1ms zOPo+-Jw6%vGmC4PGtiw8#2ng0lnZb~pS6;V%+<-Ir7$4H+9ZCN?|@_jZpqu=3T(Rb z36q<&yD>Kov=8HxpU(@sD9L?mv5@`@(ip>^f5Kd5soGy90>*B>Y%MG!W1@|l;BZGq z=0bqQwN)XPWk$EH#So}ok|6N_{Po|htE*##1$^hu9kZVwi0{M+8ZK){9IQtUO=|p6 zFzb%VD7v```}+Elo<41CTeT^^2uxSde(D7J74*<2PjD){($mvXuZFUA?^G=dk}^Nj zmJ{cY5&9p~F0|~>zBcsXHf_H3pw^ayL5Li-goMO%Y92gTuH74eDd^Gt_t+YAX3;+< zBBH%?Ip3F&5zrni0lduh>N3xOG^V~prhdOt6PXILD~B`xA#*~!VplW z>{64 z#?cl({_Uq_xW%6HV9g44So_w-2WC@WLL)4r`)ALd4Gaqt$jAZd0ZKSgL5Au_qa9Kx z2}X`OyyIH#Oq9br?G!vUiDHaVlVF5Gvn-MVTRc^ga7sC;{e1g}-}uURAK0(Y_S~3IP?BW3)-tiMK>X^~y|iNZOw=Ur>C2Pi5coPqO__yV z+$^4Ih?zCDOh|OH?>phy)hIF!k4`e9T4ZL+WaB=3JYv0GPqa3rf=GqnB=3X9Tv zc&tFn3K&UkF~J~#|CeRv^%pNl*)%`nROiXg0Dh$sbITuMcE~j{GJ=(cU7!_`p`OFc z!EthNaq)E}F1n2oH%M{j_jd@LY^p-VbNFPU;tL%2GCk8hG;4VnciyL@jKbb1U4Rue z3L7L%BbRyq;DFok3(g7Zt2kL&1yVO|pl0)Aecb^#Z%a}SJ)ij*xeywEXi`vytG|CI zhKfQ_N$csWRGOnN27n60&xSd5SshmPRH4(S8+A@I)apc1{OixV10}EH;+~83kAHIC zb1dIVpy1AsqRo_;_;#(--9NUwuB+yNkKzONvo z{mc5;2cST)v8-3*NaF{`1Xx++*8@_8{@3b)ox#eQp&>3>-x|v|)zay8+5Y^N&^Lxu zwG8EKI*B)dfld5y)i-ZPk(I6C=`r-3GW4WjzHp(wyY|XGm*cNbM7tkrhJ%Hqsr7Y}_|s&{&racBRauumuc#WlHrzwY#GCoL#;Y9X8=Q-YjQeplBcr66 zID{>x_lVA8Yf1ra_Nk}S9GU2A379ZwyGahZ?1FWO12-UT-vPt87Fx6;Q0bir}drK zL@Ovc7cXASII7qATCQo_s<03xeEm^;-o9OSb~fnIKu&z1zjPci(d-IcHvhBE^ZWZs zcsBZ8M?A8$Hx8OLZ7%=S|G#!tu3GkS-*>FyLoPYwT18uYLZ&9vDOvc}raH2BZ0+oF zS8fCbCGfY^XFI~$Jp~)e@?hnZlhqzR5L>w|O4?qx8!2boe41V`o~fjCKD3h0c@s%v zV;z_7)v!rzE|8j)W@P~%|L5X$N1rSCu36(^JkGZ<^!*uk>i2f_1%09{F`ExVQ7PQA z8+j%}^H!~Ob=*C5ja)tN>(NgQR3yrdyt$Xv@i{9jO=q0h;hXKINmK6_xA9&}cvb6}z0rqv{=VKlX1q<`zWD)c%6@UF zx2@NyK8QTn(J)%5kpc$`7OmSbXL=(AkIhtTc&?Sj=Lgw0HD5e5XP~rrWccZ&;MALK zs;M{me|}yrVIery?QKt(TcumyPG&{gm&^fvhU_Gb=F{NzbdCF_rp6#fq^V`mfbP2j zg55Ysq@@S=C+U2kX#iJwIx=GLx3hw-$r}Ni>^bN>0RYLq{QP+u`eO9e`-Dj82gESD z>##UL4c)BA3Lg(|EU!(xR%EFhTR=cydv9+%Bd78Q?eP1XkxBrrk=P0-Fk0C0W14>( zsPq9+iR~f79UWw#et_IAfQ$xESwUPUM~WaK6n2S;iN&6K{IG`Ksb1L-Z#l^z{v6;> zb$vZ9;K91yT;uTgc}(LCC1dr$ z8u?~q2myn>r_{N}DR>Az6cal;v6%a29h{==R15VJfB!@P?&w5e%K)MUsh=2m5?f2d zjR$*MOa#ZW^{YZD^<1#v{~AH_`s8)sMkn+L2MQU#&<9^DqoS-G#o1iq5aq9JzPX-H z`@TP9EzUZyFtpo`Ts`0t_>kuHx+S*adrZMpNJ)bZYr3m(w&um2PIKaJPsd}|w}u-& zgu0?$)gJZg>goHS=|E=>jx`g48;8}&`jEa zCIeuh27cO6PocA~i;g^+OR`8$DoZU{ufol2s9cEOX6VE_=(&jZ0k}t8(#Mp64h)`a zCMM^Bka+qT>lNEFAypif5-r_z$%Y1-8=%aRojn_he2)eJkm5m-y3=C{Pzyi^P|1?) zh2_!OnZ5#6D8lno?lzY>q%JZuTl_G?vE1K0b|~tCj~&1--5+{LK_3>}&Rz>A#bw@k z={XJGts;WKzxu74=jYF#U%Y&Y^XgVg(G4~c5fYNa+uU=GpjN%SwQ{k7u;E_TDAx7H zFX?w}N9}ZU=pNbIcO**VW7>NjBxHk2G*gd* zk1w6vaV;7^rNh!ai z%VvAEi1Xq*;9z*ueM+%noKouPs({&Sot>wd9a!tmbhSme<`w-fC~=OZ2M0@|Y)lYc zu%+kb!5?adD5jxW;0B(c))swWHeBnT9!;^L{VbHzO_CF*yW5+_{qXd|okpz}xt@Kg z`jnzfreC6av)R8!<=Nk^(c9%AVhiHGEToCEGT0An)o~!Vk z8lBnO46R!14k9=5Uy6I`>%K(sDRpq44b?0`{89#Xi1rqkhd9ggr!t`)%(7E(1_cD* zgDzkTMh&9h)p=Df6NK#LY!XW~u7{nKy><wj-t)~`egnVvQ%Xvlj42|85?>|q(1sh?&znR=TSPcBtFUd~A=;ESsVP`|; z=Pk=YM%!NUJ_-i=D$kc}1!j~BlyK$LJM<=|rm!pD zfdJ53rwpk`cHcOh8E>3=u&@D!-&)a#I43L`m#v%s{#8>D=7hna=dnpY!r^ zO`1<->XuQMw#CbWu6Ez~`o%vmF6Dqj17R1JBC6c~0@|o%Q{n25>+7DKhGs=0VEr74 zQLr8(hGT`^)Aj%1heB&CPW^8(V=Pn_35?AdmMCgPPT%}Dy4bOKH-m3`H#k|)YnxwA z!R0K|0`~Kvg|EFU^%JNf5&Xgh_D(16p|K@-d4qEvHjip)S{IE+!3@D2x{?qw2FGhR z_AuE$UkFh!A_c)D3R+yHmdBZkVFL|KfhWxdIjXy*nR)(>Je4J@Su9UZU$@y@F*`K< zp)aVfkmYh?VMAO@pG}BRM1S05*guw!$`WplZh*;xYvdzu*Z+d&gPXtoG^qblE9gDN zBq!@|&6ZXo??~S;OXu9TW&ZN3)zdztzsKz%vDHNC7>{S69#>PJw?ZX+mFl+kZl4LA z$H_p1dI=J+jl5z95+2q}`z#AF8pXKjzi#+XWuJ$Wg;PCblIZ04{BL(Ev0QBPZu>mV z>=hx#*UEiv7*&nKJq610>HOS(K&F3Ea6;?G`uZAxXt26oiAppa9{2S@Sro7@d;vcK zHo0ZeO1PKK!6;@#Q0WyotC z>(TeF_roV?e}D5dWC;*H8#C@NgRc1wjuhilTr3E`juUh5F7$(}o61Ev|CF_pWBc&- zJSC^!6lELEF@^iP90oQaweuawRAxQdZ@Z4hfE5#^{O~%$8=13+owEiZZocXJJ>%a4 ze#I`E;th9>%PQGAYLh(6toHKWW4hT%gO$3(G8*=c#BSI6ROg#9?PKe(;S-_KwVUy} zEkI)6>X7R+J*Lg8W~sl36M70*v_YUp)HO8BZuIEQMkWBu0kVE~hHrdq3}s6&Z4`l* z&k&xV7w#O{K6Uyuw^=(QXteY|o{>l7wLOYIcnA>yBPi^}_R}X{-nsx)oQ#T!00T-d z!x=(x4?s#gisgWB^LtYfa4P7X+pFI=QTBw8{E7jnsL0jW z01FE&d13R;G%ScC@q#k|6912dw&vy<@K2Qs%xlWRUbA}7-9{>q|FDM~IaC#_$F)%m?aO5P)ilyn6@k>cbeR5eb>il?*2rOJa zP%jg;ZPh>w$keN#0jtp0x@HLO$sZd7VhGi1Z4zNnBMpHk0PRP*Y{gXm!=GI4o0e=^ z`AsuMRq*OD$R72UIdj4tL}migH^q@V0~xes@Iq>8Yq43?GOuZ9P-W|s_=1T7_+r3n zpqQ-ca2Mg=Wk}H(f^S;t`{38-`x*eMktKqzXogyrRD!stE#z*%g9QP81=nk5l5!tz z`100PBh+gYsq-@yw;RJjr)JuA7Ob77St4p!@s`ca%I6*|O6mw7Va5-CQs35A1#Z<8 zq~Y_DY%k~HNaQdFg}LI5Zw)UOrn%=*9;k6jm6w;d=b0)Z-c)+b1T;x#$K7vJ2nY$K z00B8h348~?1Jts5*bu&O(*nJ2zq;iQCh0L3wM#B;ZZr$p6>g4D!)FQ`pHusRI8G1J z@M$4i_pWm>auKr zawgSzW!7n3<`vw!6>j8J2b;8T&mIFM1w1kyYf~wiEEnS7i3lD*K4x)oJ?DTlz^2Af zxq9;-o<=+c(?*yHC?N@SJHQLU6zu4deln;z2E5f^Wvm`S+Lhh89Bj-~ON<|^FGEOV z1U`FK19fjg@#9uUb7M9qjsAa7DGEFc9^Rw7_>FlFNk6yfe zOH4@_#jIa8lH2xHB;efj&>3AdcwP9bSN@<`4lY>x`T5;Gy9d6=CG~7NtwPK6{+@S| z*l??6_0}MC1wMgaQBlzlHzbt6av>hf1p!nU?%|*lT*1T+Guxfj`w-k42lK>ixUyo% z1to*lrrW?PMjEM@+xoSG-3>C3^`rFMj>G?Q2@cDOE#G9jJ1i~!N!|nWmY}`Ix{u!c ztKd>_6czb4;FbKH(S}#&pC2h+qQSpM&c`XcP^6X}j(Xy?LwvGh)u1U6vAeW3H$Rq3 zeyo*6anLi#b0pqTHvjd-lYGm#lGwo4d?zF{8V7pVdUGIz26q>@lniVdTfo9Cu>y)c zO8~p&AlZfPEF5_))KQ=aGEPo~*b0gRreUnQ-vB&$qJ znCMzU$n31R2LUvO3fbkIuoR_Bw$rWjU;rm;6_}=G17SazqVf#9{x1-c0Y|SMI)Ot} z?ZfH!j&t3m<6!z3Lf50>H6ukm2y`7#y=9$aVx1IrdVWEr3TBW=Q%MI6Yjkn36`xFt z>7R;B^#90reR(_#`kcZ(+C34ZaKW<@GT7$;0Di)RGf9(_T;3+7<1W{w|GsEC_8fozzy)f49lS!=h+GeUoQE(2 zl?VI6+jIa@PV>EwL8_^N6%CrSe}fKGD$Bn705xFh(~*!;cOqMV-K}Uj9PFIfB9@ zV4S~Gx&(eL7WloomJq%}{BnJ+hXf#nY=zr~?b48#!Z=Tec#A~<|I{B zLanU-gW7waujg~#+9#K8FP*()~xnX6`EkMfbENYY4x+3d~gS4msLQ7fSZAp+|K;jt6Y(R-e=6ER|`BUV| z7hM`?Y{W;hU++@Y(E%q~k}j3OG}&KtcF%v zy9luk#B$;D?ox6R97CzOxzpgAgL_?(WHQ^Cj@0O8yL*`$xlI?}z%H+BA1p>LHDquo zXKA4o!Nnb<3G!X)8IZMrNIP83vLUEzg2jC%q(!`-rXlEw*1ercT} z)Gw~Szx(#tQ->`sm&8s00@A<8H)vME z-rXlAdT~`QMU}BPCn+mHvK}`3Ls>mvIk@ycK3}!ZwVl!%s0@D+mQ-g2O%s;r?;S$unA7;Df+S8jCkDQdRGKsPqe{Hm%Vg zjZ3DUg@=cd$aKEGswk4%PD{Nr9e_@z@!$W*%*sP4KRsVxA<`BU*0-VILHhS6;!*z= z(x@B}JazWH@mRifnr>S^ylIR903=_=Gj60|PW|oTmm4`-|LM4CEBAMwpX}|9=DE9< z#eMxzEI4hl2W-(ntRDyC_@(s=NNV#p%l`{AR;RINKPQI2mTY{a?%^PtRr;z$xUvGY z2RSBN3M&p47CdflZl#Pal)@Mr8yi_%%YNT!X-M8Z320nQkCG z10RuzgOb${YJU##?la#kqLJW9#q;0<_#WzGIlAp&n)pF&L*75kul$?YrEi%dEhEz% z6&@Z;P82%cQS0zLt{2biaeU#~h%WGkez_4ig_vG5F#y<)TC&RByQ6<0WCYDNn!kRP zQc*djdWBr|%B%N1${Ae|M&CpJ>EBNdw;tU~Q89$n5z1plL_`pNPu4)-xbk3A8=}r6 z5UKP9LJAON87NG$&2XjMI2iD_Tdc2c4SEN^Jty4{W*T^o+`D}cuTKM0wKYyCS>3^N zrJj-$r)J(RI5FhzKa^-rRa+uoA2?Nzgs&wkMHjRwl?hql7Im5PwI)b}fjM&XP>8po zbMG_n|80@QKVDk={w=h)KLYq@FhPbmh=O6}iOcr!$Q z$XD?qE>7o)eF$4}{stz^_R{hO%9mx?&hojhaP|H zJcPA8Pq`1~+7~GG(2yZfENN+(spky{#HzpWcY&+ByD`ik`0Me290;f$Z+U(_4RWWD zZX*umgyARXwNg;vN5{r|A>2O(0~zfL4A4OvLg|A6*238`L+l2GM2ruhBZ%Y76k-_w zNH_cS`2sXX6or$ye*GLI!i)5wi|(vW&iqUzxdQSt4CZu>6rVbE3S|Y6qX&3H12Vjc z;?9c$k^tWR9u2P-Qpr3XO#qybz(8Y=*1UtmR!g$N8GIPU1_v@{fgygV=!K|T6{ z5~iTM%xofXib2tI5Nx2a%}!l7`jr4`?{j()ihCbbAH$T6u)~ZG(&aaohN~DL=L6y= zYA?W&Q8NYpUO%!2UeI1-{OgbsW%qb;hK@lpr3@%`GFKapy+5(D*IX6txJjA0eUV~V zUm}S7sBSE;%B#lzeOdjg8=CKcxD*83QZ3|f-THzgCYUI}U?BR1I4uY@V?fHKfQ18m zM_2TQ+iegg2m79&VJ_(H8ZZ-3Qwat%#K+*Gi!6g>V+_uf%Uo6w%J^Wa!5Ku}2%3|D zwg;iZ_luNs$TIwcd8GqRj-qUMvE4W#>})Uz1TdIg)dabMK$2>~`hj6pNqAj7F!x;N zB|Q{YMFC5=Hx7GzG{n1GOJR`XrW3S9aG(K#n+Qu(j3ccWZgnl3-3kPi$KY_I#oP<6 zy&-6YS~yCM!{r3u2!#Z*4LVy-K}$8P zs1=BG8bE9^N&jw&N}^G{DT4>B4{p~IC0P6r+)C^}3ndoiyO7F(g85mE%IT`h8yoBn z)DeINtwn@|Xq8b^ka%U^c-Zz2_k}R^1T_PA8 z)By0pN3MM&sz3Gi=FWvhhg_Y|4KytUb3JmPcVP@*b-5gD^f+2Dz-kAG{uq%S*rL|f z*4yx+^9fjF5MqVkJ2e7&Xnqf-CeVONgx(&YFeLav4BAnEj7r=?@T{nd&-3RebgMvR zi4kp;INJ9EKbc8TP@|_Cw1Wz%S;#s*hH-)Y{lh8)%g!`1Q8BR<=#w*jfa6A|rats< zZftakL_Rv$bv$ualnOPYva+(pM_0L*j-Yuqeg7^Cq{h(-Vw%9|3WhW=@4#UyJ<8T9 zfb4ll09t=q=KNDKi(YCT3Z^TPQ{w=cM$~4{y`M07Ganfj`B*zWOsT)N@na6`BpVxLj;Tg8@&N{cL}^D^P(I zBhc~);ICyNcFP500Tn&`>M-1zl$_jAqGdDa!_f3H=YD=NlpX*S4US!xt}hVK3+FFhq!e<> zg7F)qS`2%v5eqxb6JP{Awm<1H*iYpGX}AO?X(*kLFN`l>+Jb6f&ZBuO<^uRQo{D$# zxGp{-QHeJ(T77;tZFK1&$n|dxu~hJiMFh1A5;S15$^k7!TWFATPYakwJ*eI7sfrBH zMqm!3pk2Sd%;C2$2)@Z6%z+k<#K9r`pG1TN1ZZjl3StM)8c?Vpzg?hI1)k}jkT^t3 zfuw!19hCw(fO1FP!@z(MW-dA^J>3O`g^?Z*9v<%UJ0)raa5y|GZ1qDhQQIm<+HbuQ z4ZW)WA*(7gcWy($M^XS%?0_1H*=IopPS1aitN#G%I4g7p0ujcr2QycQaW<+27uz8Y9_%6*H5+=$>X>p(m} zLcjQh*MVs-Z{BXLi%TzC;q|Y_2O4muyg1%cZtwg$3`9y*mEVVnH0VTWnt31Im*Krt zEcbKlIY~QcGtZ$hrFX~VW5Qoy9G?6v&yPg~3@6V|KDzQ(AaVLetGyZ*hlohOStTH1 zP@$0M-NGlmccLKnr<$!ch|)-?8Y*|q6@B=t_dfz+LHDMD&IyH<(1DQrRH10mWRZ_u z%Upfx^LtUJjOTRnoI+pmfn_2GjWs~Pyol9-r7o{rK6k)33Rd8)fS2&6Z?0r-GhX$# zxc2o0iymKlegwl)k|4k8M+YAy5boTd6i4#k-$}+N8I-xkZh|t7j3*qdx?hc;mZyEtNX0A$^A(& zR`HLy+l+IDfBlQFV#HOhy{fWs5OOc`l+~tQ2`2f>p|@{yAA}((7}AERt#c5?Is=^$ zd{~q<*NiyD!!=js4MA;^NYhP&70G&E(`%WQkSd54vS&f?5U>wy&px*s=)+}ixy6P4 zy6b#SKt1F#kNdlzoLGQ@DQAdCSxaF68O^?+P!E!UtVH2ln3Iw&h}~%%NUKoF;A0a{ z>s>jO>2dO`Xdqhru*_f!_d<>$Q5@(X!HE-3py&dH_5)-vvkATxF`#y&%OQ0Jo-~k& zb6pV*;{4FhmpU!ap8LyX)x3-u)bvowHO7kg*MR#G^ja>649m#Mj)HWCyb{o`n=L-t>`9;Pj*Vd9exY66-qhtvreS6JYFvcKl0 zm;_!S3CfM-Y9Aa*{pA&9Vg8(8KSqLR(LDSsd!M%7jWx=DTK)Yi?;?!-JajmMabA?Z zf;15pMlDn0F};YB0c@FQQP-nvcggm_{S*JUrZxmxG7r z?$$80Q-GH&d$IC+iN=e$`3y?8Qd}=m<>lpNUA=R8wJjzNLM-P51SlbZR=A;bq7GS}d=vNrP)NIysrr zgS=4`%7w#PjB?9;uQor`Kt0<7hBZp=*7)K=h6gGm3zTd-z;8%WhHAY%5vj=Kv2BZK zKlpJ7PzObpP#zt2AeJcW1K@Bljf<8Zh`-|y0b#PN?|P!1A9KtNCp5mk6_ z5D+QwArR(KYUK_#$hpcYHs{|Nms_9?`rB5|}sf*v9O$b%WWEVMtAI_-e^0vfO3Slu(UH=*aRhh}w{DM7;Xk7*3)DufaN z)SwJESYdUL{;>m(52nr0MaRSshO^?u%+3`#(Uz4lEJu2XgZJ zw%J65?<`WqqP?(oZWG{;%tg`|3fhGD`9J;$U}z6A)ICScYk1cB$j{P$Dvkcr?p3*!>w#X`QDVuc+ZoS)kMnW{TT2rroa{@*U{ zS9Ec?0W_qk5+Xs3yh3-qTL=b#<}dt-0=1|@Rue+D=lJ>6iVQSh0-m3r0v2lFOfMWb zawgvXaEE!%L_(O~zg|QkxzssaAAG6jLx^V1xs6y|E{>&byAkgwGIA5Mnopbf_sVhr zE|wmtT{^S8vLfl>QLdNCNZ?O#X3BdBLJPG}0c;^8VFH5$Ao@y5N|qkbgvc#XVQe?& zHFc`I=oc4v6&=5S{rUxblJ<}HSdseB}Xgrw;`v(r0*LpxBrw#TP88!7Y zATG>IOp-;R=Q%j;W{JNQM!G;nf}~{nq6(MvIJd*vG2{Nw(9n7} z8qL||W1^!=|D4Uy`F%v>IkJ<`+qrOH8!VnP(;zB`i><29Nj>${Lx{Tr`O{6eofQRZPtXNW52rveb1QsStoU14L|Gx0GzJBIcpwyxB zR_j%6lsl)ra~j@7_@*zz4m)E?erk#B3v}4btwU^V z>|Dq#p{Gf~9w{yJt=M1vh7ilq;Q>t1+a2z^qQ}Sp%oNxW8@-_MVQb|xl^(^p3;#$x zwDy&3&KT0XZWY42Zi@drkl?XY4EQo}Qg)Bx1WKl9IRA>|eu7ItW@$&O2Nz(nYT`!O zcGk#+J0Cb|Xn=wv`x!)Bu%AaZdi25l69j;hJSPH>hfdUm6cl_}Ev+|;{N*rmQw@jC zZBUI7_1rxJ;_vk+4&9N-Nn8j*0ooDu*d|2}kAPK-;4r#WD6`>uT{RgOEi(6zTvf@UtGC z4j}8i^>H6PdJF0%jVA+0UZ9|JLx41sHf%G>$au*c#_QeYeDaqv;GQG3TyGejMlrMD z4!R2xswjmwi8#xB08snoSeZdre>PaiVlnk5-6QIATW_11vQ?ke!obY~A>M%h;@%WI zS{OZ0ZHXzx=g4m3C_DAS%6W}t3(hurEA0WIgb@|n_z$DS90hcAz8Qn|w!G|6xbY&8 zaFm*q`fHUnvv+K+r%I@P-2co>CKYDg{FpzhJ-E-b)yQ1h>XE*ZRfrHzK~+Adl)$Sc-)jFFqyI3Rn8(|* zIDES%u1U;x%i#-p*Y+pvI{(>9f^s^O!j66 zGx?_GfZ2b_hp0SSXw5ob*Kz>wHVdfZtc~YyyU1!mf|%53+wT_P{JPnuWbuVDJ%O00KW68eTCJA~t`L0^s@%OtX2%6*NlAsM6F8-l!{o zn46~3MSMEBv?j$DJ0gk?t^rcAE@E<>Bkvlaa50qI z?6Vln@@(1H&!Ye5!sc1Ox2NtU)biKNbh^Fja>l>HhJQ?vz$~ahj#$HI*GA=nQW55) z(l05#enaji*}qr-?dm+?z@8ey1sWXqHB>|(GS~7jVL5#&h=e8oabB<=$XQ3VWd>-t z>G>H)N;Y`{UysERL&!Y9g8|C@u6LkG?f*MOZkjgyJtK^pQ<$P_Ulc-TRN|FGEqr7L zK_Wdalx%2V^@g=`66tC6PI}SzL(je_(JqbDl+|(gTCnJ!@a@cU4peFW97l& z(+sjsl1@&-_P33y#^8=T|AC$y2$Gs zs`d%iQkVR_Z*!u^PiyN*on?iTQ-9?^XvO3EPW2q)-k`YC*rZfnMwwNwH4rMz8(nfhXXeJ|491|c&yv^Z6hPul0BlxNF>S5 zC{mIq$tF9ikUc{o>mkZWLPOa~$liM@38(*P|@7JrAoi}TX&N#=d&%= zsEgU9O>TCgd32+K2iJ`h?oH*R-H0Mv@y5m;9CH^oH#fq1G0l~ed8%%!jO2)$Ms{Asl&=s~YR*Zi2cZd$k30A}cj zMB}q>Jn61c4K{yMQ}cISsM)j|I(VSDH}D+^w_&fRXp);Vb#``?#UBQiXgk>vyc`~F zUn5v`8<*^`QpX$Frnbw^-;;ESGh2B^=Rvys!D?*B$zfYS5PCI#!_Rw7d_8B&}F9IEY{#OrnA9+N}KQ zc;J1r-c;_h%3msneF#CWe~ym~mlAe%7M8?AX?iwNa_27o#x326ww}*!M7yq<%%3|! zx==NFj%jG{$^J;?=gR_Jma*`ABnjm3S6O9X-n5UkukA_Iv?cn+;A+^NtRG=F7#-T~ zyURiy@*!-p;K^(9J3=iXZyWzRHyG*pb4;7#iv141CVO%&(A-I|kc->-s!@7mw)Th* z;n50EH04VWD_mfN`;@F!BU1?<`J2w3t0CWExuZn=_&QchPU_t-3Z_3FY(?a&5do=V z$1J#(XiLrhamkRrBq91pyUMqN05;OslXx zFGBjtveyVGdOKNWJy*p8$=C#u`zz@DKaaNc09}e)Q(`4`_0mi9p}?IF5pssW)7H!- zD_tMydA-U?8L;#JqeECiD(>C!Ya3s~@(nedmp%lFX0)mV8KoHgj!8**pJc)j06E(c z4L9<0<=_nqoHD`}+l79!#gc&&qMdT9Q4{bz8eX6m-RrIY&5!2#KU_Pm9NC}!!-!!b zdGM-8Q}l1N*O=9)_81F!vffHZz0Erlq8}<cNN*oHu25PDnSsD1PgoVM01cW12 z0fDwJ0f5Qvz;4)g$~VZA?MD83H0;ulqybBeK9Ex6$@L$!auIK}#j>|KiZyJBr)4b? zw;4zP6s^;yN;om0nQvR@UrPyxBOq9bl7ouF-M^j1;O;<1kl(a(8VJ~_-qcF}+v0eB zV)WCHyYO5SjeJ{z1rsq-8~)3eT#Z5jiiVg>5}iR~c22V-Zm&m=h&rVBB(Q(-F1bOe zL9??ew?$}OnNl7wzo%wV6r_1X6}GlBr?5}uO^B*hG0K{SzH?gNJgI&2qUr_AODfU1 zo-0DBA!}4Ry2*aIcl|O~S-H<*W^nR_o|W}0sTv-PIaZilB#3F*r%5oD%=lKO7)N3SEvdWiHbMB>~SgV!15Wesv7o5 z-m`lt6>qNQ)Ua?i`OEm%UQyBEd9z*MqQcWUsP@;~rpDI{-o|unY!F0P(zmw1KHY zsYJiAYdB-6?uuWeXXSmh-we(l1rBwu{XUS-mw)*1p|b*xJ?_^I8*UU*?ymUm_$SV6 zmr28&82Mt>UL<#q@OE(U)K+;zhR~T3^vdX2uxzibgY>ZtxCjVRMkYqN)<-)yfqMvP z)Jy-Bf5y6v#Ng9-?Bx&@ zcpzQpB$Fs_8Hkr1=!#7kc*3eh=I0+YcvyW6<(A-OaN?aOkgb94T7wufSRhg=1>O^K zQA4y8tV^H+!8#4~BUEAs7c+c7rv#k}p;iQi46r`Bd>I=HurBkQPu#QTz^w$TB~YAD z@gzAe{Cfl`cD3{I>%{+TI?{c->#fzPP{VbWgcb{>R@2i|Da}lFN-?m%z}2}U6-O;E zc|h?a0?bDM1u(3S;Cgow7CNxlhCs27^*Bx%L~GzoCJUSm9$Vgj;o)lKgRya9SJ)oM*ATb`nbr}@`F@>~^jSXbz2Xjxuegk0H z!-w&p)ihq zxI`GGUq3;=Q9MoWu{}nw>;78A<(q{s6b$Qsd}-~FUGP&wYy*xPH*Ubifn+h2Q&Uq@ z0etpX8HWjR_DE-b7g+SnaoF`r0Wv4p&k*=B?%Gauh;Xl7`FnWr{Hd)H`JRo9O%a{> z`F0+qrSz_c6}v}!);F*>K!jcr*qt$AiRI}O3kz@{L%KH*Ph+7vVo8YZUE3SM?f%Pa4Vo9gXSN>C1|KWWFK|5$-vrJtXkx5lozx8d0xReHm zzdqbU@yIf=0Ev=q3VfM*gmun- zZDv55tnat$D9h9$3-mt(8^H0>^O+D61X2CNya|m2<1S*>rt2LU6;<0ax3DB|EHJDU zBJnhc#NDL8x5nd-@ut2$CMoxI8e~wki7zA*kA3v3!LR#H(-zT{GujK0GN@oxSZ*G+ zvHb1S24u(2r+0TYM2T?c9qsyCrem0<4Y$Y8xpfDf3O5S7h|+r2KlS~X4tDYO!bmVCDLpd@W%(AEPDcmyD$68noW7-TI2E6N0)wbZNRyz2 z^17Q8@0@`uo$r-C`A@60tP@>Gpz1Mpy>bSqECXcH4R5bRSu_fr1J#^eFfu?v(eBYb zkObo08aA}d@wyoDx47f1BA7~fL11^Ms36^7(*Gpkv|0$NWFlt#L~JGYy$9$VCPUz)gz_#v8R3ky!ILzt{}%Wg zz_5D>HH3~_`f6V&`08j3zN=tYl!e1$e)XBj2SZ=${_H*A9S|^rBRVheR`WDx&EKZX zWz~|6sv1|rPYLc5n)o!27(^d{ea=qQs)ZyzJ0VCw8+dm>)a19)cY3vZ*=!*HK*mc> zZo}PITa$%WZN7;-5_cgR8u^suZUzQ`0sfXKR<0YnxZhydiGU2gzu3p`?|{JH>?E{* z*-89R=~Z{4(c+VNh>bx76a~TlXoaU`cqz-($F+se=?6zPmOOLpqs_C{Ge| z+W#+k(%tXZJLuhtMrlJ>?p4gqPq#jKNn@uZhgqIgoB3c

g*$r>t!O)t#tQ{bjOl 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 z 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�%Y5@MSyC#8E-c4W=h3xls!eWGApPoE(_giI^5 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 literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/erc4626-mint.png b/docs/modules/ROOT/images/erc4626-mint.png new file mode 100644 index 0000000000000000000000000000000000000000..f89ab90070952a0409570d00e2fb6e9ea0ed8c0f GIT binary patch literal 112787 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�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 literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/erc4626-rate-linear.png b/docs/modules/ROOT/images/erc4626-rate-linear.png new file mode 100644 index 0000000000000000000000000000000000000000..09e8045e15abf6b96c089d171635693a60aed60b GIT binary patch literal 50813 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
_8yl~6 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

XRhnQ}H08>D;q7lu(1A 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 literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/images/erc4626-rate-loglogext.png b/docs/modules/ROOT/images/erc4626-rate-loglogext.png new file mode 100644 index 0000000000000000000000000000000000000000..127bc7f2fddc37bcfd0863238db2c7874f4e210f GIT binary patch literal 109923 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�S;#YCJ>3E4Gp0$=R%K*`_zT?& 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 NxuSVFSK-!^{{fq-$;AKw literal 0 HcmV?d00001 diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index fd206aacd..084f76d0b 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -13,6 +13,7 @@ ** xref:erc721.adoc[ERC721] ** xref:erc777.adoc[ERC777] ** xref:erc1155.adoc[ERC1155] +** xref:erc4626.adoc[ERC4626] * xref:governance.adoc[Governance] diff --git a/docs/modules/ROOT/pages/erc4626.adoc b/docs/modules/ROOT/pages/erc4626.adoc new file mode 100644 index 000000000..11c13ca95 --- /dev/null +++ b/docs/modules/ROOT/pages/erc4626.adoc @@ -0,0 +1,193 @@ += ERC4626 +:stem: latexmath + +https://eips.ethereum.org/EIPS/eip-4626[ERC4626] is an extension of xref:erc20.adoc[ERC20] that proposes a standard interface for token vaults. This standard interface can be used by widely different contracts (including lending markets, aggregators, and intrinsically interest bearing tokens), which brings a number of subtleties. Navigating these potential issues is essential to implementing a compliant and composable token vault. + +We provide a base implementation of ERC4626 that includes a simple vault. This contract is designed in a way that allows developers to easily re-configure the vault's behavior, with minimal overrides, while staying compliant. In this guide, we will discuss some security considerations that affect ERC4626. We will also discuss common customizations of the vault. + +[[inflation-attack]] +== Security concern: Inflation attack + +=== Visualizing the vault + +In exchange for the assets deposited into an ERC4626 vault, a user receives shares. These shares can later be burned to redeem the corresponding underlying assets. The number of shares a user gets depends on the amount of assets they put in and on the exchange rate of the vault. This exchange rate is defined by the current liquidity held by the vault. + +- If a vault has 100 tokens to back 200 shares, then each share is worth 0.5 assets. +- If a vault has 200 tokens to back 100 shares, then each share is worth 2.0 assets. + +In other words, the exchange rate can be defined as the slope of the line that passes through the origin and the current number of assets and shares in the vault. Deposits and withdrawals move the vault in this line. + +image::erc4626-rate-linear.png[Exchange rates in linear scale] + +When plotted in log-log scale, the rate is defined similarly, but appears differently (because the point (0,0) is infinitely far away). Rates are represented by "diagonal" lines with different offsets. + +image::erc4626-rate-loglog.png[Exchange rates in logarithmic scale] + +In such a reprentation, widely different rates can be clearly visible in the same graph. This wouldn't be the case in linear scale. + +image::erc4626-rate-loglogext.png[More exchange rates in logarithmic scale] + +=== The attack + +When depositing tokens, the number of shares a user gets is rounded down. This rounding takes away value from the user in favor or the vault (i.e. in favor of all the current share holders). This rounding is often negligible because of the amount at stake. If you deposit 1e9 shares worth of tokens, the rounding will have you lose at most 0.0000001% of your deposit. However if you deposit 10 shares worth of tokens, you could lose 10% of your deposit. Even worse, if you deposit <1 share worth of tokens, then you get 0 shares, and you basically made a donation. + +For a given amount of assets, the more shares you receive the safer you are. If you want to limit your losses to at most 1%, you need to receive at least 100 shares. + +image::erc4626-deposit.png[Depositing assets] + +In the figure we can see that for a given deposit of 500 assets, the number of shares we get and the corresponding rounding losses depend on the exchange rate. If the exchange rate is that of the orange curve, we are getting less than a share, so we lose 100% of our deposit. However, if the exchange rate is that of the green curve, we get 5000 shares, which limits our rounding losses to at most 0.02%. + +image::erc4626-mint.png[Minting shares] + +Symmetrically, if we focus on limiting our losses to a maximum of 0.5%, we need to get at least 200 shares. With the green exchange rate that requires just 20 tokens, but with the orange rate that requires 200000 tokens. + +We can clearly see that that the blue and green curves correspond to vaults that are safer than the yellow and orange curves. + +The idea of an inflation attack is that an attacker can donate assets to the vault to move the rate curve to the right, and make the vault unsafe. + +image::erc4626-attack.png[Inflation attack without protection] + +Figure 6 shows how an attacker can manipulate the rate of an empty vault. First the attacker must deposit a small amount of tokens (1 token) and follow up with a donation of 1e5 tokens directly to the vault to move the exchange rate "right". This puts the vault in a state where any deposit smaller than 1e5 would be completely lost to the vault. Given that the attacker is the only share holder (from their donation), the attacker would steal all the tokens deposited. + +An attacker would typically wait for a user to do the first deposit into the vault, and would frontrun that operation with the attack described above. The risk is low, and the size of the "donation" required to manipulate the vault is equivalent to the size of the deposit that is being attacked. + +In math that gives: + +- stem:[a_0] the attacker deposit +- stem:[a_1] the attacker donation +- stem:[u] the user deposit + +[%header,cols=4*] +|=== +| +| Assets +| Shares +| Rate + +| initial +| stem:[0] +| stem:[0] +| - + +| after attacker's deposit +| stem:[a_0] +| stem:[a_0] +| stem:[1] + +| after attacker's donation +| stem:[a_0+a_1] +| stem:[a_0] +| stem:[\frac{a_0}{a_0+a_1}] +|=== + +This means a deposit of stem:[u] will give stem:[\frac{u \times a_0}{a_0 + a_1}] shares. + +For the attacker to dilute that deposit to 0 shares, causing the user to lose all its deposit, it must ensure that + +[stem] +++++ +\frac{u \times a_0}{a_0+a_1} < 1 \iff u < 1 + \frac{a_1}{a_0} +++++ + +Using stem:[a_0 = 1] and stem:[a_1 = u] is enough. So the attacker only needs stem:[u+1] assets to perform a successful attack. + +It is easy to generalize the above results to scenarios where the attacker is going after a smaller fraction of the user's deposit. In order to target stem:[\frac{u}{n}], the user needs to suffer rounding of a similar fraction, which means the user must receive at most stem:[n] shares. This results in: + +[stem] +++++ +\frac{u \times a_0}{a_0+a_1} < n \iff \frac{u}{n} < 1 + \frac{a_1}{a_0} +++++ + +In this scenario, the attack is stem:[n] times less powerful (in how much it is stealing) and costs stem:[n] times less to execute. In both cases, the amount of funds the attacker needs to commit is equivalent to its potential earnings. + +=== Defending with a virtual offset + +The defense we propose consists of two parts: + +- Use an offset between the "precision" of the representation of shares and assets. Said otherwise, we use more decimal places to represent the shares than the underlying token does to represent the assets. +- Include virtual shares and virtual assets in the exchange rate computation. These virtual assets enforce the conversion rate when the vault is empty. + +These two parts work together in enforcing the security of the vault. First, the increased precision corresponds to a high rate, which we saw is safer as it reduces the rounding error when computing the amount of shares. Second, the virtual assets and shares (in addition to simplifying a lot of the computations) capture part of the donation, making it unprofitable for a developer to perform an attack. + + +Following the previous math definitions, we have: + +- stem:[\delta] the vault offset +- stem:[a_0] the attacker deposit +- stem:[a_1] the attacker donation +- stem:[u] the user deposit + +[%header,cols=4*] +|=== +| +| Assets +| Shares +| Rate + +| initial +| stem:[1] +| stem:[10^\delta] +| stem:[10^\delta] + +| after attacker's deposit +| stem:[1+a_0] +| stem:[10^\delta \times (1+a_0)] +| stem:[10^\delta] + +| after attacker's donation +| stem:[1+a_0+a_1] +| stem:[10^\delta \times (1+a_0)] +| stem:[10^\delta \times \frac{1+a_0}{1+a_0+a_1}] +|=== + +One important thing to note is that the attacker only owns a fraction stem:[\frac{a_0}{1 + a_0}] of the shares, so when doing the donation, he will only be able to recover that fraction stem:[\frac{a_1 \times a_0}{1 + a_0}] of the donation. The remaining stem:[\frac{a_1}{1+a_0}] are captured by the vault. + +[stem] +++++ +\mathit{loss} = \frac{a_1}{1+a_0} +++++ + +When the user deposits stem:[u], he receives + +[stem] +++++ +10^\delta \times u \times \frac{1+a_0}{1+a_0+a_1} +++++ + +For the attacker to dilute that deposit to 0 shares, causing the user to lose all its deposit, it must ensure that + +[stem] +++++ +10^\delta \times u \times \frac{1+a_0}{1+a_0+a_1} < 1 +++++ + +[stem] +++++ +\iff 10^\delta \times u < \frac{1+a_0+a_1}{1+a_0} +++++ + +[stem] +++++ +\iff 10^\delta \times u < 1 + \frac{a_1}{1+a_0} +++++ + +[stem] +++++ +\iff 10^\delta \times u \le \mathit{loss} +++++ + +- If the offset is 0, the attacker loss is at least equal to the user's deposit. +- If the offset is greater than 0, the attacker will have to suffer losses that are orders of magnitude bigger than the amount of value that can hypothetically be stolen from the user. + +This shows that even with an offset of 0, the virtual shares and assets make this attack non profitable for the attacker. Bigger offsets increase the security even further by making any attack on the user extremely wasteful. + +The following figure shows how the offset impacts the initial rate and limits the ability of an attacker with limited funds to inflate it effectively. + +image::erc4626-attack-3a.png[Inflation attack without offset=3] +stem:[\delta = 3], stem:[a_0 = 1], stem:[a_1 = 10^5] + +image::erc4626-attack-3b.png[Inflation attack without offset=3 and an attacker deposit that limits its losses] +stem:[\delta = 3], stem:[a_0 = 100], stem:[a_1 = 10^5] + +image::erc4626-attack-6.png[Inflation attack without offset=6] +stem:[\delta = 6], stem:[a_0 = 1], stem:[a_1 = 10^5] diff --git a/test/token/ERC20/extensions/ERC4626.t.sol b/test/token/ERC20/extensions/ERC4626.t.sol index 3d7dd4a3e..03786b271 100644 --- a/test/token/ERC20/extensions/ERC4626.t.sol +++ b/test/token/ERC20/extensions/ERC4626.t.sol @@ -15,22 +15,4 @@ contract ERC4626StdTest is ERC4626Test { _vaultMayBeEmpty = false; _unlimitedAmount = true; } - - // solhint-disable-next-line func-name-mixedcase - function test_RT_mint_withdraw(ERC4626Test.Init memory init, uint256 shares) public override { - // There is an edge case where we currently behave different than the property tests, - // when all assets are lost to negative yield. - - // Sum all initially deposited assets. - int256 initAssets = 0; - for (uint256 i = 0; i < init.share.length; i++) { - vm.assume(init.share[i] <= uint256(type(int256).max - initAssets)); - initAssets += SafeCast.toInt256(init.share[i]); - } - - // Reject tests where the yield loses all assets from the vault. - vm.assume(init.yield > -initAssets); - - super.test_RT_mint_withdraw(init, shares); - } } diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index 5ed2aa132..0c67a2fc7 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -1,34 +1,16 @@ -const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); const ERC4626 = artifacts.require('$ERC4626'); -const ERC4626Decimals = artifacts.require('$ERC4626DecimalsMock'); - -const parseToken = token => new BN(token).mul(new BN('1000000000000')); -const parseShare = share => new BN(share).mul(new BN('1000000000000000000')); +const ERC4626OffsetMock = artifacts.require('$ERC4626OffsetMock'); contract('ERC4626', function (accounts) { const [holder, recipient, spender, other, user1, user2] = accounts; const name = 'My Token'; const symbol = 'MTKN'; - - beforeEach(async function () { - this.token = await ERC20Decimals.new(name, symbol, 12); - this.vault = await ERC4626Decimals.new(name + ' Vault', symbol + 'V', this.token.address, 18); - - await this.token.$_mint(holder, web3.utils.toWei('100')); - await this.token.approve(this.vault.address, constants.MAX_UINT256, { from: holder }); - await this.vault.approve(spender, constants.MAX_UINT256, { from: holder }); - }); - - it('metadata', async function () { - expect(await this.vault.name()).to.be.equal(name + ' Vault'); - expect(await this.vault.symbol()).to.be.equal(symbol + 'V'); - expect(await this.vault.decimals()).to.be.bignumber.equal('18'); - expect(await this.vault.asset()).to.be.equal(this.token.address); - }); + const decimals = web3.utils.toBN(18); it('inherit decimals if from asset', async function () { for (const decimals of [0, 9, 12, 18, 36].map(web3.utils.toBN)) { @@ -38,372 +20,378 @@ contract('ERC4626', function (accounts) { } }); - describe('empty vault: no assets & no shares', function () { - it('status', async function () { - expect(await this.vault.totalAssets()).to.be.bignumber.equal('0'); - }); + for (const offset of [0, 6, 18].map(web3.utils.toBN)) { + const parseToken = token => web3.utils.toBN(10).pow(decimals).muln(token); + const parseShare = share => web3.utils.toBN(10).pow(decimals.add(offset)).muln(share); - it('deposit', async function () { - expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewDeposit(parseToken(1))).to.be.bignumber.equal(parseShare(1)); + const virtualAssets = web3.utils.toBN(1); + const virtualShares = web3.utils.toBN(10).pow(offset); - const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); + describe(`offset: ${offset}`, function () { + beforeEach(async function () { + this.token = await ERC20Decimals.new(name, symbol, decimals); + this.vault = await ERC4626OffsetMock.new(name + ' Vault', symbol + 'V', this.token.address, offset); - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1), + await this.token.$_mint(holder, constants.MAX_INT256); // 50% of maximum + await this.token.approve(this.vault.address, constants.MAX_UINT256, { from: holder }); + await this.vault.approve(spender, constants.MAX_UINT256, { from: holder }); }); - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), + it('metadata', async function () { + expect(await this.vault.name()).to.be.equal(name + ' Vault'); + expect(await this.vault.symbol()).to.be.equal(symbol + 'V'); + expect(await this.vault.decimals()).to.be.bignumber.equal(decimals.add(offset)); + expect(await this.vault.asset()).to.be.equal(this.token.address); + }); + + describe('empty vault: no assets & no shares', function () { + it('status', async function () { + expect(await this.vault.totalAssets()).to.be.bignumber.equal('0'); + }); + + it('deposit', async function () { + expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewDeposit(parseToken(1))).to.be.bignumber.equal(parseShare(1)); + + const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: parseToken(1), + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: parseShare(1), + }); + }); + + it('mint', async function () { + expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewMint(parseShare(1))).to.be.bignumber.equal(parseToken(1)); + + const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: parseToken(1), + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: parseShare(1), + }); + }); + + it('withdraw', async function () { + expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal('0'); + expect(await this.vault.previewWithdraw('0')).to.be.bignumber.equal('0'); + + const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: '0', + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: '0', + }); + }); + + it('redeem', async function () { + expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal('0'); + expect(await this.vault.previewRedeem('0')).to.be.bignumber.equal('0'); + + const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: '0', + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: '0', + }); + }); + }); + + describe('inflation attack: offset price by direct deposit of assets', function () { + beforeEach(async function () { + // Donate 1 token to the vault to offset the price + await this.token.$_mint(this.vault.address, parseToken(1)); + }); + + it('status', async function () { + expect(await this.vault.totalSupply()).to.be.bignumber.equal('0'); + expect(await this.vault.totalAssets()).to.be.bignumber.equal(parseToken(1)); + }); + + /** + * | offset | deposited assets | redeemable assets | + * |--------|----------------------|----------------------| + * | 0 | 1.000000000000000000 | 0. | + * | 6 | 1.000000000000000000 | 0.999999000000000000 | + * | 18 | 1.000000000000000000 | 0.999999999999999999 | + * + * Attack is possible, but made difficult by the offset. For the attack to be successful + * the attacker needs to frontrun a deposit 10**offset times bigger than what the victim + * was trying to deposit + */ + it('deposit', async function () { + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); + + const depositAssets = parseToken(1); + const expectedShares = depositAssets.mul(effectiveShares).div(effectiveAssets); + + expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewDeposit(depositAssets)).to.be.bignumber.equal(expectedShares); + + const { tx } = await this.vault.deposit(depositAssets, recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: depositAssets, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: expectedShares, + }); + }); + + /** + * | offset | deposited assets | redeemable assets | + * |--------|----------------------|----------------------| + * | 0 | 1000000000000000001. | 1000000000000000001. | + * | 6 | 1000000000000000001. | 1000000000000000001. | + * | 18 | 1000000000000000001. | 1000000000000000001. | + * + * Using mint protects against inflation attack, but makes minting shares very expensive. + * The ER20 allowance for the underlying asset is needed to protect the user from (too) + * large deposits. + */ + it('mint', async function () { + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); + + const mintShares = parseShare(1); + const expectedAssets = mintShares.mul(effectiveAssets).div(effectiveShares); + + expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewMint(mintShares)).to.be.bignumber.equal(expectedAssets); + + const { tx } = await this.vault.mint(mintShares, recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: expectedAssets, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: mintShares, + }); + }); + + it('withdraw', async function () { + expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal('0'); + expect(await this.vault.previewWithdraw('0')).to.be.bignumber.equal('0'); + + const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: '0', + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: '0', + }); + }); + + it('redeem', async function () { + expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal('0'); + expect(await this.vault.previewRedeem('0')).to.be.bignumber.equal('0'); + + const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: '0', + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: '0', + }); + }); + }); + + describe('full vault: assets & shares', function () { + beforeEach(async function () { + // Add 1 token of underlying asset and 100 shares to the vault + await this.token.$_mint(this.vault.address, parseToken(1)); + await this.vault.$_mint(holder, parseShare(100)); + }); + + it('status', async function () { + expect(await this.vault.totalSupply()).to.be.bignumber.equal(parseShare(100)); + expect(await this.vault.totalAssets()).to.be.bignumber.equal(parseToken(1)); + }); + + /** + * | offset | deposited assets | redeemable assets | + * |--------|--------------------- |----------------------| + * | 0 | 1.000000000000000000 | 0.999999999999999999 | + * | 6 | 1.000000000000000000 | 0.999999999999999999 | + * | 18 | 1.000000000000000000 | 0.999999999999999999 | + * + * Virtual shares & assets captures part of the value + */ + it('deposit', async function () { + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); + + const depositAssets = parseToken(1); + const expectedShares = depositAssets.mul(effectiveShares).div(effectiveAssets); + + expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewDeposit(depositAssets)).to.be.bignumber.equal(expectedShares); + + const { tx } = await this.vault.deposit(depositAssets, recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: depositAssets, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: expectedShares, + }); + }); + + /** + * | offset | deposited assets | redeemable assets | + * |--------|--------------------- |----------------------| + * | 0 | 0.010000000000000001 | 0.010000000000000000 | + * | 6 | 0.010000000000000001 | 0.010000000000000000 | + * | 18 | 0.010000000000000001 | 0.010000000000000000 | + * + * Virtual shares & assets captures part of the value + */ + it('mint', async function () { + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); + + const mintShares = parseShare(1); + const expectedAssets = mintShares.mul(effectiveAssets).div(effectiveShares).addn(1); // add for the rounding + + expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); + expect(await this.vault.previewMint(mintShares)).to.be.bignumber.equal(expectedAssets); + + const { tx } = await this.vault.mint(mintShares, recipient, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: expectedAssets, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: mintShares, + }); + }); + + it('withdraw', async function () { + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); + + const withdrawAssets = parseToken(1); + const expectedShares = withdrawAssets.mul(effectiveShares).div(effectiveAssets).addn(1); // add for the rounding + + expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal(withdrawAssets); + expect(await this.vault.previewWithdraw(withdrawAssets)).to.be.bignumber.equal(expectedShares); + + const { tx } = await this.vault.withdraw(withdrawAssets, recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: withdrawAssets, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: expectedShares, + }); + }); + + it('withdraw with approval', async function () { + await expectRevert( + this.vault.withdraw(parseToken(1), recipient, holder, { from: other }), + 'ERC20: insufficient allowance', + ); + + await this.vault.withdraw(parseToken(1), recipient, holder, { from: spender }); + }); + + it('redeem', async function () { + expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal(parseShare(100)); + expect(await this.vault.previewRedeem(parseShare(100))).to.be.bignumber.equal(parseToken(1)); + + const { tx } = await this.vault.redeem(parseShare(100), recipient, holder, { from: holder }); + + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: parseToken(1), + }); + + await expectEvent.inTransaction(tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: parseShare(100), + }); + }); + + it('redeem with approval', async function () { + await expectRevert( + this.vault.redeem(parseShare(100), recipient, holder, { from: other }), + 'ERC20: insufficient allowance', + ); + + await this.vault.redeem(parseShare(100), recipient, holder, { from: spender }); + }); }); }); - - it('mint', async function () { - expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewMint(parseShare(1))).to.be.bignumber.equal(parseToken(1)); - - const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), - }); - }); - - it('withdraw', async function () { - expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal('0'); - expect(await this.vault.previewWithdraw('0')).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: '0', - }); - }); - - it('redeem', async function () { - expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal('0'); - expect(await this.vault.previewRedeem('0')).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: '0', - }); - }); - }); - - describe('partially empty vault: assets & no shares', function () { - beforeEach(async function () { - await this.token.$_mint(this.vault.address, parseToken(1)); // 1 token - }); - - it('status', async function () { - expect(await this.vault.totalAssets()).to.be.bignumber.equal(parseToken(1)); - }); - - it('deposit', async function () { - expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewDeposit(parseToken(1))).to.be.bignumber.equal(parseShare(1)); - - const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), - }); - }); - - it('mint', async function () { - expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewMint(parseShare(1))).to.be.bignumber.equal(parseToken(1)); - - const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), - }); - }); - - it('withdraw', async function () { - expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal('0'); - expect(await this.vault.previewWithdraw('0')).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: '0', - }); - }); - - it('redeem', async function () { - expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal('0'); - expect(await this.vault.previewRedeem('0')).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.redeem('0', recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: '0', - }); - }); - }); - - describe('partially empty vault: shares & no assets', function () { - beforeEach(async function () { - await this.vault.$_mint(holder, parseShare(1)); // 1 share - }); - - it('status', async function () { - expect(await this.vault.totalAssets()).to.be.bignumber.equal('0'); - }); - - it('deposit', async function () { - expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal('0'); - - // Can deposit 0 (max deposit) - const { tx } = await this.vault.deposit(0, recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: '0', - }); - - // Cannot deposit more than 0 - await expectRevert.unspecified(this.vault.previewDeposit(parseToken(1))); - await expectRevert( - this.vault.deposit(parseToken(1), recipient, { from: holder }), - 'ERC4626: deposit more than max', - ); - }); - - it('mint', async function () { - expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewMint(parseShare(1))).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), - }); - }); - - it('withdraw', async function () { - expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal('0'); - expect(await this.vault.previewWithdraw('0')).to.be.bignumber.equal('0'); - await expectRevert.unspecified(this.vault.previewWithdraw('1')); - - const { tx } = await this.vault.withdraw('0', recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: '0', - }); - }); - - it('redeem', async function () { - expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal(parseShare(1)); - expect(await this.vault.previewRedeem(parseShare(1))).to.be.bignumber.equal('0'); - - const { tx } = await this.vault.redeem(parseShare(1), recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: '0', - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: parseShare(1), - }); - }); - }); - - describe('full vault: assets & shares', function () { - beforeEach(async function () { - await this.token.$_mint(this.vault.address, parseToken(1)); // 1 tokens - await this.vault.$_mint(holder, parseShare(100)); // 100 share - }); - - it('status', async function () { - expect(await this.vault.totalAssets()).to.be.bignumber.equal(parseToken(1)); - }); - - it('deposit', async function () { - expect(await this.vault.maxDeposit(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewDeposit(parseToken(1))).to.be.bignumber.equal(parseShare(100)); - - const { tx } = await this.vault.deposit(parseToken(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(100), - }); - }); - - it('mint', async function () { - expect(await this.vault.maxMint(holder)).to.be.bignumber.equal(constants.MAX_UINT256); - expect(await this.vault.previewMint(parseShare(1))).to.be.bignumber.equal(parseToken(1).divn(100)); - - const { tx } = await this.vault.mint(parseShare(1), recipient, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: holder, - to: this.vault.address, - value: parseToken(1).divn(100), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: recipient, - value: parseShare(1), - }); - }); - - it('withdraw', async function () { - expect(await this.vault.maxWithdraw(holder)).to.be.bignumber.equal(parseToken(1)); - expect(await this.vault.previewWithdraw(parseToken(1))).to.be.bignumber.equal(parseShare(100)); - - const { tx } = await this.vault.withdraw(parseToken(1), recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: parseShare(100), - }); - }); - - it('withdraw with approval', async function () { - await expectRevert( - this.vault.withdraw(parseToken(1), recipient, holder, { from: other }), - 'ERC20: insufficient allowance', - ); - - await this.vault.withdraw(parseToken(1), recipient, holder, { from: spender }); - }); - - it('redeem', async function () { - expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal(parseShare(100)); - expect(await this.vault.previewRedeem(parseShare(100))).to.be.bignumber.equal(parseToken(1)); - - const { tx } = await this.vault.redeem(parseShare(100), recipient, holder, { from: holder }); - - await expectEvent.inTransaction(tx, this.token, 'Transfer', { - from: this.vault.address, - to: recipient, - value: parseToken(1), - }); - - await expectEvent.inTransaction(tx, this.vault, 'Transfer', { - from: holder, - to: constants.ZERO_ADDRESS, - value: parseShare(100), - }); - }); - - it('redeem with approval', async function () { - await expectRevert( - this.vault.redeem(parseShare(100), recipient, holder, { from: other }), - 'ERC20: insufficient allowance', - ); - - await this.vault.redeem(parseShare(100), recipient, holder, { from: spender }); - }); - }); + } /// Scenario inspired by solmate ERC4626 tests: /// https://github.com/transmissions11/solmate/blob/main/src/test/ERC4626.t.sol @@ -468,8 +456,8 @@ contract('ERC4626', function (accounts) { expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('2000'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('4000'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('3000'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('6000'); + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('2999'); // used to be 3000, but virtual assets/shares captures part of the yield + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('5999'); // used to be 6000, but virtual assets/shares captures part of the yield expect(await this.vault.totalSupply()).to.be.bignumber.equal('6000'); expect(await this.vault.totalAssets()).to.be.bignumber.equal('9000'); @@ -503,7 +491,7 @@ contract('ERC4626', function (accounts) { await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: user2, to: this.vault.address, - value: '3001', + value: '3000', // used to be 3001 }); await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: constants.ZERO_ADDRESS, @@ -513,10 +501,10 @@ contract('ERC4626', function (accounts) { expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('3333'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('6000'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('5000'); + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('4999'); // used to be 5000 expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('9000'); expect(await this.vault.totalSupply()).to.be.bignumber.equal('9333'); - expect(await this.vault.totalAssets()).to.be.bignumber.equal('14001'); + expect(await this.vault.totalAssets()).to.be.bignumber.equal('14000'); // used to be 14001 } // 6. Vault mutates by +3000 tokens @@ -525,10 +513,10 @@ contract('ERC4626', function (accounts) { expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('3333'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('6000'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('6071'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('10929'); + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('6070'); // used to be 6071 + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('10928'); // used to be 10929 expect(await this.vault.totalSupply()).to.be.bignumber.equal('9333'); - expect(await this.vault.totalAssets()).to.be.bignumber.equal('17001'); + expect(await this.vault.totalAssets()).to.be.bignumber.equal('17000'); // used to be 17001 // 7. Alice redeem 1333 shares (2428 assets) { @@ -541,7 +529,7 @@ contract('ERC4626', function (accounts) { await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user1, - value: '2428', + value: '2427', // used to be 2428 }); expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('2000'); @@ -592,7 +580,7 @@ contract('ERC4626', function (accounts) { expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('0'); expect(await this.vault.balanceOf(user2)).to.be.bignumber.equal('4392'); expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('0'); - expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('8001'); + expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('8000'); // used to be 8001 expect(await this.vault.totalSupply()).to.be.bignumber.equal('4392'); expect(await this.vault.totalAssets()).to.be.bignumber.equal('8001'); } @@ -608,7 +596,7 @@ contract('ERC4626', function (accounts) { await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: user2, - value: '8001', + value: '8000', // used to be 8001 }); expect(await this.vault.balanceOf(user1)).to.be.bignumber.equal('0'); @@ -616,7 +604,7 @@ contract('ERC4626', function (accounts) { expect(await this.vault.convertToAssets(await this.vault.balanceOf(user1))).to.be.bignumber.equal('0'); expect(await this.vault.convertToAssets(await this.vault.balanceOf(user2))).to.be.bignumber.equal('0'); expect(await this.vault.totalSupply()).to.be.bignumber.equal('0'); - expect(await this.vault.totalAssets()).to.be.bignumber.equal('0'); + expect(await this.vault.totalAssets()).to.be.bignumber.equal('1'); // used to be 0 } }); }); diff --git a/test/utils/math/Math.t.sol b/test/utils/math/Math.t.sol index 5542baf9d..916136cdd 100644 --- a/test/utils/math/Math.t.sol +++ b/test/utils/math/Math.t.sol @@ -177,7 +177,7 @@ contract MathTest is Test { } // Helpers - function _asRounding(uint8 r) private returns (Math.Rounding) { + function _asRounding(uint8 r) private pure returns (Math.Rounding) { vm.assume(r < uint8(type(Math.Rounding).max)); return Math.Rounding(r); } From 96a2297e15f1a4bbcf470d2d0d6cb9c579c63893 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 17 Feb 2023 10:26:10 +0100 Subject: [PATCH 174/197] Add IERC4906 interface and use in ERC721 (#4012) Co-authored-by: Francisco Giordano --- .changeset/lovely-dragons-appear.md | 5 +++++ .changeset/thirty-swans-exercise.md | 5 +++++ contracts/interfaces/IERC4906.sol | 19 +++++++++++++++++++ .../ERC721/extensions/ERC721URIStorage.sol | 7 ++++++- .../extensions/ERC721URIStorage.test.js | 8 +++++++- 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 .changeset/lovely-dragons-appear.md create mode 100644 .changeset/thirty-swans-exercise.md create mode 100644 contracts/interfaces/IERC4906.sol diff --git a/.changeset/lovely-dragons-appear.md b/.changeset/lovely-dragons-appear.md new file mode 100644 index 000000000..fe538634a --- /dev/null +++ b/.changeset/lovely-dragons-appear.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`IERC4906`: Add an interface for ERC-4906 that is now Final. diff --git a/.changeset/thirty-swans-exercise.md b/.changeset/thirty-swans-exercise.md new file mode 100644 index 000000000..a460271b0 --- /dev/null +++ b/.changeset/thirty-swans-exercise.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`ERC721URIStorage`: Emit ERC-4906 `MetadataUpdate` in `_setTokenURI`. diff --git a/contracts/interfaces/IERC4906.sol b/contracts/interfaces/IERC4906.sol new file mode 100644 index 000000000..c9eaa1296 --- /dev/null +++ b/contracts/interfaces/IERC4906.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "./IERC165.sol"; +import "./IERC721.sol"; + +/// @title EIP-721 Metadata Update Extension +interface IERC4906 is IERC165, IERC721 { + /// @dev This event emits when the metadata of a token is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFT. + event MetadataUpdate(uint256 _tokenId); + + /// @dev This event emits when the metadata of a range of tokens is changed. + /// So that the third-party platforms such as NFT market could + /// timely update the images and related attributes of the NFTs. + event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); +} diff --git a/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/contracts/token/ERC721/extensions/ERC721URIStorage.sol index e83a5ede2..4b919b79e 100644 --- a/contracts/token/ERC721/extensions/ERC721URIStorage.sol +++ b/contracts/token/ERC721/extensions/ERC721URIStorage.sol @@ -4,11 +4,12 @@ pragma solidity ^0.8.0; import "../ERC721.sol"; +import "../../../interfaces/IERC4906.sol"; /** * @dev ERC721 token with storage based token URI management. */ -abstract contract ERC721URIStorage is ERC721 { +abstract contract ERC721URIStorage is IERC4906, ERC721 { using Strings for uint256; // Optional mapping for token URIs @@ -38,6 +39,8 @@ abstract contract ERC721URIStorage is ERC721 { /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * + * Emits {MetadataUpdate}. + * * Requirements: * * - `tokenId` must exist. @@ -45,6 +48,8 @@ abstract contract ERC721URIStorage is ERC721 { function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; + + emit MetadataUpdate(tokenId); } /** diff --git a/test/token/ERC721/extensions/ERC721URIStorage.test.js b/test/token/ERC721/extensions/ERC721URIStorage.test.js index c0274c669..0835505e9 100644 --- a/test/token/ERC721/extensions/ERC721URIStorage.test.js +++ b/test/token/ERC721/extensions/ERC721URIStorage.test.js @@ -1,4 +1,4 @@ -const { BN, expectRevert } = require('@openzeppelin/test-helpers'); +const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); @@ -38,6 +38,12 @@ contract('ERC721URIStorage', function (accounts) { expect(await this.token.tokenURI(firstTokenId)).to.be.equal(sampleUri); }); + it('setting the uri emits an event', async function () { + expectEvent(await this.token.$_setTokenURI(firstTokenId, sampleUri), 'MetadataUpdate', { + _tokenId: firstTokenId, + }); + }); + it('reverts when setting for non existent token id', async function () { await expectRevert( this.token.$_setTokenURI(nonExistentTokenId, sampleUri), From 08d085f2c9cf65552993bc2cf91e7531acb4bc88 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 17 Feb 2023 17:43:23 +0100 Subject: [PATCH 175/197] Fix ERC4906 compliance of ERC721URIStorage (#4055) Co-authored-by: Francisco --- contracts/token/ERC721/extensions/ERC721URIStorage.sol | 7 +++++++ test/token/ERC721/extensions/ERC721URIStorage.test.js | 5 ++++- test/utils/introspection/SupportsInterface.behavior.js | 6 ++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/contracts/token/ERC721/extensions/ERC721URIStorage.sol index 4b919b79e..201b05a81 100644 --- a/contracts/token/ERC721/extensions/ERC721URIStorage.sol +++ b/contracts/token/ERC721/extensions/ERC721URIStorage.sol @@ -15,6 +15,13 @@ abstract contract ERC721URIStorage is IERC4906, ERC721 { // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; + /** + * @dev See {IERC165-supportsInterface} + */ + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { + return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId); + } + /** * @dev See {IERC721Metadata-tokenURI}. */ diff --git a/test/token/ERC721/extensions/ERC721URIStorage.test.js b/test/token/ERC721/extensions/ERC721URIStorage.test.js index 0835505e9..60c80066c 100644 --- a/test/token/ERC721/extensions/ERC721URIStorage.test.js +++ b/test/token/ERC721/extensions/ERC721URIStorage.test.js @@ -1,7 +1,8 @@ const { BN, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); - const { expect } = require('chai'); +const { shouldSupportInterfaces } = require('../../../utils/introspection/SupportsInterface.behavior'); + const ERC721URIStorageMock = artifacts.require('$ERC721URIStorageMock'); contract('ERC721URIStorage', function (accounts) { @@ -17,6 +18,8 @@ contract('ERC721URIStorage', function (accounts) { this.token = await ERC721URIStorageMock.new(name, symbol); }); + shouldSupportInterfaces(['0x49064906']); + describe('token URI', function () { beforeEach(async function () { await this.token.$_mint(owner, firstTokenId); diff --git a/test/utils/introspection/SupportsInterface.behavior.js b/test/utils/introspection/SupportsInterface.behavior.js index ba5aca2fc..02d147884 100644 --- a/test/utils/introspection/SupportsInterface.behavior.js +++ b/test/utils/introspection/SupportsInterface.behavior.js @@ -100,20 +100,22 @@ function shouldSupportInterfaces(interfaces = []) { it('supportsInterface uses less than 30k gas', async function () { for (const k of interfaces) { - const interfaceId = INTERFACE_IDS[k]; + const interfaceId = INTERFACE_IDS[k] ?? k; expect(await this.contractUnderTest.supportsInterface.estimateGas(interfaceId)).to.be.lte(30000); } }); it('all interfaces are reported as supported', async function () { for (const k of interfaces) { - const interfaceId = INTERFACE_IDS[k]; + const interfaceId = INTERFACE_IDS[k] ?? k; expect(await this.contractUnderTest.supportsInterface(interfaceId)).to.equal(true); } }); it('all interface functions are in ABI', async function () { for (const k of interfaces) { + // skip interfaces for which we don't have a function list + if (INTERFACES[k] === undefined) continue; for (const fnName of INTERFACES[k]) { const fnSig = FN_SIGNATURES[fnName]; expect(this.contractUnderTest.abi.filter(fn => fn.signature === fnSig).length).to.equal(1); From 7ac4349710d3b242dd3ceea3200f1298f1c3d2b3 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Fri, 17 Feb 2023 21:55:42 -0300 Subject: [PATCH 176/197] Delete no longer needed .gitattributes file --- .gitattributes | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 52031de51..000000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.sol linguist-language=Solidity From 815bfbf38395e0c836d09745ba69ae52844e3d8c Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 21 Feb 2023 15:18:50 +0100 Subject: [PATCH 177/197] Deprecate the timers library (#4062) Co-authored-by: Francisco --- CHANGELOG.md | 1 + contracts/utils/Timers.sol | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd279d53..8ad77fe68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Deprecations - `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) +- `Timers`: The `Timers` library is now deprecated and will be removed in the next major release. ([#4062](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4062)) ## 4.8.1 (2023-01-12) diff --git a/contracts/utils/Timers.sol b/contracts/utils/Timers.sol index 4bc86f202..1c92b029b 100644 --- a/contracts/utils/Timers.sol +++ b/contracts/utils/Timers.sol @@ -5,6 +5,8 @@ pragma solidity ^0.8.0; /** * @dev Tooling for timepoints, timers and delays + * + * CAUTION: This file is deprecated as of 4.9 and will be removed in the next major release. */ library Timers { struct Timestamp { From 1e245aa54bd4bd0cccdb63524b45010ce043f114 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Tue, 21 Feb 2023 17:16:44 +0200 Subject: [PATCH 178/197] Add `isValidERC1271SignatureNow` to SignatureChecker library (#3932) Co-authored-by: Hadrien Croubois Co-authored-by: Francisco --- .changeset/slimy-knives-hug.md | 5 ++ .../utils/cryptography/SignatureChecker.sol | 19 ++++- .../cryptography/SignatureChecker.test.js | 76 ++++++++++--------- 3 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 .changeset/slimy-knives-hug.md diff --git a/.changeset/slimy-knives-hug.md b/.changeset/slimy-knives-hug.md new file mode 100644 index 000000000..94099eea7 --- /dev/null +++ b/.changeset/slimy-knives-hug.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`SignatureChecker`: Add `isValidERC1271SignatureNow` for checking a signature directly against a smart contract using ERC-1271. diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index e06778deb..c3a724dd0 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -23,10 +23,23 @@ library SignatureChecker { */ function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); - if (error == ECDSA.RecoverError.NoError && recovered == signer) { - return true; - } + return + (error == ECDSA.RecoverError.NoError && recovered == signer) || + isValidERC1271SignatureNow(signer, hash, signature); + } + /** + * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated + * against the signer smart contract using ERC1271. + * + * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus + * change through time. It could return true at block N and false at block N+1 (or the opposite). + */ + function isValidERC1271SignatureNow( + address signer, + bytes32 hash, + bytes memory signature + ) internal view returns (bool) { (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); diff --git a/test/utils/cryptography/SignatureChecker.test.js b/test/utils/cryptography/SignatureChecker.test.js index 11054c3e1..ba8b100d1 100644 --- a/test/utils/cryptography/SignatureChecker.test.js +++ b/test/utils/cryptography/SignatureChecker.test.js @@ -40,44 +40,48 @@ contract('SignatureChecker (ERC1271)', function (accounts) { }); context('ERC1271 wallet', function () { - it('with matching signer and signature', async function () { - expect( - await this.signaturechecker.$isValidSignatureNow( - this.wallet.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - ), - ).to.equal(true); - }); + for (const signature of ['isValidERC1271SignatureNow', 'isValidSignatureNow']) { + context(signature, function () { + it('with matching signer and signature', async function () { + expect( + await this.signaturechecker[`$${signature}`]( + this.wallet.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(true); + }); - it('with invalid signer', async function () { - expect( - await this.signaturechecker.$isValidSignatureNow( - this.signaturechecker.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - ), - ).to.equal(false); - }); + it('with invalid signer', async function () { + expect( + await this.signaturechecker[`$${signature}`]( + this.signaturechecker.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(false); + }); - it('with invalid signature', async function () { - expect( - await this.signaturechecker.$isValidSignatureNow( - this.wallet.address, - toEthSignedMessageHash(WRONG_MESSAGE), - this.signature, - ), - ).to.equal(false); - }); + it('with invalid signature', async function () { + expect( + await this.signaturechecker[`$${signature}`]( + this.wallet.address, + toEthSignedMessageHash(WRONG_MESSAGE), + this.signature, + ), + ).to.equal(false); + }); - it('with malicious wallet', async function () { - expect( - await this.signaturechecker.$isValidSignatureNow( - this.malicious.address, - toEthSignedMessageHash(TEST_MESSAGE), - this.signature, - ), - ).to.equal(false); - }); + it('with malicious wallet', async function () { + expect( + await this.signaturechecker[`$${signature}`]( + this.malicious.address, + toEthSignedMessageHash(TEST_MESSAGE), + this.signature, + ), + ).to.equal(false); + }); + }); + } }); }); From df814dd374519a9388a617f500019d61bc239382 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 19:26:14 -0300 Subject: [PATCH 179/197] Update crytic/slither-action action to v0.3.0 (#4064) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 8bb32dcc3..c37bf935b 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -82,7 +82,7 @@ jobs: - name: Set up environment uses: ./.github/actions/setup - run: rm foundry.toml - - uses: crytic/slither-action@v0.2.0 + - uses: crytic/slither-action@v0.3.0 codespell: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' From 227473e88ce756afe41193b7d2407fdc01d7e784 Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Tue, 21 Feb 2023 23:27:34 +0100 Subject: [PATCH 180/197] Fix comment in `ERC4626` on decimals default (#4060) Co-authored-by: Hadrien Croubois --- contracts/token/ERC20/extensions/ERC4626.sol | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/contracts/token/ERC20/extensions/ERC4626.sol b/contracts/token/ERC20/extensions/ERC4626.sol index 16656bd4f..3846cbbbb 100644 --- a/contracts/token/ERC20/extensions/ERC4626.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -79,9 +79,10 @@ abstract contract ERC4626 is ERC20, IERC4626 { } /** - * @dev Decimals are read from the underlying asset in the constructor and cached. If this fails (e.g., the asset - * has not been created yet), the cached value is set to a default obtained by `super.decimals()` (which depends on - * inheritance but is most likely 18). Override this function in order to set a guaranteed hardcoded value. + * @dev Decimals are computed by adding the decimal offset on top of the underlying asset's decimals. This + * "original" value is cached during construction of the vault contract. If this read operation fails (e.g., the + * asset has not been created yet), a default of 18 is used to represent the underlying asset's decimals. + * * See {IERC20Metadata-decimals}. */ function decimals() public view virtual override(IERC20Metadata, ERC20) returns (uint8) { @@ -194,9 +195,6 @@ abstract contract ERC4626 is ERC20, IERC4626 { /** * @dev Internal conversion function (from assets to shares) with support for rounding direction. - * - * Will revert if assets > 0, totalSupply > 0 and totalAssets = 0. That corresponds to a case where any asset - * would represent an infinite amount of shares. */ function _convertToShares(uint256 assets, Math.Rounding rounding) internal view virtual returns (uint256) { return assets.mulDiv(totalSupply() + 10 ** _decimalsOffset(), totalAssets() + 1, rounding); @@ -213,7 +211,7 @@ abstract contract ERC4626 is ERC20, IERC4626 { * @dev Deposit/mint common workflow. */ function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual { - // If _asset is ERC777, `transferFrom` can trigger a reenterancy BEFORE the transfer happens through the + // If _asset is ERC777, `transferFrom` can trigger a reentrancy BEFORE the transfer happens through the // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer, // calls the vault, which is assumed not malicious. // From adb861fb3bb4b4167f10307b8d091326115502f9 Mon Sep 17 00:00:00 2001 From: Francisco Date: Wed, 22 Feb 2023 06:00:41 -0300 Subject: [PATCH 181/197] Change Governor.cancel to receive all parameters (#4056) --- contracts/governance/Governor.sol | 20 +++-- contracts/governance/IGovernor.sol | 11 ++- .../GovernorCompatibilityBravo.sol | 77 +++++++++++++++---- .../GovernorCompatibilityBravoMock.sol | 9 ++- contracts/mocks/wizard/MyGovernor3.sol | 9 ++- test/helpers/governance.js | 8 +- 6 files changed, 99 insertions(+), 35 deletions(-) diff --git a/contracts/governance/Governor.sol b/contracts/governance/Governor.sol index e3691a3ed..1483da6d2 100644 --- a/contracts/governance/Governor.sol +++ b/contracts/governance/Governor.sol @@ -336,10 +336,16 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive /** * @dev See {IGovernor-cancel}. */ - function cancel(uint256 proposalId) public virtual override { + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) public virtual override returns (uint256) { + uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); require(state(proposalId) == ProposalState.Pending, "Governor: too late to cancel"); require(_msgSender() == _proposals[proposalId].proposer, "Governor: only proposer can cancel"); - _cancel(proposalId); + return _cancel(targets, values, calldatas, descriptionHash); } /** @@ -407,16 +413,8 @@ abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receive bytes[] memory calldatas, bytes32 descriptionHash ) internal virtual returns (uint256) { - return _cancel(hashProposal(targets, values, calldatas, descriptionHash)); - } + uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - /** - * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as - * canceled to allow distinguishing it from executed proposals. - * - * Emits a {IGovernor-ProposalCanceled} event. - */ - function _cancel(uint256 proposalId) internal virtual returns (uint256) { ProposalState status = state(proposalId); require( diff --git a/contracts/governance/IGovernor.sol b/contracts/governance/IGovernor.sol index b12d2f632..70f81efe8 100644 --- a/contracts/governance/IGovernor.sol +++ b/contracts/governance/IGovernor.sol @@ -235,12 +235,17 @@ abstract contract IGovernor is IERC165, IERC6372 { ) public payable virtual returns (uint256 proposalId); /** - * @dev Cancel a proposal. This is restricted to Pending proposal (before the vote starts) and is restricted to - * the proposal's proposer. + * @dev Cancel a proposal. A proposal is cancellable by the proposer, but only while it is Pending state, i.e. + * before the vote starts. * * Emits a {ProposalCanceled} event. */ - function cancel(uint256 proposalId) public virtual; + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) public virtual returns (uint256 proposalId); /** * @dev Cast a vote diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 1b8c09368..39c895bf0 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -77,29 +77,55 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp * @dev See {IGovernorCompatibilityBravo-queue}. */ function queue(uint256 proposalId) public virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - queue( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); + ( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) = _getProposalParameters(proposalId); + + queue(targets, values, calldatas, descriptionHash); } /** * @dev See {IGovernorCompatibilityBravo-execute}. */ function execute(uint256 proposalId) public payable virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - execute( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); + ( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) = _getProposalParameters(proposalId); + + execute(targets, values, calldatas, descriptionHash); } - function cancel(uint256 proposalId) public virtual override(IGovernor, Governor) { + /** + * @dev Cancel a proposal with GovernorBravo logic. + */ + function cancel(uint256 proposalId) public virtual { + ( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) = _getProposalParameters(proposalId); + + cancel(targets, values, calldatas, descriptionHash); + } + + /** + * @dev Cancel a proposal with GovernorBravo logic. At any moment a proposal can be cancelled, either by the + * proposer, or by third parties if the proposer's voting power has dropped below the proposal threshold. + */ + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) public virtual override(IGovernor, Governor) returns (uint256) { + uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); address proposer = _proposalDetails[proposalId].proposer; require( @@ -107,7 +133,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp "GovernorBravo: proposer above threshold" ); - _cancel(proposalId); + return _cancel(targets, values, calldatas, descriptionHash); } /** @@ -128,6 +154,25 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp return fullcalldatas; } + /** + * @dev Retrieve proposal parameters by id, with fully encoded calldatas. + */ + function _getProposalParameters( + uint256 proposalId + ) + private + view + returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash) + { + ProposalDetails storage details = _proposalDetails[proposalId]; + return ( + details.targets, + details.values, + _encodeCalldata(details.signatures, details.calldatas), + details.descriptionHash + ); + } + /** * @dev Store proposal metadata for later lookup */ diff --git a/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol index 2727794f6..1b87d1433 100644 --- a/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol +++ b/contracts/mocks/governance/GovernorCompatibilityBravoMock.sol @@ -66,8 +66,13 @@ abstract contract GovernorCompatibilityBravoMock is return super.execute(targets, values, calldatas, salt); } - function cancel(uint256 proposalId) public override(Governor, GovernorCompatibilityBravo, IGovernor) { - super.cancel(proposalId); + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) { + return super.cancel(targets, values, calldatas, descriptionHash); } function _execute( diff --git a/contracts/mocks/wizard/MyGovernor3.sol b/contracts/mocks/wizard/MyGovernor3.sol index 4192cae94..f4d295156 100644 --- a/contracts/mocks/wizard/MyGovernor3.sol +++ b/contracts/mocks/wizard/MyGovernor3.sol @@ -54,8 +54,13 @@ contract MyGovernor is return super.propose(targets, values, calldatas, description); } - function cancel(uint256 proposalId) public override(Governor, GovernorCompatibilityBravo, IGovernor) { - super.cancel(proposalId); + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) { + return super.cancel(targets, values, calldatas, descriptionHash); } function _execute( diff --git a/test/helpers/governance.js b/test/helpers/governance.js index 1ffa086cb..4b38b7588 100644 --- a/test/helpers/governance.js +++ b/test/helpers/governance.js @@ -68,7 +68,13 @@ class GovernorHelper { switch (visibility) { case 'external': - return this.governor.methods['cancel(uint256)'](...concatOpts([proposal.id], opts)); + if (proposal.useCompatibilityInterface) { + return this.governor.methods['cancel(uint256)'](...concatOpts([proposal.id], opts)); + } else { + return this.governor.methods['cancel(address[],uint256[],bytes[],bytes32)']( + ...concatOpts(proposal.shortProposal, opts), + ); + } case 'internal': return this.governor.methods['$_cancel(address[],uint256[],bytes[],bytes32)']( ...concatOpts(proposal.shortProposal, opts), From 53235263a377612b546a5c1922e1876689eba525 Mon Sep 17 00:00:00 2001 From: Yamen Merhi Date: Wed, 22 Feb 2023 16:22:50 +0200 Subject: [PATCH 182/197] Implement `0x00` version of EIP-191 in ECDSA Library (#4063) --- .changeset/small-cars-appear.md | 5 +++++ contracts/utils/cryptography/ECDSA.sol | 10 ++++++++++ test/helpers/sign.js | 16 ++++++++++++++++ test/utils/cryptography/ECDSA.test.js | 11 ++++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 .changeset/small-cars-appear.md diff --git a/.changeset/small-cars-appear.md b/.changeset/small-cars-appear.md new file mode 100644 index 000000000..0263bcd18 --- /dev/null +++ b/.changeset/small-cars-appear.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': patch +--- + +`ECDSA`: Add a function `toDataWithIntendedValidatorHash` that encodes data with version 0x00 following EIP-191. diff --git a/contracts/utils/cryptography/ECDSA.sol b/contracts/utils/cryptography/ECDSA.sol index a499b546b..77279eb4f 100644 --- a/contracts/utils/cryptography/ECDSA.sol +++ b/contracts/utils/cryptography/ECDSA.sol @@ -204,4 +204,14 @@ library ECDSA { data := keccak256(ptr, 0x42) } } + + /** + * @dev Returns an Ethereum Signed Data with intended validator, created from a + * `validator` and `data` according to the version 0 of EIP-191. + * + * See {recover}. + */ + function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x00", validator, data)); + } } diff --git a/test/helpers/sign.js b/test/helpers/sign.js index 417ef591d..d537116bb 100644 --- a/test/helpers/sign.js +++ b/test/helpers/sign.js @@ -4,6 +4,21 @@ function toEthSignedMessageHash(messageHex) { return web3.utils.sha3(Buffer.concat([prefix, messageBuffer])); } +/** + * Create a signed data with intended validator according to the version 0 of EIP-191 + * @param validatorAddress The address of the validator + * @param dataHex The data to be concatenated with the prefix and signed + */ +function toDataWithIntendedValidatorHash(validatorAddress, dataHex) { + const validatorBuffer = Buffer.from(web3.utils.hexToBytes(validatorAddress)); + const dataBuffer = Buffer.from(web3.utils.hexToBytes(dataHex)); + const preambleBuffer = Buffer.from('\x19'); + const versionBuffer = Buffer.from('\x00'); + const ethMessage = Buffer.concat([preambleBuffer, versionBuffer, validatorBuffer, dataBuffer]); + + return web3.utils.sha3(ethMessage); +} + /** * Create a signer between a contract and a signer for a voucher of method, args, and redeemer * Note that `method` is the web3 method, not the truffle-contract method @@ -43,5 +58,6 @@ const getSignFor = module.exports = { toEthSignedMessageHash, + toDataWithIntendedValidatorHash, getSignFor, }; diff --git a/test/utils/cryptography/ECDSA.test.js b/test/utils/cryptography/ECDSA.test.js index 3b19cde60..ae737086b 100644 --- a/test/utils/cryptography/ECDSA.test.js +++ b/test/utils/cryptography/ECDSA.test.js @@ -1,5 +1,5 @@ const { expectRevert } = require('@openzeppelin/test-helpers'); -const { toEthSignedMessageHash } = require('../../helpers/sign'); +const { toEthSignedMessageHash, toDataWithIntendedValidatorHash } = require('../../helpers/sign'); const { expect } = require('chai'); @@ -8,6 +8,7 @@ const ECDSA = artifacts.require('$ECDSA'); const TEST_MESSAGE = web3.utils.sha3('OpenZeppelin'); const WRONG_MESSAGE = web3.utils.sha3('Nope'); const NON_HASH_MESSAGE = '0x' + Buffer.from('abcd').toString('hex'); +const RANDOM_ADDRESS = web3.utils.toChecksumAddress(web3.utils.randomHex(20)); function to2098Format(signature) { const long = web3.utils.hexToBytes(signature); @@ -248,4 +249,12 @@ contract('ECDSA', function (accounts) { ); }); }); + + context('toDataWithIntendedValidatorHash', function () { + it('returns the hash correctly', async function () { + expect( + await this.ecdsa.methods['$toDataWithIntendedValidatorHash(address,bytes)'](RANDOM_ADDRESS, NON_HASH_MESSAGE), + ).to.equal(toDataWithIntendedValidatorHash(RANDOM_ADDRESS, NON_HASH_MESSAGE)); + }); + }); }); From 7b3e7b7055d6e1226d4920ca7d7c446c0c0bfff5 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Wed, 22 Feb 2023 19:23:06 +0100 Subject: [PATCH 183/197] Re-enable ERC4626 property test on empty vaults (#4068) --- test/token/ERC20/extensions/ERC4626.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/token/ERC20/extensions/ERC4626.t.sol b/test/token/ERC20/extensions/ERC4626.t.sol index 03786b271..95514531c 100644 --- a/test/token/ERC20/extensions/ERC4626.t.sol +++ b/test/token/ERC20/extensions/ERC4626.t.sol @@ -12,7 +12,7 @@ contract ERC4626StdTest is ERC4626Test { _underlying_ = address(new ERC20Mock()); _vault_ = address(new ERC4626Mock(_underlying_)); _delta_ = 0; - _vaultMayBeEmpty = false; + _vaultMayBeEmpty = true; _unlimitedAmount = true; } } From 9d06a1b64bcff51349d832222c165b03f9c1f316 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 23 Feb 2023 08:52:10 -0300 Subject: [PATCH 184/197] Remove unused Solhint overrides (#4069) --- contracts/utils/cryptography/EIP712.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/contracts/utils/cryptography/EIP712.sol b/contracts/utils/cryptography/EIP712.sol index d0e52c396..e06d0066b 100644 --- a/contracts/utils/cryptography/EIP712.sol +++ b/contracts/utils/cryptography/EIP712.sol @@ -38,7 +38,6 @@ abstract contract EIP712 is IERC5267 { bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); - /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _cachedDomainSeparator; @@ -53,8 +52,6 @@ abstract contract EIP712 is IERC5267 { bytes32 private immutable _hashedName; bytes32 private immutable _hashedVersion; - /* solhint-enable var-name-mixedcase */ - /** * @dev Initializes the domain separator and parameter caches. * From a6b8366980d8b28cbe4be7f1798719f0fac4cac1 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 23 Feb 2023 21:06:47 +0100 Subject: [PATCH 185/197] Improve ERC4626 event coverage (#4072) --- test/token/ERC20/extensions/ERC4626.test.js | 106 +++++++++++++++++++- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index 0c67a2fc7..2f7b99d38 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -66,6 +66,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: parseShare(1), }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: parseToken(1), + shares: parseShare(1), + }); }); it('mint', async function () { @@ -85,6 +92,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: parseShare(1), }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: parseToken(1), + shares: parseShare(1), + }); }); it('withdraw', async function () { @@ -104,6 +118,14 @@ contract('ERC4626', function (accounts) { to: constants.ZERO_ADDRESS, value: '0', }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: '0', + shares: '0', + }); }); it('redeem', async function () { @@ -123,6 +145,14 @@ contract('ERC4626', function (accounts) { to: constants.ZERO_ADDRESS, value: '0', }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: '0', + shares: '0', + }); }); }); @@ -171,6 +201,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: expectedShares, }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: depositAssets, + shares: expectedShares, + }); }); /** @@ -207,6 +244,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: mintShares, }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: expectedAssets, + shares: mintShares, + }); }); it('withdraw', async function () { @@ -226,6 +270,14 @@ contract('ERC4626', function (accounts) { to: constants.ZERO_ADDRESS, value: '0', }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: '0', + shares: '0', + }); }); it('redeem', async function () { @@ -245,6 +297,14 @@ contract('ERC4626', function (accounts) { to: constants.ZERO_ADDRESS, value: '0', }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: '0', + shares: '0', + }); }); }); @@ -292,6 +352,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: expectedShares, }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: depositAssets, + shares: expectedShares, + }); }); /** @@ -326,6 +393,13 @@ contract('ERC4626', function (accounts) { to: recipient, value: mintShares, }); + + await expectEvent.inTransaction(tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: expectedAssets, + shares: mintShares, + }); }); it('withdraw', async function () { @@ -351,6 +425,14 @@ contract('ERC4626', function (accounts) { to: constants.ZERO_ADDRESS, value: expectedShares, }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: withdrawAssets, + shares: expectedShares, + }); }); it('withdraw with approval', async function () { @@ -363,21 +445,35 @@ contract('ERC4626', function (accounts) { }); it('redeem', async function () { - expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal(parseShare(100)); - expect(await this.vault.previewRedeem(parseShare(100))).to.be.bignumber.equal(parseToken(1)); + const effectiveAssets = await this.vault.totalAssets().then(x => x.add(virtualAssets)); + const effectiveShares = await this.vault.totalSupply().then(x => x.add(virtualShares)); - const { tx } = await this.vault.redeem(parseShare(100), recipient, holder, { from: holder }); + const redeemShares = parseShare(100); + const expectedAssets = redeemShares.mul(effectiveAssets).div(effectiveShares); + + expect(await this.vault.maxRedeem(holder)).to.be.bignumber.equal(redeemShares); + expect(await this.vault.previewRedeem(redeemShares)).to.be.bignumber.equal(expectedAssets); + + const { tx } = await this.vault.redeem(redeemShares, recipient, holder, { from: holder }); await expectEvent.inTransaction(tx, this.token, 'Transfer', { from: this.vault.address, to: recipient, - value: parseToken(1), + value: expectedAssets, }); await expectEvent.inTransaction(tx, this.vault, 'Transfer', { from: holder, to: constants.ZERO_ADDRESS, - value: parseShare(100), + value: redeemShares, + }); + + await expectEvent.inTransaction(tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: expectedAssets, + shares: redeemShares, }); }); From 6e88df28cb45712790c02b7aef7a866a3b9c5512 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 00:06:22 +0100 Subject: [PATCH 186/197] Mark ERC777 and ERC1820 as deprecated (#4066) --- CHANGELOG.md | 2 ++ contracts/token/ERC777/ERC777.sol | 2 ++ contracts/token/ERC777/README.adoc | 2 ++ contracts/utils/introspection/ERC1820Implementer.sol | 2 ++ docs/modules/ROOT/pages/erc777.adoc | 2 ++ 5 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ad77fe68..e882fd516 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ - `ERC20Permit`: Added the file `IERC20Permit.sol` and `ERC20Permit.sol` and deprecated `draft-IERC20Permit.sol` and `draft-ERC20Permit.sol` since [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) is no longer a Draft. Developers are encouraged to update their imports. ([#3793](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3793)) - `Timers`: The `Timers` library is now deprecated and will be removed in the next major release. ([#4062](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4062)) +- `ERC777`: The `ERC777` token standard is no longer supported by OpenZeppelin. Our implementation is now deprecated and will be removed in the next major release. The corresponding standard interfaces remain available. ([#4066](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4066)) +- `ERC1820Implementer`: The `ERC1820` pseudo-introspection mechanism is no longer supported by OpenZeppelin. Our implementation is now deprecated and will be removed in the next major release. The corresponding standard interfaces remain available. ([#4066](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/4066)) ## 4.8.1 (2023-01-12) diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index c1503c4df..0e5af5d08 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -25,6 +25,8 @@ import "../../utils/introspection/IERC1820Registry.sol"; * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there * are no special restrictions in the amount of tokens that created, moved, or * destroyed. This makes integration with ERC20 applications seamless. + * + * CAUTION: This file is deprecated as of v4.9 and will be removed in the next major release. */ contract ERC777 is Context, IERC777, IERC20 { using Address for address; diff --git a/contracts/token/ERC777/README.adoc b/contracts/token/ERC777/README.adoc index 5012a3110..ac326abe6 100644 --- a/contracts/token/ERC777/README.adoc +++ b/contracts/token/ERC777/README.adoc @@ -3,6 +3,8 @@ [.readme-notice] NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc777 +CAUTION: As of v4.9, OpenZeppelin's implementation of ERC-777 is deprecated and will be removed in the next major release. + This set of interfaces and contracts are all related to the https://eips.ethereum.org/EIPS/eip-777[ERC777 token standard]. TIP: For an overview of ERC777 tokens and a walk through on how to create a token contract read our xref:ROOT:erc777.adoc[ERC777 guide]. diff --git a/contracts/utils/introspection/ERC1820Implementer.sol b/contracts/utils/introspection/ERC1820Implementer.sol index ac5a884c0..cf4b50498 100644 --- a/contracts/utils/introspection/ERC1820Implementer.sol +++ b/contracts/utils/introspection/ERC1820Implementer.sol @@ -12,6 +12,8 @@ import "./IERC1820Implementer.sol"; * declare their willingness to be implementers. * {IERC1820Registry-setInterfaceImplementer} should then be called for the * registration to be complete. + * + * CAUTION: This file is deprecated as of v4.9 and will be removed in the next major release. */ contract ERC1820Implementer is IERC1820Implementer { bytes32 private constant _ERC1820_ACCEPT_MAGIC = keccak256("ERC1820_ACCEPT_MAGIC"); diff --git a/docs/modules/ROOT/pages/erc777.adoc b/docs/modules/ROOT/pages/erc777.adoc index d79fbee28..4a0af16c3 100644 --- a/docs/modules/ROOT/pages/erc777.adoc +++ b/docs/modules/ROOT/pages/erc777.adoc @@ -1,5 +1,7 @@ = ERC777 +CAUTION: As of v4.9, OpenZeppelin's implementation of ERC-777 is deprecated and will be removed in the next major release. + Like xref:erc20.adoc[ERC20], ERC777 is a standard for xref:tokens.adoc#different-kinds-of-tokens[_fungible_ tokens], and is focused around allowing more complex interactions when trading tokens. More generally, it brings tokens and Ether closer together by providing the equivalent of a `msg.value` field, but for tokens. The standard also brings multiple quality-of-life improvements, such as getting rid of the confusion around `decimals`, minting and burning with proper events, among others, but its killer feature is *receive hooks*. A hook is simply a function in a contract that is called when tokens are sent to it, meaning *accounts and contracts can react to receiving tokens*. From 62dbb1b06a5e86ef72fb9e0716d37fd20dbe522d Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 15:48:30 +0100 Subject: [PATCH 187/197] Document clock modes for token and governor (#4058) Co-authored-by: Francisco --- contracts/interfaces/README.adoc | 13 ++- docs/modules/ROOT/pages/governance.adoc | 121 ++++++++++++++++++++++-- 2 files changed, 125 insertions(+), 9 deletions(-) diff --git a/contracts/interfaces/README.adoc b/contracts/interfaces/README.adoc index 5b4cedf95..8748da8a4 100644 --- a/contracts/interfaces/README.adoc +++ b/contracts/interfaces/README.adoc @@ -30,6 +30,11 @@ are useful to interact with third party contracts that implement them. - {IERC3156FlashLender} - {IERC3156FlashBorrower} - {IERC4626} +- {IERC4906} +- {IERC5267} +- {IERC5313} +- {IERC5805} +- {IERC6372} == Detailed ABI @@ -53,4 +58,10 @@ are useful to interact with third party contracts that implement them. {{IERC3156FlashBorrower}} -{{IERC4626}} \ No newline at end of file +{{IERC4626}} + +{{IERC5267}} + +{{IERC5805}} + +{{IERC6372}} diff --git a/docs/modules/ROOT/pages/governance.adoc b/docs/modules/ROOT/pages/governance.adoc index eb76321bf..cd7dd4e6f 100644 --- a/docs/modules/ROOT/pages/governance.adoc +++ b/docs/modules/ROOT/pages/governance.adoc @@ -119,13 +119,15 @@ contract MyToken is ERC20, ERC20Permit, ERC20Votes, ERC20Wrapper { } ``` -NOTE:The only other source of voting power available in OpenZeppelin Contracts currently is xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`]. ERC721 tokens that don't provide this functionality can be wrapped into a voting tokens using a combination of xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`] and xref:api:token/ERC721Wrapper.adoc#ERC721Wrapper[`ERC721Wrapper`]. +NOTE: The only other source of voting power available in OpenZeppelin Contracts currently is xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`]. ERC721 tokens that don't provide this functionality can be wrapped into a voting tokens using a combination of xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`] and xref:api:token/ERC721Wrapper.adoc#ERC721Wrapper[`ERC721Wrapper`]. + +NOTE: The internal clock used by the token to store voting balances will dictate the operating mode of the Governor contract attached to it. By default, block numbers are used. Since v4.9, developers can override the xref:api:interfaces.adoc#IERC6372[IERC6372] clock to use timestamps instead of block numbers. === Governor Initially, we will build a Governor without a timelock. The core logic is given by the Governor contract, but we still need to choose: 1) how voting power is determined, 2) how many votes are needed for quorum, 3) what options people have when casting a vote and how those votes are counted, and 4) what type of token should be used to vote. Each of these aspects is customizable by writing your own module, or more easily choosing one from OpenZeppelin Contracts. -For 1) we will use the GovernorVotes module, which hooks to an IVotes instance to determine the voting power of an account based on the token balance they hold when a proposal becomes active. This module requires as a constructor parameter the address of the token. +For 1) we will use the GovernorVotes module, which hooks to an IVotes instance to determine the voting power of an account based on the token balance they hold when a proposal becomes active. This module requires as a constructor parameter the address of the token. This module also discovers the clock mode (ERC6372) used by the token and applies it to the Governor. For 2) we will use GovernorVotesQuorumFraction which works together with ERC20Votes to define quorum as a percentage of the total supply at the block a proposal’s voting power is retrieved. This requires a constructor parameter to set the percentage. Most Governors nowadays use 4%, so we will initialize the module with parameter 4 (this indicates the percentage, resulting in 4%). @@ -137,7 +139,7 @@ votingDelay: How long after a proposal is created should voting power be fixed. votingPeriod: How long does a proposal remain open to votes. -These parameters are specified in number of blocks. Assuming block time of around 12 seconds, we will set votingDelay = 1 day = 7200 blocks, and votingPeriod = 1 week = 50400 blocks. +These parameters are specified in the unit defined in the token's clock. Assuming the token uses block numbers, and assuming block time of around 12 seconds, we will have set votingDelay = 1 day = 7200 blocks, and votingPeriod = 1 week = 50400 blocks. We can optionally set a proposal threshold as well. This restricts proposal creation to accounts who have enough voting power. @@ -160,11 +162,11 @@ contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, Gove {} function votingDelay() public pure override returns (uint256) { - return 6575; // 1 day + return 7200; // 1 day } function votingPeriod() public pure override returns (uint256) { - return 46027; // 1 week + return 50400; // 1 week } function proposalThreshold() public pure override returns (uint256) { @@ -223,7 +225,6 @@ contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, Gove return super.supportsInterface(interfaceId); } } - ``` === Timelock @@ -261,7 +262,7 @@ const grantAmount = ...; const transferCalldata = token.interface.encodeFunctionData(‘transfer’, [teamAddress, grantAmount]); ``` -Now we are ready to call the propose function of the governor. Note that we don’t pass in one array of actions, but instead three arrays corresponding to the list of targets, the list of values, and the list of calldatas. In this case it’s a single action, so it’s simple: +Now we are ready to call the propose function of the Governor. Note that we don’t pass in one array of actions, but instead three arrays corresponding to the list of targets, the list of values, and the list of calldatas. In this case it’s a single action, so it’s simple: ```javascript await governor.propose( @@ -305,7 +306,7 @@ await governor.queue( ); ``` -This will cause the governor to interact with the timelock contract and queue the actions for execution after the required delay. +This will cause the Governor to interact with the timelock contract and queue the actions for execution after the required delay. After enough time has passed (according to the timelock parameters), the proposal can be executed. If there was no timelock to begin with, this step can be ran immediately after the proposal succeeds. @@ -319,3 +320,107 @@ await governor.execute( ``` Executing the proposal will transfer the ERC20 tokens to the chosen recipient. To wrap up: we set up a system where a treasury is controlled by the collective decision of the token holders of a project, and all actions are executed via proposals enforced by on-chain votes. + +== Timestamp based governance + +=== Motivation + +It is sometimes difficult to deal with durations expressed in number of blocks because of inconsistent or unpredictable time between blocks. This is particularly true of some L2 networks where blocks are produced based on blockchain usage. Using number of blocks can also lead to the governance rules being affected by network upgrades that modify the expected time between blocks. + +The difficulty of replacing block numbers with timestamps is that the Governor and the token must both use the same format when querying past votes. If a token is designed around block numbers, it is not possible for a Governor to reliably do timestamp based lookups. + +Therefore, designing a timestamp based voting system starts with the token. + +=== Token + +Since v4.9, all voting contracts (including xref:api:token/ERC20.adoc#ERC20Votes[`ERC20Votes`] and xref:api:token/ERC721.adoc#ERC721Votes[`ERC721Votes`]) rely on xref:api:interfaces.adoc#IERC6372[IERC6372] for clock management. In order to change from operating with block numbers to operating with timestamps, all that is required is to override the `clock()` and `CLOCK_MODE()` functions. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +import "github.com/openzeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; +import "github.com/openzeppelin/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol"; +import "github.com/openzeppelin/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol"; + +contract MyToken is ERC20, ERC20Permit, ERC20Votes { + constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {} + + // Overrides IERC6372 functions to make the token & governor timestamp-based + + function clock() public view override returns (uint48) { + return uint48(block.timestamp); + } + + function CLOCK_MODE() public pure override returns (string memory) { + return "mode=timestamp"; + } + + // The functions below are overrides required by Solidity. + + function _afterTokenTransfer(address from, address to, uint256 amount) + internal + override(ERC20, ERC20Votes) + { + super._afterTokenTransfer(from, to, amount); + } + + function _mint(address to, uint256 amount) + internal + override(ERC20, ERC20Votes) + { + super._mint(to, amount); + } + + function _burn(address account, uint256 amount) + internal + override(ERC20, ERC20Votes) + { + super._burn(account, amount); + } +} +``` + +=== Governor + +The Governor will automatically detect the clock mode used by the token and adapt to it. There is no need to override anything in the Governor contract. However, the clock mode does affect how some values are interpreted. It is therefore necessary to set the `votingDelay()` and `votingPeriod()` accordingly. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +import "@openzeppelin/contracts/governance/Governor.sol"; +import "@openzeppelin/contracts/governance/compatibility/GovernorCompatibilityBravo.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; +import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; + +contract MyGovernor is Governor, GovernorCompatibilityBravo, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { + constructor(IVotes _token, TimelockController _timelock) + Governor("MyGovernor") + GovernorVotes(_token) + GovernorVotesQuorumFraction(4) + GovernorTimelockControl(_timelock) + {} + + function votingDelay() public pure virtual override returns (uint256) { + return 1 days; + } + + function votingPeriod() public pure virtual override returns (uint256) { + return 1 weeks; + } + + function proposalThreshold() public pure virtual override returns (uint256) { + return 0; + } + + // ... +} +``` + +=== Disclaimer + +Timestamp based voting is a recent feature that was formalized in EIP-6372 and EIP-5805, and introduced in v4.9. At the time this feature is released, governance tooling such as https://www.tally.xyz[Tally] does not support it yet. While support for timestamps should come soon, users can expect invalid reporting of deadlines & durations. This invalid reporting by offchain tools does not affect the onchain security and functionality of the governance contract. + +Governors with timestamp support (v4.9 and above) are compatible with old tokens (before v4.9) and will operate in "block number" mode (which is the mode all old tokens operate on). On the other hand, old Governor instances (before v4.9) are not compatible with new tokens operating using timestamps. If you update your token code to use timestamps, make sure to also update your Governor code. From d5581531deabf016552705eac9234a5d4c2935b1 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 15:49:10 +0100 Subject: [PATCH 188/197] Add a "fees" section to the ERC4626 guide (#4054) Co-authored-by: Francisco Giordano --- contracts/mocks/docs/ERC4626Fees.sol | 87 ++++++++++++++ contracts/mocks/token/ERC4646FeesMock.sol | 40 ++++++ docs/modules/ROOT/pages/erc4626.adoc | 22 ++++ scripts/prepare-docs.sh | 8 ++ test/token/ERC20/extensions/ERC4626.test.js | 127 ++++++++++++++++++++ 5 files changed, 284 insertions(+) create mode 100644 contracts/mocks/docs/ERC4626Fees.sol create mode 100644 contracts/mocks/token/ERC4646FeesMock.sol diff --git a/contracts/mocks/docs/ERC4626Fees.sol b/contracts/mocks/docs/ERC4626Fees.sol new file mode 100644 index 000000000..8ff162953 --- /dev/null +++ b/contracts/mocks/docs/ERC4626Fees.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/extensions/ERC4626.sol"; + +abstract contract ERC4626Fees is ERC4626 { + using Math for uint256; + + /** @dev See {IERC4626-previewDeposit}. */ + function previewDeposit(uint256 assets) public view virtual override returns (uint256) { + uint256 fee = _feeOnTotal(assets, _entryFeeBasePoint()); + return super.previewDeposit(assets - fee); + } + + /** @dev See {IERC4626-previewMint}. */ + function previewMint(uint256 shares) public view virtual override returns (uint256) { + uint256 assets = super.previewMint(shares); + return assets + _feeOnRaw(assets, _entryFeeBasePoint()); + } + + /** @dev See {IERC4626-previewWithdraw}. */ + function previewWithdraw(uint256 assets) public view virtual override returns (uint256) { + uint256 fee = _feeOnRaw(assets, _exitFeeBasePoint()); + return super.previewWithdraw(assets + fee); + } + + /** @dev See {IERC4626-previewRedeem}. */ + function previewRedeem(uint256 shares) public view virtual override returns (uint256) { + uint256 assets = super.previewRedeem(shares); + return assets - _feeOnTotal(assets, _exitFeeBasePoint()); + } + + /** @dev See {IERC4626-_deposit}. */ + function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual override { + uint256 fee = _feeOnTotal(assets, _entryFeeBasePoint()); + address recipient = _entryFeeRecipient(); + + super._deposit(caller, receiver, assets, shares); + + if (fee > 0 && recipient != address(this)) { + SafeERC20.safeTransfer(IERC20(asset()), recipient, fee); + } + } + + /** @dev See {IERC4626-_deposit}. */ + function _withdraw( + address caller, + address receiver, + address owner, + uint256 assets, + uint256 shares + ) internal virtual override { + uint256 fee = _feeOnRaw(assets, _exitFeeBasePoint()); + address recipient = _exitFeeRecipient(); + + super._withdraw(caller, receiver, owner, assets, shares); + + if (fee > 0 && recipient != address(this)) { + SafeERC20.safeTransfer(IERC20(asset()), recipient, fee); + } + } + + function _entryFeeBasePoint() internal view virtual returns (uint256) { + return 0; + } + + function _entryFeeRecipient() internal view virtual returns (address) { + return address(0); + } + + function _exitFeeBasePoint() internal view virtual returns (uint256) { + return 0; + } + + function _exitFeeRecipient() internal view virtual returns (address) { + return address(0); + } + + function _feeOnRaw(uint256 assets, uint256 feeBasePoint) private pure returns (uint256) { + return assets.mulDiv(feeBasePoint, 1e5, Math.Rounding.Up); + } + + function _feeOnTotal(uint256 assets, uint256 feeBasePoint) private pure returns (uint256) { + return assets.mulDiv(feeBasePoint, feeBasePoint + 1e5, Math.Rounding.Up); + } +} diff --git a/contracts/mocks/token/ERC4646FeesMock.sol b/contracts/mocks/token/ERC4646FeesMock.sol new file mode 100644 index 000000000..cd8f41012 --- /dev/null +++ b/contracts/mocks/token/ERC4646FeesMock.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../docs/ERC4626Fees.sol"; + +abstract contract ERC4626FeesMock is ERC4626Fees { + uint256 private immutable _entryFeeBasePointValue; + address private immutable _entryFeeRecipientValue; + uint256 private immutable _exitFeeBasePointValue; + address private immutable _exitFeeRecipientValue; + + constructor( + uint256 entryFeeBasePoint, + address entryFeeRecipient, + uint256 exitFeeBasePoint, + address exitFeeRecipient + ) { + _entryFeeBasePointValue = entryFeeBasePoint; + _entryFeeRecipientValue = entryFeeRecipient; + _exitFeeBasePointValue = exitFeeBasePoint; + _exitFeeRecipientValue = exitFeeRecipient; + } + + function _entryFeeBasePoint() internal view virtual override returns (uint256) { + return _entryFeeBasePointValue; + } + + function _entryFeeRecipient() internal view virtual override returns (address) { + return _entryFeeRecipientValue; + } + + function _exitFeeBasePoint() internal view virtual override returns (uint256) { + return _exitFeeBasePointValue; + } + + function _exitFeeRecipient() internal view virtual override returns (address) { + return _exitFeeRecipientValue; + } +} diff --git a/docs/modules/ROOT/pages/erc4626.adoc b/docs/modules/ROOT/pages/erc4626.adoc index 11c13ca95..00d46a4d0 100644 --- a/docs/modules/ROOT/pages/erc4626.adoc +++ b/docs/modules/ROOT/pages/erc4626.adoc @@ -191,3 +191,25 @@ stem:[\delta = 3], stem:[a_0 = 100], stem:[a_1 = 10^5] image::erc4626-attack-6.png[Inflation attack without offset=6] stem:[\delta = 6], stem:[a_0 = 1], stem:[a_1 = 10^5] + + +[[fees]] +== Custom behavior: Adding fees to the vault + +In an ERC4626 vaults, fees can be captured during the deposit/mint and/or during the withdraw/redeem steps. In both cases it is essential to remain compliant with the ERC4626 requirements with regard to the preview functions. + +For example, if calling `deposit(100, receiver)`, the caller should deposit exactly 100 underlying tokens, including fees, and the receiver should receive a number of shares that matches the value returned by `previewDeposit(100)`. Similarly, `previewMint` should account for the fees that the user will have to pay on top of share's cost. + +As for the `Deposit` event, while this is less clear in the EIP spec itself, there seems to be consensus that it should include the number of assets paid for by the user, including the fees. + +On the other hand, when withdrawing assets, the number given by the user should correspond to what he receives. Any fees should be added to the quote (in shares) performed by `previewWithdraw`. + +The `Withdraw` event should include the number of shares the user burns (including fees) and the number of assets the user actually receives (after fees are deducted). + +The consequence of this design is that both the `Deposit` and `Withdraw` events will describe two exchange rates. The spread between the "Buy-in" and the "Exit" prices correspond to the fees taken by the vault. + +The following example describes how fees proportional to the deposited/withdrawn amount can be implemented: + +```solidity +include::api:example$ERC4626Fees.sol[] +``` diff --git a/scripts/prepare-docs.sh b/scripts/prepare-docs.sh index 4fc0c957a..bb9c5d0ad 100755 --- a/scripts/prepare-docs.sh +++ b/scripts/prepare-docs.sh @@ -12,4 +12,12 @@ rm -rf "$OUTDIR" hardhat docgen +# copy examples and adjust imports +examples_dir="docs/modules/api/examples" +mkdir -p "$examples_dir" +for f in contracts/mocks/docs/*.sol; do + name="$(basename "$f")" + sed -e '/^import/s|\.\./\.\./|@openzeppelin/contracts/|' "$f" > "docs/modules/api/examples/$name" +done + node scripts/gen-nav.js "$OUTDIR" > "$OUTDIR/../nav.adoc" diff --git a/test/token/ERC20/extensions/ERC4626.test.js b/test/token/ERC20/extensions/ERC4626.test.js index 2f7b99d38..c9e5a4098 100644 --- a/test/token/ERC20/extensions/ERC4626.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -4,6 +4,7 @@ const { expect } = require('chai'); const ERC20Decimals = artifacts.require('$ERC20DecimalsMock'); const ERC4626 = artifacts.require('$ERC4626'); const ERC4626OffsetMock = artifacts.require('$ERC4626OffsetMock'); +const ERC4626FeesMock = artifacts.require('$ERC4626FeesMock'); contract('ERC4626', function (accounts) { const [holder, recipient, spender, other, user1, user2] = accounts; @@ -489,6 +490,132 @@ contract('ERC4626', function (accounts) { }); } + describe('ERC4626Fees', function () { + const feeBasePoint = web3.utils.toBN(5e3); + const amountWithoutFees = web3.utils.toBN(10000); + const fees = amountWithoutFees.mul(feeBasePoint).divn(1e5); + const amountWithFees = amountWithoutFees.add(fees); + + describe('input fees', function () { + beforeEach(async function () { + this.token = await ERC20Decimals.new(name, symbol, 18); + this.vault = await ERC4626FeesMock.new( + name + ' Vault', + symbol + 'V', + this.token.address, + feeBasePoint, + other, + 0, + constants.ZERO_ADDRESS, + ); + + await this.token.$_mint(holder, constants.MAX_INT256); + await this.token.approve(this.vault.address, constants.MAX_INT256, { from: holder }); + }); + + it('deposit', async function () { + expect(await this.vault.previewDeposit(amountWithFees)).to.be.bignumber.equal(amountWithoutFees); + ({ tx: this.tx } = await this.vault.deposit(amountWithFees, recipient, { from: holder })); + }); + + it('mint', async function () { + expect(await this.vault.previewMint(amountWithoutFees)).to.be.bignumber.equal(amountWithFees); + ({ tx: this.tx } = await this.vault.mint(amountWithoutFees, recipient, { from: holder })); + }); + + afterEach(async function () { + // get total + await expectEvent.inTransaction(this.tx, this.token, 'Transfer', { + from: holder, + to: this.vault.address, + value: amountWithFees, + }); + + // redirect fees + await expectEvent.inTransaction(this.tx, this.token, 'Transfer', { + from: this.vault.address, + to: other, + value: fees, + }); + + // mint shares + await expectEvent.inTransaction(this.tx, this.vault, 'Transfer', { + from: constants.ZERO_ADDRESS, + to: recipient, + value: amountWithoutFees, + }); + + // deposit event + await expectEvent.inTransaction(this.tx, this.vault, 'Deposit', { + sender: holder, + owner: recipient, + assets: amountWithFees, + shares: amountWithoutFees, + }); + }); + }); + + describe('output fees', function () { + beforeEach(async function () { + this.token = await ERC20Decimals.new(name, symbol, 18); + this.vault = await ERC4626FeesMock.new( + name + ' Vault', + symbol + 'V', + this.token.address, + 0, + constants.ZERO_ADDRESS, + 5e3, // 5% + other, + ); + + await this.token.$_mint(this.vault.address, constants.MAX_INT256); + await this.vault.$_mint(holder, constants.MAX_INT256); + }); + + it('redeem', async function () { + expect(await this.vault.previewRedeem(amountWithFees)).to.be.bignumber.equal(amountWithoutFees); + ({ tx: this.tx } = await this.vault.redeem(amountWithFees, recipient, holder, { from: holder })); + }); + + it('withdraw', async function () { + expect(await this.vault.previewWithdraw(amountWithoutFees)).to.be.bignumber.equal(amountWithFees); + ({ tx: this.tx } = await this.vault.withdraw(amountWithoutFees, recipient, holder, { from: holder })); + }); + + afterEach(async function () { + // withdraw principal + await expectEvent.inTransaction(this.tx, this.token, 'Transfer', { + from: this.vault.address, + to: recipient, + value: amountWithoutFees, + }); + + // redirect fees + await expectEvent.inTransaction(this.tx, this.token, 'Transfer', { + from: this.vault.address, + to: other, + value: fees, + }); + + // mint shares + await expectEvent.inTransaction(this.tx, this.vault, 'Transfer', { + from: holder, + to: constants.ZERO_ADDRESS, + value: amountWithFees, + }); + + // withdraw event + await expectEvent.inTransaction(this.tx, this.vault, 'Withdraw', { + sender: holder, + receiver: recipient, + owner: holder, + assets: amountWithoutFees, + shares: amountWithFees, + }); + }); + }); + }); + /// Scenario inspired by solmate ERC4626 tests: /// https://github.com/transmissions11/solmate/blob/main/src/test/ERC4626.t.sol it('multiple mint, deposit, redeem & withdrawal', async function () { From b4d765b130d7306fd496a4c449b6eae403173be8 Mon Sep 17 00:00:00 2001 From: Harshit sharma <79695575+HarshitSharma007@users.noreply.github.com> Date: Fri, 24 Feb 2023 20:35:46 +0530 Subject: [PATCH 189/197] Allow return data length >= 32 in SignatureChecker (#4038) Co-authored-by: Francisco Giordano --- .changeset/warm-masks-obey.md | 5 +++++ contracts/utils/cryptography/SignatureChecker.sol | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/warm-masks-obey.md diff --git a/.changeset/warm-masks-obey.md b/.changeset/warm-masks-obey.md new file mode 100644 index 000000000..3bcfa9bdd --- /dev/null +++ b/.changeset/warm-masks-obey.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`SignatureChecker`: Allow return data length greater than 32 from EIP-1271 signers. diff --git a/contracts/utils/cryptography/SignatureChecker.sol b/contracts/utils/cryptography/SignatureChecker.sol index c3a724dd0..b81cf40be 100644 --- a/contracts/utils/cryptography/SignatureChecker.sol +++ b/contracts/utils/cryptography/SignatureChecker.sol @@ -44,7 +44,7 @@ library SignatureChecker { abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); return (success && - result.length == 32 && + result.length >= 32 && abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector)); } } From 8a43ebac28a3e3ae6870387a473582064473cef1 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 17:48:55 +0100 Subject: [PATCH 190/197] Document "duplicate" proposal storing in GovernorCompatibilityBravo (#4073) Co-authored-by: Francisco --- .../compatibility/GovernorCompatibilityBravo.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol index 39c895bf0..25f404403 100644 --- a/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ b/contracts/governance/compatibility/GovernorCompatibilityBravo.sol @@ -55,6 +55,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp bytes[] memory calldatas, string memory description ) public virtual override(IGovernor, Governor) returns (uint256) { + // Stores the proposal details (if not already present) and executes the propose logic from the core. _storeProposal(_msgSender(), targets, values, new string[](calldatas.length), calldatas, description); return super.propose(targets, values, calldatas, description); } @@ -69,6 +70,10 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp bytes[] memory calldatas, string memory description ) public virtual override returns (uint256) { + // Stores the full proposal and fallback to the public (possibly overridden) propose. The fallback is done + // after the full proposal is stored, so the store operation included in the fallback will be skipped. Here we + // call `propose` and not `super.propose` to make sure if a child contract override `propose`, whatever code + // is added their is also executed when calling this alternative interface. _storeProposal(_msgSender(), targets, values, signatures, calldatas, description); return propose(targets, values, _encodeCalldata(signatures, calldatas), description); } @@ -174,7 +179,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp } /** - * @dev Store proposal metadata for later lookup + * @dev Store proposal metadata (if not already present) for later lookup. */ function _storeProposal( address proposer, From eb38c059d81ecf9296ef7526233ed962aba070eb Mon Sep 17 00:00:00 2001 From: Pascal Marco Caversaccio Date: Fri, 24 Feb 2023 19:34:03 +0100 Subject: [PATCH 191/197] Add comment on unchecked arithmetic (division by zero) in `Math.sol` (#4050) Co-authored-by: Francisco --- contracts/utils/math/Math.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/utils/math/Math.sol b/contracts/utils/math/Math.sol index 8400d0669..f8e7ca0a9 100644 --- a/contracts/utils/math/Math.sol +++ b/contracts/utils/math/Math.sol @@ -67,6 +67,9 @@ library Math { // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { + // Solidity will revert if denominator == 0, unlike the div opcode on its own. + // The surrounding unchecked block does not change this fact. + // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } From 2c6ef8c875c8b307d3e715cb918acc5c2c42714e Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 20:14:49 +0100 Subject: [PATCH 192/197] Fix ERC1363 interfaceId (#4074) --- contracts/interfaces/IERC1363.sol | 11 +++-------- contracts/interfaces/README.adoc | 4 ++++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/contracts/interfaces/IERC1363.sol b/contracts/interfaces/IERC1363.sol index 1a8dc79f4..1517197fe 100644 --- a/contracts/interfaces/IERC1363.sol +++ b/contracts/interfaces/IERC1363.sol @@ -8,17 +8,12 @@ import "./IERC165.sol"; interface IERC1363 is IERC165, IERC20 { /* - * Note: the ERC-165 identifier for this interface is 0x4bbee2df. - * 0x4bbee2df === + * Note: the ERC-165 identifier for this interface is 0xb0202a11. + * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ - * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) - */ - - /* - * Note: the ERC-165 identifier for this interface is 0xfb9ec8ce. - * 0xfb9ec8ce === + * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ diff --git a/contracts/interfaces/README.adoc b/contracts/interfaces/README.adoc index 8748da8a4..710c078e8 100644 --- a/contracts/interfaces/README.adoc +++ b/contracts/interfaces/README.adoc @@ -22,6 +22,8 @@ are useful to interact with third party contracts that implement them. - {IERC1155MetadataURI} - {IERC1271} - {IERC1363} +- {IERC1363Receiver} +- {IERC1363Spender} - {IERC1820Implementer} - {IERC1820Registry} - {IERC1822Proxiable} @@ -44,6 +46,8 @@ are useful to interact with third party contracts that implement them. {{IERC1363Receiver}} +{{IERC1363Spender}} + {{IERC1820Implementer}} {{IERC1820Registry}} From 0fbd039554c05f2872639850d0e0127587551946 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 17:14:21 -0300 Subject: [PATCH 193/197] Update lockfile (#4018) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 7545 ++++++++++++++++----------------------------- 1 file changed, 2719 insertions(+), 4826 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f808cf30..87fd3a795 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,81 +86,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/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": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -190,24 +119,6 @@ "semver": "^5.4.1" } }, - "node_modules/@changesets/apply-release-plan/node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@changesets/apply-release-plan/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -304,83 +215,6 @@ "changeset": "bin.js" } }, - "node_modules/@changesets/cli/node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@changesets/cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/cli/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/cli/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@changesets/cli/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@changesets/cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@changesets/cli/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": ">=4" - } - }, - "node_modules/@changesets/cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@changesets/cli/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -390,18 +224,6 @@ "semver": "bin/semver" } }, - "node_modules/@changesets/cli/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@changesets/config": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@changesets/config/-/config-2.3.0.tgz", @@ -439,65 +261,6 @@ "semver": "^5.4.1" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@changesets/get-dependents-graph/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@changesets/get-dependents-graph/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": ">=4" - } - }, "node_modules/@changesets/get-dependents-graph/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -507,18 +270,6 @@ "semver": "bin/semver" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@changesets/get-github-info": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.5.2.tgz", @@ -574,77 +325,6 @@ "chalk": "^2.1.0" } }, - "node_modules/@changesets/logger/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/logger/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/logger/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@changesets/logger/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@changesets/logger/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@changesets/logger/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": ">=4" - } - }, - "node_modules/@changesets/logger/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@changesets/parse": { "version": "0.3.16", "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz", @@ -684,77 +364,6 @@ "p-filter": "^2.1.0" } }, - "node_modules/@changesets/read/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/read/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@changesets/read/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@changesets/read/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@changesets/read/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@changesets/read/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": ">=4" - } - }, - "node_modules/@changesets/read/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@changesets/types": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", @@ -1730,12 +1339,6 @@ "fs-extra": "^8.1.0" } }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -1784,26 +1387,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@manypkg/get-packages/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/@metamask/eth-sig-util": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", @@ -1845,9 +1428,9 @@ } }, "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==", + "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, "funding": [ { @@ -1857,9 +1440,9 @@ ] }, "node_modules/@noble/secp256k1": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "dev": true, "funding": [ { @@ -2087,9 +1670,9 @@ } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz", - "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", "dev": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -2379,6 +1962,73 @@ "oz-docs": "oz-docs.js" } }, + "node_modules/@openzeppelin/docs-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": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@openzeppelin/docs-utils/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@openzeppelin/docs-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": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@openzeppelin/docs-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/@openzeppelin/docs-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/@openzeppelin/docs-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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@openzeppelin/test-helpers": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", @@ -2397,6 +2047,15 @@ "web3-utils": "^1.2.5" } }, + "node_modules/@openzeppelin/test-helpers/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@openzeppelin/test-helpers/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -2407,9 +2066,9 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.20.6.tgz", - "integrity": "sha512-KWdtlahm+iunlAlzLsdpBueanwEx0LLPfAkDL1p0C4SPjMiUqHHFlyGtmmWwdiqDpJ//605vfwkd5RqfnFrHSg==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.0.tgz", + "integrity": "sha512-lXf1tUrCZ3Q/YmWhw0cuSSOHMp0OAsmeOg1fhSGEM6nQQ6cIVlFvq2pCV5hZMb7xkOm5pmmzV8JW1W3kfW6Lfw==", "dev": true, "dependencies": { "cbor": "^8.0.0", @@ -2421,16 +2080,19 @@ "solidity-ast": "^0.4.15" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "node_modules/@openzeppelin/upgrades-core/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": { - "nofilter": "^3.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12.19" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { @@ -2449,13 +2111,43 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@openzeppelin/upgrades-core/node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "node_modules/@openzeppelin/upgrades-core/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/@openzeppelin/upgrades-core/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/@openzeppelin/upgrades-core/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.19" + "node": ">=8" + } + }, + "node_modules/@openzeppelin/upgrades-core/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": ">=8" } }, "node_modules/@scure/base": { @@ -2471,9 +2163,9 @@ ] }, "node_modules/@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, "funding": [ { @@ -2482,15 +2174,15 @@ } ], "dependencies": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", "@scure/base": "~1.1.0" } }, "node_modules/@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, "funding": [ { @@ -2499,7 +2191,7 @@ } ], "dependencies": { - "@noble/hashes": "~1.1.1", + "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" } }, @@ -2639,14 +2331,14 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", - "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.8.tgz", + "integrity": "sha512-RevMtlEuQw9cE2VWzQuvLDSYPCVSZQQUOsaK8ArcwxXct6ugiJCDC7tNouhHzP1Y4ccdZtG2y/XPHQJdzgYdZQ==", "dev": true, "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" } }, "node_modules/@truffle/blockchain-utils": { @@ -2656,13 +2348,13 @@ "dev": true }, "node_modules/@truffle/codec": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", - "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", + "version": "0.14.15", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.15.tgz", + "integrity": "sha512-cooWy8blmvYQQRBKgzWJnDUS6mZE9cvnmpVN15jU6TseAQkBtmfYfCH12QCKEWMq2+R4yQICP54WNCYg78g72g==", "dev": true, "dependencies": { - "@truffle/abi-utils": "^0.3.6", - "@truffle/compile-common": "^0.9.1", + "@truffle/abi-utils": "^0.3.8", + "@truffle/compile-common": "^0.9.3", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -2670,7 +2362,16 @@ "lodash": "^4.17.21", "semver": "7.3.7", "utf8": "^3.0.0", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" + } + }, + "node_modules/@truffle/codec/node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true, + "engines": { + "node": "*" } }, "node_modules/@truffle/codec/node_modules/bn.js": { @@ -2679,6 +2380,19 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@truffle/codec/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2691,6 +2405,15 @@ "node": ">=10" } }, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@truffle/codec/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -2713,71 +2436,71 @@ "dev": true }, "node_modules/@truffle/compile-common": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", - "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.3.tgz", + "integrity": "sha512-9S86H5DRC0zEj164KeClP/6jVt1M/nRd7St89h6QbuIU0JjpqSz1SXpkvqhbFoV9hhW+4ZGh0NysjrdPlk7gFw==", "dev": true, "dependencies": { - "@truffle/error": "^0.1.1", + "@truffle/error": "^0.2.0", "colors": "1.4.0" } }, + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==", + "dev": true + }, "node_modules/@truffle/contract": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.10.tgz", - "integrity": "sha512-69IZSXeQKRP3EutILqe+vLY5A5gUpeXUiZhm/Fy/qHHkP238vMjtOkTZGkY6bonYqmgk+vDY7KSYSYKzDNPdCA==", + "version": "4.6.15", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.15.tgz", + "integrity": "sha512-3V+50z94XRh+I3axz6Zrot1wlMhRiG2O9XjR20LwR5YBnzHV7YFfOs8x6pluXVLQyxcVJBISJyqxvGxpkecrZg==", "dev": true, "dependencies": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.6", - "@truffle/contract-schema": "^3.4.11", - "@truffle/debug-utils": "^6.0.42", - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.26", + "@truffle/contract-schema": "^3.4.12", + "@truffle/debug-utils": "^6.0.46", + "@truffle/error": "^0.2.0", + "@truffle/interface-adapter": "^0.5.29", "bignumber.js": "^7.2.1", "debug": "^4.3.1", "ethers": "^4.0.32", - "web3": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" + "web3": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" } }, "node_modules/@truffle/contract-schema": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", - "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.12.tgz", + "integrity": "sha512-XpMMps/bqHwiRuCyLiEEGWEAvGGzGj4u1X1+lzxrtIsrwbQhSZcdgEbXl9vGxOOJWOup3HXRCIsjlao27kS4OA==", "dev": true, "dependencies": { "ajv": "^6.10.0", "debug": "^4.3.1" } }, + "node_modules/@truffle/contract/node_modules/@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==", + "dev": true + }, "node_modules/@truffle/debug-utils": { - "version": "6.0.42", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", - "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", + "version": "6.0.46", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.46.tgz", + "integrity": "sha512-MWko3c1M0NI8IT0yNh8Dh2xoDgR2R1apP8hc/9VsR/4Q7P6OE/578WRpZnvo2HWXYBiJ2PrWBDtMYBHntImrrA==", "dev": true, "dependencies": { - "@truffle/codec": "^0.14.11", + "@truffle/codec": "^0.14.15", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.5" - } - }, - "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "highlightjs-solidity": "^2.0.6" } }, "node_modules/@truffle/debug-utils/node_modules/bn.js": { @@ -2786,65 +2509,6 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/@truffle/debug-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@truffle/debug-utils/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": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@truffle/error": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", @@ -2852,14 +2516,14 @@ "dev": true }, "node_modules/@truffle/interface-adapter": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz", - "integrity": "sha512-fBhoqtT+CT4XKXcOijvw0RIMgyUi3FJg+n5i5PyGBsoRzqbLZd9cZq+oMNjOZPdf3GH68hsOFOaQO5tZH7oZow==", + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.29.tgz", + "integrity": "sha512-6UlJ+f87z7y/dWk9UfbIU+4e80iRsp8h03LEiE5B+PvZbr6cuMjLJUBtBBQZMo3+xrIcS/2u3p5hOxW8OJm8tw==", "dev": true, "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", - "web3": "1.8.1" + "web3": "1.8.2" } }, "node_modules/@truffle/interface-adapter/node_modules/bn.js": { @@ -2884,73 +2548,11 @@ "strip-indent": "^2.0.0" } }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@trufflesuite/chromafi/node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@trufflesuite/chromafi/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": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { "node": ">=4" } @@ -3041,21 +2643,6 @@ "ci-info": "^3.1.0" } }, - "node_modules/@types/is-ci/node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -3084,9 +2671,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3214,9 +2801,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3310,9 +2897,9 @@ } }, "node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" @@ -3355,25 +2942,25 @@ } }, "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==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/antlr4": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", - "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", - "dev": true + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.12.0.tgz", + "integrity": "sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==", + "dev": true, + "engines": { + "node": ">=16" + } }, "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", @@ -3488,18 +3075,6 @@ "safer-buffer": "~2.1.0" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "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", @@ -3525,12 +3100,12 @@ "dev": true }, "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/async": { @@ -3585,9 +3160,9 @@ } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/balanced-match": { @@ -3738,13 +3313,13 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -3752,7 +3327,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -3851,68 +3426,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, "node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -4079,39 +3592,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4166,15 +3646,6 @@ "node": ">=6" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -4191,25 +3662,15 @@ } }, "node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" + "nofilter": "^3.1.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cbor/node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true, - "engines": { - "node": "*" + "node": ">=12.19" } }, "node_modules/chai": { @@ -4241,16 +3702,17 @@ } }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/change-case": { @@ -4375,10 +3837,19 @@ "dev": true }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/cids": { "version": "0.7.5", @@ -4451,18 +3922,6 @@ "node": ">=6" } }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -4479,12 +3938,6 @@ "colors": "^1.1.2" } }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4574,21 +4027,18 @@ } }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/colors": { @@ -4619,10 +4069,13 @@ "dev": true }, "node_modules/commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", - "dev": true + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "dev": true, + "engines": { + "node": ">=14" + } }, "node_modules/compare-versions": { "version": "5.0.3", @@ -4652,9 +4105,9 @@ } }, "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -4715,9 +4168,9 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { "node": ">= 0.6" @@ -4758,40 +4211,36 @@ } }, "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "dev": true, "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/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": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/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, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/crc-32": { @@ -4806,16 +4255,6 @@ "node": ">=0.8" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -4852,6 +4291,26 @@ "node-fetch": "2.6.7" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4890,28 +4349,6 @@ "sha3": "^2.1.1" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/crypto-js": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", @@ -5031,15 +4468,12 @@ } }, "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { @@ -5058,15 +4492,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys/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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -5152,9 +4577,9 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "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==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", @@ -5185,16 +4610,6 @@ "node": ">= 0.8" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5206,12 +4621,12 @@ } }, "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/detect-port": { @@ -5237,17 +4652,6 @@ "node": ">=0.3.1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, "node_modules/difflib": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", @@ -5430,15 +4834,6 @@ "node": ">=8.6" } }, - "node_modules/enquirer/node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -5470,27 +4865,33 @@ } }, "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "dependencies": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", @@ -5499,25 +4900,9 @@ "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "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" + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -5532,6 +4917,20 @@ "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", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "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", @@ -5616,15 +5015,12 @@ "dev": true }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/escodegen": { @@ -5723,9 +5119,9 @@ } }, "node_modules/eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.4.1", @@ -5848,6 +5244,21 @@ "node": ">=8" } }, + "node_modules/eslint/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/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5870,6 +5281,36 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/eslint/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/eslint/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/eslint/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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5898,6 +5339,15 @@ "node": ">=10.13.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", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5967,6 +5417,18 @@ "node": ">=8" } }, + "node_modules/eslint/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": ">=8" + } + }, "node_modules/espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", @@ -5998,9 +5460,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -6113,18 +5575,6 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -6134,32 +5584,6 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -6192,21 +5616,6 @@ "wrap-ansi": "^5.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/eth-gas-reporter/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -6217,15 +5626,6 @@ "ms": "^2.1.1" } }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eth-gas-reporter/node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -6241,25 +5641,16 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "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": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.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/find-up": { @@ -6318,15 +5709,6 @@ "node": "*" } }, - "node_modules/eth-gas-reporter/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": ">=4" - } - }, "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", @@ -6438,6 +5820,21 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "node_modules/eth-gas-reporter/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==", + "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_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", @@ -6961,6 +6358,30 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -6985,6 +6406,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -7100,27 +6536,6 @@ "reusify": "^1.0.4" } }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -7418,9 +6833,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -7490,81 +6905,10 @@ "testrpc-sc": "index.js" } }, - "node_modules/ghost-testrpc/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ghost-testrpc/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ghost-testrpc/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": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -7602,9 +6946,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -7662,9 +7006,9 @@ } }, "node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "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" @@ -7676,43 +7020,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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": { - "@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", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/globby/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -7847,9 +7187,9 @@ } }, "node_modules/hardhat": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", - "integrity": "sha512-f/t7+hLlhsnQZ6LDXyV+8rHGRZFZY1sgFvgrwr9fBjMdGp1Bu6hHq1KXS4/VFZfZcVdL1DAWWEkryinZhqce+A==", + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.7.tgz", + "integrity": "sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -7899,7 +7239,7 @@ "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tsort": "0.0.1", - "undici": "^5.4.0", + "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, @@ -7923,9 +7263,9 @@ } }, "node_modules/hardhat-exposed": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.1.tgz", - "integrity": "sha512-qyHXdS3NmzrtXF+XL547BMsTAK+IEMW9OOYMH4d362DlPn4L2B2KXKG6OpuJczxYjgMFJ0LunLxNgu6jtRvjRg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.2.tgz", + "integrity": "sha512-qhi60I2bfjoPZwKgrY7BIpuUiBE7aC/bHN2MzHxPcZdxaeFnjKJ50n59LE7yK3GK2qYzE8DMjzqfnH6SlKPUjw==", "dev": true, "dependencies": { "micromatch": "^4.0.4", @@ -7950,9 +7290,9 @@ } }, "node_modules/hardhat-ignore-warnings": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.6.tgz", - "integrity": "sha512-GQgvjprONI8VF8b85+QJ8H9v3L9TCCtQvUx+9QaRL+sCPw1cOZHfhlEz9V6Lq7GNCQMqBORVzNzUzoP/tKAEQQ==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.8.tgz", + "integrity": "sha512-vPX94rJyTzYsCOzGIYdOcJgn3iQI6qa+CI9ZZfgDhdXJpda8ljpOT7bdUKAYC4LyoP0Z5fWTmupXoPaQrty0gw==", "dev": true, "dependencies": { "minimatch": "^5.1.0", @@ -7970,9 +7310,9 @@ } }, "node_modules/hardhat-ignore-warnings/node_modules/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -7981,45 +7321,10 @@ "node": ">=10" } }, - "node_modules/hardhat/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/hardhat/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/hardhat/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "node_modules/hardhat/node_modules/commander": { @@ -8028,25 +7333,16 @@ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, - "node_modules/hardhat/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "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": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, "node_modules/hardhat/node_modules/find-up": { @@ -8081,15 +7377,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/hardhat/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": ">=4" - } - }, "node_modules/hardhat/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -8229,18 +7516,6 @@ "semver": "bin/semver" } }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8263,12 +7538,12 @@ } }, "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==", + "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": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -8283,6 +7558,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8369,9 +7656,9 @@ } }, "node_modules/highlightjs-solidity": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz", - "integrity": "sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==", "dev": true }, "node_modules/hmac-drbg": { @@ -8496,6 +7783,18 @@ "node": ">=10.19.0" } }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -8569,9 +7868,9 @@ } }, "node_modules/immutable": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", - "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", "dev": true }, "node_modules/import-fresh": { @@ -8590,6 +7889,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/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_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8630,138 +7938,13 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/inquirer/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": ">=4" - } - }, - "node_modules/inquirer/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "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": { - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -8821,6 +8004,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "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", @@ -8914,21 +8111,6 @@ "is-ci": "bin.js" } }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -8944,15 +8126,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -9069,12 +8242,12 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-port-reachable": { @@ -9248,9 +8421,9 @@ "dev": true }, "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", "dev": true, "funding": { "type": "opencollective", @@ -9294,12 +8467,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9586,6 +8753,18 @@ "node": ">=0.10.0" } }, + "node_modules/load-json-file/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, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -9601,15 +8780,6 @@ "node": ">=6" } }, - "node_modules/load-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9652,6 +8822,12 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "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/lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", @@ -9674,6 +8850,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -9690,6 +8881,45 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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/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, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -9836,92 +9066,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/meow/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/meow/node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -9934,19 +9078,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10009,19 +9140,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/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -10055,15 +9173,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -10116,9 +9225,9 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "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" @@ -10138,15 +9247,6 @@ "node": ">= 6" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -10167,9 +9267,9 @@ } }, "node_modules/mixme": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", - "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.5.tgz", + "integrity": "sha512-/6IupbRx32s7jjEwHcycXikJwFD5UujbVNuJFkeKLYje+92OvtuPniF6JhnFm5JCTDUhS+kYK3W/4BWYQYXz7w==", "dev": true, "engines": { "node": ">= 8.0.0" @@ -10284,6 +9384,18 @@ "wrap-ansi": "^7.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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10332,6 +9444,15 @@ "node": "*" } }, + "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/mocha/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", @@ -10484,6 +9605,15 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -10548,12 +9678,6 @@ "buffer": "^5.5.0" } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, "node_modules/nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -10611,12 +9735,6 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -10661,9 +9779,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -10681,9 +9799,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true, "bin": { "node-gyp-build": "bin.js", @@ -10704,12 +9822,12 @@ } }, "node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.19" } }, "node_modules/nopt": { @@ -10826,9 +9944,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "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, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10844,18 +9962,21 @@ } }, "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==", + "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": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { @@ -10912,18 +10033,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -11076,19 +10185,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -11102,16 +10198,21 @@ "dev": true }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { @@ -11185,12 +10286,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -11306,6 +10401,15 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/preferred-pm": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", @@ -11392,9 +10496,9 @@ } }, "node_modules/prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -11407,12 +10511,12 @@ } }, "node_modules/prettier-plugin-solidity": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz", - "integrity": "sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz", + "integrity": "sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.14.5", + "@solidity-parser/parser": "^0.15.0", "semver": "^7.3.8", "solidity-comments-extractor": "^0.0.7" }, @@ -11423,39 +10527,15 @@ "prettier": ">=2.3.0 || >=3.0.0-alpha.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/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz", + "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-plugin-solidity/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/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11471,15 +10551,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -11525,20 +10596,6 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -11624,15 +10681,12 @@ ] }, "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/randombytes": { @@ -11644,16 +10698,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -11664,9 +10708,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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", @@ -11679,78 +10723,53 @@ } }, "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==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "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, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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, - "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==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/read-yaml-file": { @@ -11768,19 +10787,10 @@ "node": ">=6" } }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "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==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -12047,12 +11057,12 @@ "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/responselike": { @@ -12076,19 +11086,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -12180,15 +11177,6 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12241,18 +11229,6 @@ "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", "dev": true }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12755,46 +11731,64 @@ } }, "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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/slice-ansi/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, + "engines": { + "node": ">=8" + } + }, "node_modules/smartwrap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", @@ -12824,13 +11818,19 @@ "node": ">=8" } }, - "node_modules/smartwrap/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/smartwrap/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": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/smartwrap/node_modules/cliui": { @@ -12844,15 +11844,24 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/smartwrap/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/smartwrap/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": ">=0.10.0" + "node": ">=7.0.0" } }, + "node_modules/smartwrap/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/smartwrap/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", @@ -12930,19 +11939,6 @@ "node": ">=8" } }, - "node_modules/smartwrap/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -12997,11 +11993,15 @@ "wrap-ansi": "^2.0.0" } }, - "node_modules/solc/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/solc/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, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, "engines": { "node": ">=0.10.0" } @@ -13066,6 +12066,68 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/solc/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, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/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, + "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/solc/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, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/solc/node_modules/require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -13177,395 +12239,128 @@ } }, "node_modules/solhint": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", - "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.4.0.tgz", + "integrity": "sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.14.1", - "ajv": "^6.6.1", - "antlr4": "4.7.1", - "ast-parents": "0.0.1", - "chalk": "^2.4.2", - "commander": "2.18.0", - "cosmiconfig": "^5.0.7", - "eslint": "^5.6.0", - "fast-diff": "^1.1.2", - "glob": "^7.1.3", - "ignore": "^4.0.6", - "js-yaml": "^3.12.0", - "lodash": "^4.17.11", - "semver": "^6.3.0" + "@solidity-parser/parser": "^0.15.0", + "ajv": "^6.12.6", + "antlr4": "^4.11.0", + "ast-parents": "^0.0.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "fast-diff": "^1.2.0", + "glob": "^8.0.3", + "ignore": "^5.2.4", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "semver": "^6.3.0", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0" }, "bin": { "solhint": "solhint.js" }, "optionalDependencies": { - "prettier": "^1.14.3" + "prettier": "^2.8.3" } }, - "node_modules/solhint/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "node_modules/solhint/node_modules/@solidity-parser/parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz", + "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/solhint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, "node_modules/solhint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/solhint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/solhint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/solhint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/solhint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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/solhint/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/solhint/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solhint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/solhint/node_modules/eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - } - }, - "node_modules/solhint/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/solhint/node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solhint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/eslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solhint/node_modules/espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "dependencies": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/solhint/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/solhint/node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "dependencies": { - "flat-cache": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "node_modules/solhint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solhint/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/solhint/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==", + "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": ">=4" + "node": ">=8" } }, - "node_modules/solhint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/solhint/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/solhint/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": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/solhint/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" + "argparse": "^2.0.1" }, "bin": { - "rimraf": "bin.js" + "js-yaml": "bin/js-yaml.js" } }, "node_modules/solhint/node_modules/semver": { @@ -13577,76 +12372,34 @@ "semver": "bin/semver.js" } }, - "node_modules/solhint/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/solhint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solhint/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/solhint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/solhint/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/solhint/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": ">=8" } }, "node_modules/solidity-ast": { - "version": "0.4.40", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.40.tgz", - "integrity": "sha512-M8uLBT2jgFB7B0iVAC5a2l71J8vim7aEm03AZkaHbDqyrl1pE+i5PriMEw6WlwGfHp3/Ym7cn9BqvVLQgRk+Yw==", + "version": "0.4.46", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz", + "integrity": "sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==", "dev": true }, "node_modules/solidity-comments": { @@ -13888,18 +12641,6 @@ "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/solidity-coverage/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -13909,20 +12650,6 @@ "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/solidity-coverage/node_modules/chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -13955,21 +12682,6 @@ "wrap-ansi": "^5.1.0" } }, - "node_modules/solidity-coverage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/solidity-coverage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/solidity-coverage/node_modules/debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -13980,15 +12692,6 @@ "ms": "^2.1.1" } }, - "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==", - "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", @@ -14004,15 +12707,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "node_modules/solidity-coverage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "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", @@ -14067,29 +12761,42 @@ } }, "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==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solidity-coverage/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/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": { + "@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": ">=4" + "node": ">=8" } }, "node_modules/solidity-coverage/node_modules/js-yaml": { @@ -14130,18 +12837,6 @@ "node": ">=8" } }, - "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==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/solidity-coverage/node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -14197,16 +12892,33 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/solidity-coverage/node_modules/mocha/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/solidity-coverage/node_modules/mocha/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "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": ">=6" + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/solidity-coverage/node_modules/ms": { @@ -14215,6 +12927,21 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "node_modules/solidity-coverage/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==", + "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_modules/solidity-coverage/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -14284,15 +13011,15 @@ } }, "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/solidity-coverage/node_modules/which": { @@ -14682,15 +13409,12 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/strip-hex-prefix": { @@ -14728,15 +13452,15 @@ } }, "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/swap-case": { @@ -14856,6 +13580,18 @@ "node": ">=8" } }, + "node_modules/swarm-js/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -14880,59 +13616,94 @@ } }, "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/table/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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/table/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==", + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "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" + } + }, "node_modules/table/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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/table/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==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/tar": { @@ -15006,12 +13777,6 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true }, - "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/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -15078,9 +13843,9 @@ } }, "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "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" @@ -15152,6 +13917,21 @@ "node": ">=8" } }, + "node_modules/tty-table/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/tty-table/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -15168,6 +13948,33 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/tty-table/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/tty-table/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/tty-table/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/tty-table/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15180,6 +13987,18 @@ "node": ">=8" } }, + "node_modules/tty-table/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": ">=8" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -15256,6 +14075,20 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -15312,9 +14145,9 @@ "dev": true }, "node_modules/undici": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", - "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", "dev": true, "dependencies": { "busboy": "^1.6.0" @@ -15476,28 +14309,28 @@ } }, "node_modules/web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", + "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" + "web3-bzz": "1.8.2", + "web3-core": "1.8.2", + "web3-eth": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-shh": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", + "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -15509,63 +14342,57 @@ "node": ">=8.0.0" } }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "node_modules/web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", + "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-requestmanager": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", + "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", "dev": true, "dependencies": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" + "web3-eth-iban": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", + "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", "dev": true, "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", + "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", "dev": true, "dependencies": { "eventemitter3": "4.0.4" @@ -15575,40 +14402,34 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", + "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", "dev": true, "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" + "util": "^0.12.5", + "web3-core-helpers": "1.8.2", + "web3-providers-http": "1.8.2", + "web3-providers-ipc": "1.8.2", + "web3-providers-ws": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", + "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "node_modules/web3-core/node_modules/bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -15619,58 +14440,57 @@ } }, "node_modules/web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", + "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", "dev": true, "dependencies": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-accounts": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-eth-ens": "1.8.2", + "web3-eth-iban": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", + "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", + "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", "dev": true, "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", + "ethereumjs-util": "^7.1.5", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" @@ -15697,51 +14517,51 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", + "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", "dev": true, "dependencies": { "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", + "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", "dev": true, "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", + "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", "dev": true, "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" @@ -15754,78 +14574,72 @@ "dev": true }, "node_modules/web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", + "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", "dev": true, "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "node_modules/web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", + "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", "dev": true, "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", + "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", "dev": true, "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", + "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", "dev": true, "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", + "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", "dev": true, "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", + "web3-core-helpers": "1.8.2", "websocket": "^1.0.32" }, "engines": { @@ -15833,25 +14647,25 @@ } }, "node_modules/web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", + "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", "dev": true, "hasInstallScript": true, "dependencies": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-net": "1.8.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", "dev": true, "dependencies": { "bn.js": "^5.2.1", @@ -16058,6 +14872,39 @@ "node": ">=8" } }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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/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", @@ -16099,18 +14946,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", @@ -16211,9 +15046,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -16229,12 +15064,25 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=6" } }, "node_modules/yargs-unparser": { @@ -16264,6 +15112,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/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": ">=8" + } + }, "node_modules/yargs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -16355,70 +15224,12 @@ "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/runtime": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", - "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" @@ -16445,18 +15256,6 @@ "semver": "^5.4.1" }, "dependencies": { - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -16548,79 +15347,11 @@ "tty-table": "^4.1.5" }, "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -16661,67 +15392,11 @@ "semver": "^5.4.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -16778,64 +15453,6 @@ "dev": true, "requires": { "chalk": "^2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@changesets/parse": { @@ -16875,64 +15492,6 @@ "chalk": "^2.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@changesets/types": { @@ -17573,12 +16132,6 @@ "fs-extra": "^8.1.0" }, "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -17622,20 +16175,6 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } } } }, @@ -17679,15 +16218,15 @@ } }, "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "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 }, "@noble/secp256k1": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "dev": true }, "@nodelib/fs.scandir": { @@ -17870,9 +16409,9 @@ } }, "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz", - "integrity": "sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", "dev": true, "requires": { "ethereumjs-util": "^7.1.4" @@ -18044,6 +16583,57 @@ "js-yaml": "^3.13.1", "lodash.startcase": "^4.4.0", "minimist": "^1.2.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "@openzeppelin/test-helpers": { @@ -18064,6 +16654,12 @@ "web3-utils": "^1.2.5" }, "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -18073,9 +16669,9 @@ } }, "@openzeppelin/upgrades-core": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.20.6.tgz", - "integrity": "sha512-KWdtlahm+iunlAlzLsdpBueanwEx0LLPfAkDL1p0C4SPjMiUqHHFlyGtmmWwdiqDpJ//605vfwkd5RqfnFrHSg==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.0.tgz", + "integrity": "sha512-lXf1tUrCZ3Q/YmWhw0cuSSOHMp0OAsmeOg1fhSGEM6nQQ6cIVlFvq2pCV5hZMb7xkOm5pmmzV8JW1W3kfW6Lfw==", "dev": true, "requires": { "cbor": "^8.0.0", @@ -18087,13 +16683,13 @@ "solidity-ast": "^0.4.15" }, "dependencies": { - "cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "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, "requires": { - "nofilter": "^3.1.0" + "color-convert": "^2.0.1" } }, "chalk": { @@ -18106,11 +16702,35 @@ "supports-color": "^7.1.0" } }, - "nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -18121,23 +16741,23 @@ "dev": true }, "@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, "requires": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", "@scure/base": "~1.1.0" } }, "@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, "requires": { - "@noble/hashes": "~1.1.1", + "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" } }, @@ -18247,14 +16867,14 @@ } }, "@truffle/abi-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.6.tgz", - "integrity": "sha512-61aTH2QmwVA1INaPMufRHTsS6jsEhS+GCkuCDdvBDmwctSnCKGDOr185BGt65QrpMRxYmIoH6WFBSNMYxW9GRw==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.8.tgz", + "integrity": "sha512-RevMtlEuQw9cE2VWzQuvLDSYPCVSZQQUOsaK8ArcwxXct6ugiJCDC7tNouhHzP1Y4ccdZtG2y/XPHQJdzgYdZQ==", "dev": true, "requires": { "change-case": "3.0.2", "fast-check": "3.1.1", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" } }, "@truffle/blockchain-utils": { @@ -18264,13 +16884,13 @@ "dev": true }, "@truffle/codec": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.11.tgz", - "integrity": "sha512-NgfMNYemgMXqoEcJA5ZsEhxChCwq33rSxtNxlececEH/1Nf0r+ryfrfmLlyPmv8f3jorVf1GWa0zI0AedGCGYQ==", + "version": "0.14.15", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.15.tgz", + "integrity": "sha512-cooWy8blmvYQQRBKgzWJnDUS6mZE9cvnmpVN15jU6TseAQkBtmfYfCH12QCKEWMq2+R4yQICP54WNCYg78g72g==", "dev": true, "requires": { - "@truffle/abi-utils": "^0.3.6", - "@truffle/compile-common": "^0.9.1", + "@truffle/abi-utils": "^0.3.8", + "@truffle/compile-common": "^0.9.3", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -18278,15 +16898,31 @@ "lodash": "^4.17.21", "semver": "7.3.7", "utf8": "^3.0.0", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" }, "dependencies": { + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "dev": true + }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -18296,6 +16932,12 @@ "yallist": "^4.0.0" } }, + "nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -18314,41 +16956,57 @@ } }, "@truffle/compile-common": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.1.tgz", - "integrity": "sha512-mhdkX6ExZImHSBO3jGm6aAn8NpVtMTdjq50jRXY/O59/ZNC0J9WpRapxrAKUVNc+XydMdBlfeEpXoqTJg7cbXw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.3.tgz", + "integrity": "sha512-9S86H5DRC0zEj164KeClP/6jVt1M/nRd7St89h6QbuIU0JjpqSz1SXpkvqhbFoV9hhW+4ZGh0NysjrdPlk7gFw==", "dev": true, "requires": { - "@truffle/error": "^0.1.1", + "@truffle/error": "^0.2.0", "colors": "1.4.0" + }, + "dependencies": { + "@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==", + "dev": true + } } }, "@truffle/contract": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.10.tgz", - "integrity": "sha512-69IZSXeQKRP3EutILqe+vLY5A5gUpeXUiZhm/Fy/qHHkP238vMjtOkTZGkY6bonYqmgk+vDY7KSYSYKzDNPdCA==", + "version": "4.6.15", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.15.tgz", + "integrity": "sha512-3V+50z94XRh+I3axz6Zrot1wlMhRiG2O9XjR20LwR5YBnzHV7YFfOs8x6pluXVLQyxcVJBISJyqxvGxpkecrZg==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", "@truffle/blockchain-utils": "^0.1.6", - "@truffle/contract-schema": "^3.4.11", - "@truffle/debug-utils": "^6.0.42", - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.26", + "@truffle/contract-schema": "^3.4.12", + "@truffle/debug-utils": "^6.0.46", + "@truffle/error": "^0.2.0", + "@truffle/interface-adapter": "^0.5.29", "bignumber.js": "^7.2.1", "debug": "^4.3.1", "ethers": "^4.0.32", - "web3": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" + "web3": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" + }, + "dependencies": { + "@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==", + "dev": true + } } }, "@truffle/contract-schema": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", - "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.12.tgz", + "integrity": "sha512-XpMMps/bqHwiRuCyLiEEGWEAvGGzGj4u1X1+lzxrtIsrwbQhSZcdgEbXl9vGxOOJWOup3HXRCIsjlao27kS4OA==", "dev": true, "requires": { "ajv": "^6.10.0", @@ -18356,80 +17014,24 @@ } }, "@truffle/debug-utils": { - "version": "6.0.42", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.42.tgz", - "integrity": "sha512-9v70tj+My0Z2UZJ9OsuUlfo4Dt2AJqAQa/YWtGe28H8zsi+o9Dca0RsKWecuprdllgzrEs7ad8QUtSINhwjIlg==", + "version": "6.0.46", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.46.tgz", + "integrity": "sha512-MWko3c1M0NI8IT0yNh8Dh2xoDgR2R1apP8hc/9VsR/4Q7P6OE/578WRpZnvo2HWXYBiJ2PrWBDtMYBHntImrrA==", "dev": true, "requires": { - "@truffle/codec": "^0.14.11", + "@truffle/codec": "^0.14.15", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.5" + "highlightjs-solidity": "^2.0.6" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -18440,14 +17042,14 @@ "dev": true }, "@truffle/interface-adapter": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.26.tgz", - "integrity": "sha512-fBhoqtT+CT4XKXcOijvw0RIMgyUi3FJg+n5i5PyGBsoRzqbLZd9cZq+oMNjOZPdf3GH68hsOFOaQO5tZH7oZow==", + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.29.tgz", + "integrity": "sha512-6UlJ+f87z7y/dWk9UfbIU+4e80iRsp8h03LEiE5B+PvZbr6cuMjLJUBtBBQZMo3+xrIcS/2u3p5hOxW8OJm8tw==", "dev": true, "requires": { "bn.js": "^5.1.3", "ethers": "^4.0.32", - "web3": "1.8.1" + "web3": "1.8.2" }, "dependencies": { "bn.js": { @@ -18474,61 +17076,11 @@ "strip-indent": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -18615,14 +17167,6 @@ "dev": true, "requires": { "ci-info": "^3.1.0" - }, - "dependencies": { - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - } } }, "@types/keyv": { @@ -18653,9 +17197,9 @@ "dev": true }, "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "@types/normalize-package-data": { @@ -18762,9 +17306,9 @@ } }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { @@ -18831,9 +17375,9 @@ "optional": true }, "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-escapes": { @@ -18860,18 +17404,18 @@ "dev": true }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" } }, "antlr4": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", - "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.12.0.tgz", + "integrity": "sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==", "dev": true }, "antlr4ts": { @@ -18963,18 +17507,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -18994,9 +17526,9 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { @@ -19042,9 +17574,9 @@ "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "balanced-match": { @@ -19158,13 +17690,13 @@ "dev": true }, "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -19172,7 +17704,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -19266,72 +17798,6 @@ "safe-buffer": "^5.0.1" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -19458,32 +17924,6 @@ "get-intrinsic": "^1.0.2" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -19522,12 +17962,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true } } }, @@ -19544,21 +17978,12 @@ "dev": true }, "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "dependencies": { - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "dev": true - } + "nofilter": "^3.1.0" } }, "chai": { @@ -19584,13 +18009,14 @@ "requires": {} }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "change-case": { @@ -19689,9 +18115,9 @@ "dev": true }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "cids": { @@ -19754,15 +18180,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, "cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -19774,12 +18191,6 @@ "string-width": "^2.1.1" } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -19847,18 +18258,18 @@ "dev": true }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "colors": { @@ -19883,9 +18294,9 @@ "dev": true }, "commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", "dev": true }, "compare-versions": { @@ -19913,9 +18324,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -19975,9 +18386,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "cookie": { @@ -20009,32 +18420,31 @@ } }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", + "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "argparse": "^2.0.1" } - }, - "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 } } }, @@ -20044,16 +18454,6 @@ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -20088,6 +18488,17 @@ "dev": true, "requires": { "node-fetch": "2.6.7" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + } } }, "cross-spawn": { @@ -20122,25 +18533,6 @@ "sha3": "^2.1.1" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "crypto-js": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", @@ -20237,9 +18629,9 @@ } }, "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decamelize-keys": { @@ -20252,12 +18644,6 @@ "map-obj": "^1.0.0" }, "dependencies": { - "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 - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -20320,9 +18706,9 @@ "dev": true }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "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==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", @@ -20341,16 +18727,6 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -20358,9 +18734,9 @@ "dev": true }, "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "detect-port": { @@ -20379,17 +18755,6 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, "difflib": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", @@ -20534,14 +18899,6 @@ "dev": true, "requires": { "ansi-colors": "^4.1.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - } } }, "entities": { @@ -20566,27 +18923,33 @@ } }, "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", @@ -20595,21 +18958,9 @@ "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "dependencies": { - "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - } + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "es-array-method-boxes-properly": { @@ -20618,6 +18969,17 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -20689,9 +19051,9 @@ "dev": true }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "escodegen": { @@ -20761,9 +19123,9 @@ } }, "eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz", - "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.4.1", @@ -20813,6 +19175,15 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -20829,6 +19200,27 @@ "supports-color": "^7.1.0" } }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -20848,6 +19240,12 @@ "is-glob": "^4.0.3" } }, + "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 + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -20892,6 +19290,15 @@ "requires": { "ansi-regex": "^5.0.1" } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -20953,9 +19360,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -21041,43 +19448,12 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -21105,21 +19481,6 @@ "wrap-ansi": "^5.1.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -21129,12 +19490,6 @@ "ms": "^2.1.1" } }, - "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 - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -21147,22 +19502,16 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "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, "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, "find-up": { @@ -21204,12 +19553,6 @@ "path-is-absolute": "^1.0.0" } }, - "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 - }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -21295,6 +19638,18 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -21783,6 +20138,26 @@ "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -21803,6 +20178,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } } } }, @@ -21907,23 +20294,6 @@ "reusify": "^1.0.4" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -22154,9 +20524,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -22203,70 +20573,12 @@ "requires": { "chalk": "^2.4.2", "node-emoji": "^1.10.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22286,9 +20598,9 @@ } }, "minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -22347,44 +20659,35 @@ } }, "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "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==", + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "@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", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "gopd": { @@ -22488,9 +20791,9 @@ "dev": true }, "hardhat": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.5.tgz", - "integrity": "sha512-f/t7+hLlhsnQZ6LDXyV+8rHGRZFZY1sgFvgrwr9fBjMdGp1Bu6hHq1KXS4/VFZfZcVdL1DAWWEkryinZhqce+A==", + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.7.tgz", + "integrity": "sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", @@ -22540,44 +20843,15 @@ "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tsort": "0.0.1", - "undici": "^5.4.0", + "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "commander": { @@ -22586,22 +20860,16 @@ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", + "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, "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, "find-up": { @@ -22627,12 +20895,6 @@ "path-is-absolute": "^1.0.0" } }, - "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 - }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -22740,22 +21002,13 @@ "dev": true } } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, "hardhat-exposed": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.1.tgz", - "integrity": "sha512-qyHXdS3NmzrtXF+XL547BMsTAK+IEMW9OOYMH4d362DlPn4L2B2KXKG6OpuJczxYjgMFJ0LunLxNgu6jtRvjRg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/hardhat-exposed/-/hardhat-exposed-0.3.2.tgz", + "integrity": "sha512-qhi60I2bfjoPZwKgrY7BIpuUiBE7aC/bHN2MzHxPcZdxaeFnjKJ50n59LE7yK3GK2qYzE8DMjzqfnH6SlKPUjw==", "dev": true, "requires": { "micromatch": "^4.0.4", @@ -22774,9 +21027,9 @@ } }, "hardhat-ignore-warnings": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.6.tgz", - "integrity": "sha512-GQgvjprONI8VF8b85+QJ8H9v3L9TCCtQvUx+9QaRL+sCPw1cOZHfhlEz9V6Lq7GNCQMqBORVzNzUzoP/tKAEQQ==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.8.tgz", + "integrity": "sha512-vPX94rJyTzYsCOzGIYdOcJgn3iQI6qa+CI9ZZfgDhdXJpda8ljpOT7bdUKAYC4LyoP0Z5fWTmupXoPaQrty0gw==", "dev": true, "requires": { "minimatch": "^5.1.0", @@ -22794,9 +21047,9 @@ } }, "minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -22820,9 +21073,9 @@ "dev": true }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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 }, "has-property-descriptors": { @@ -22834,6 +21087,12 @@ "get-intrinsic": "^1.1.1" } }, + "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 + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -22899,9 +21158,9 @@ "dev": true }, "highlightjs-solidity": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz", - "integrity": "sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==", "dev": true }, "hmac-drbg": { @@ -23006,6 +21265,14 @@ "requires": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" + }, + "dependencies": { + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + } } }, "https-proxy-agent": { @@ -23055,9 +21322,9 @@ "dev": true }, "immutable": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.1.tgz", - "integrity": "sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", "dev": true }, "import-fresh": { @@ -23068,6 +21335,14 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "dependencies": { + "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 + } } }, "imurmurhash": { @@ -23104,113 +21379,13 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "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 - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -23252,6 +21427,17 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -23305,14 +21491,6 @@ "dev": true, "requires": { "ci-info": "^3.2.0" - }, - "dependencies": { - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - } } }, "is-date-object": { @@ -23324,12 +21502,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -23409,9 +21581,9 @@ "dev": true }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true }, "is-port-reachable": { @@ -23540,9 +21712,9 @@ "dev": true }, "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", "dev": true }, "js-sha3": { @@ -23579,12 +21751,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -23802,6 +21968,15 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true + }, + "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, + "requires": { + "is-utf8": "^0.2.0" + } } } }, @@ -23815,14 +21990,6 @@ "js-yaml": "^3.13.0", "pify": "^4.0.1", "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } } }, "locate-path": { @@ -23864,6 +22031,12 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "lodash.zip": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", @@ -23880,6 +22053,15 @@ "is-unicode-supported": "^0.1.0" }, "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -23889,6 +22071,36 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -24008,84 +22220,11 @@ "yargs-parser": "^18.1.3" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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 - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, "type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -24138,16 +22277,6 @@ "picomatch": "^2.3.1" } }, - "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, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -24169,12 +22298,6 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -24218,9 +22341,9 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minimist-options": { @@ -24232,14 +22355,6 @@ "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", "kind-of": "^6.0.3" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - } } }, "minipass": { @@ -24262,9 +22377,9 @@ } }, "mixme": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", - "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.5.tgz", + "integrity": "sha512-/6IupbRx32s7jjEwHcycXikJwFD5UujbVNuJFkeKLYje+92OvtuPniF6JhnFm5JCTDUhS+kYK3W/4BWYQYXz7w==", "dev": true }, "mkdirp": { @@ -24352,6 +22467,12 @@ "wrap-ansi": "^7.0.0" } }, + "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 + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -24387,6 +22508,12 @@ } } }, + "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 + }, "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", @@ -24498,6 +22625,12 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -24561,12 +22694,6 @@ } } }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, "nano-base32": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", @@ -24615,12 +22742,6 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -24664,18 +22785,18 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dev": true, "requires": { "whatwg-url": "^5.0.0" } }, "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true }, "node-interval-tree": { @@ -24688,9 +22809,9 @@ } }, "nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true }, "nopt": { @@ -24780,9 +22901,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "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 }, "object-keys": { @@ -24792,15 +22913,15 @@ "dev": true }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "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, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { @@ -24848,15 +22969,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -24972,19 +23084,6 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -24998,13 +23097,15 @@ "dev": true }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { @@ -25063,12 +23164,6 @@ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -25154,6 +23249,12 @@ "find-up": "^4.0.0" } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, "preferred-pm": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", @@ -25212,45 +23313,30 @@ "dev": true }, "prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true }, "prettier-plugin-solidity": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz", - "integrity": "sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz", + "integrity": "sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g==", "dev": true, "requires": { - "@solidity-parser/parser": "^0.14.5", + "@solidity-parser/parser": "^0.15.0", "semver": "^7.3.8", "solidity-comments-extractor": "^0.0.7" }, "dependencies": { - "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==", + "@solidity-parser/parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz", + "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==", "dev": true, "requires": { - "yallist": "^4.0.0" + "antlr4ts": "^0.5.0-alpha.4" } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -25266,12 +23352,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -25314,20 +23394,6 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -25377,9 +23443,9 @@ "dev": true }, "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "randombytes": { @@ -25391,16 +23457,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -25408,9 +23464,9 @@ "dev": true }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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, "requires": { "bytes": "3.1.2", @@ -25420,63 +23476,41 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "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, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { - "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, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "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, - "requires": { - "pinkie-promise": "^2.0.0" - } + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -25490,20 +23524,12 @@ "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } } }, "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==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -25704,9 +23730,9 @@ "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "responselike": { @@ -25726,16 +23752,6 @@ } } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -25806,12 +23822,6 @@ } } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -25836,15 +23846,6 @@ "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", "dev": true }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -26239,38 +24240,44 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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 + }, + "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 } } @@ -26295,11 +24302,14 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "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, + "requires": { + "color-convert": "^2.0.1" + } }, "cliui": { "version": "6.0.0", @@ -26312,10 +24322,19 @@ "wrap-ansi": "^6.2.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 }, "is-fullwidth-code-point": { @@ -26379,16 +24398,6 @@ "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -26437,11 +24446,15 @@ "wrap-ansi": "^2.0.0" } }, - "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 + "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, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, "fs-extra": { "version": "0.30.0", @@ -26494,6 +24507,53 @@ "graceful-fs": "^4.1.6" } }, + "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, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "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, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "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, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -26592,304 +24652,99 @@ } }, "solhint": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.3.7.tgz", - "integrity": "sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.4.0.tgz", + "integrity": "sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw==", "dev": true, "requires": { - "@solidity-parser/parser": "^0.14.1", - "ajv": "^6.6.1", - "antlr4": "4.7.1", - "ast-parents": "0.0.1", - "chalk": "^2.4.2", - "commander": "2.18.0", - "cosmiconfig": "^5.0.7", - "eslint": "^5.6.0", - "fast-diff": "^1.1.2", - "glob": "^7.1.3", - "ignore": "^4.0.6", - "js-yaml": "^3.12.0", - "lodash": "^4.17.11", - "prettier": "^1.14.3", - "semver": "^6.3.0" + "@solidity-parser/parser": "^0.15.0", + "ajv": "^6.12.6", + "antlr4": "^4.11.0", + "ast-parents": "^0.0.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "fast-diff": "^1.2.0", + "glob": "^8.0.3", + "ignore": "^5.2.4", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "prettier": "^2.8.3", + "semver": "^6.3.0", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0" }, "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "@solidity-parser/parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.15.0.tgz", + "integrity": "sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==", + "dev": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "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, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" + "argparse": "^2.0.1" } }, "semver": { @@ -26898,60 +24753,30 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "ansi-regex": "^5.0.1" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "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==", - "dev": true - }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "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, "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } } } }, "solidity-ast": { - "version": "0.4.40", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.40.tgz", - "integrity": "sha512-M8uLBT2jgFB7B0iVAC5a2l71J8vim7aEm03AZkaHbDqyrl1pE+i5PriMEw6WlwGfHp3/Ym7cn9BqvVLQgRk+Yw==", + "version": "0.4.46", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz", + "integrity": "sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==", "dev": true }, "solidity-comments": { @@ -27088,32 +24913,12 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", @@ -27141,21 +24946,6 @@ "wrap-ansi": "^5.1.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -27165,12 +24955,6 @@ "ms": "^2.1.1" } }, - "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 - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -27183,12 +24967,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -27226,24 +25004,34 @@ "optional": true }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, - "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 + "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, + "requires": { + "@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" + } }, "js-yaml": { "version": "3.13.1", @@ -27274,15 +25062,6 @@ "chalk": "^2.4.2" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -27324,13 +25103,27 @@ "yargs-unparser": "1.6.0" }, "dependencies": { - "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==", + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "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" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" } } } @@ -27341,6 +25134,18 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -27392,9 +25197,9 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -27732,13 +25537,10 @@ } }, "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, - "requires": { - "is-utf8": "^0.2.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true }, "strip-hex-prefix": { "version": "1.0.0", @@ -27762,12 +25564,12 @@ "dev": true }, "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==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "swap-case": { @@ -27865,6 +25667,12 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true } } }, @@ -27889,47 +25697,72 @@ } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "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 + }, + "json-schema-traverse": { + "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 + }, + "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 }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -27994,12 +25827,6 @@ } } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -28051,9 +25878,9 @@ }, "dependencies": { "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true } } @@ -28109,6 +25936,15 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -28119,6 +25955,27 @@ "supports-color": "^7.1.0" } }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -28127,6 +25984,15 @@ "requires": { "ansi-regex": "^5.0.1" } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -28188,6 +26054,17 @@ "mime-types": "~2.1.24" } }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -28235,9 +26112,9 @@ "dev": true }, "undici": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", - "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", "dev": true, "requires": { "busboy": "^1.6.0" @@ -28374,60 +26251,46 @@ } }, "web3": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.1.tgz", - "integrity": "sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", + "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", "dev": true, "requires": { - "web3-bzz": "1.8.1", - "web3-core": "1.8.1", - "web3-eth": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-shh": "1.8.1", - "web3-utils": "1.8.1" + "web3-bzz": "1.8.2", + "web3-core": "1.8.2", + "web3-eth": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-shh": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-bzz": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.1.tgz", - "integrity": "sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", + "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", "dev": true, "requires": { "@types/node": "^12.12.6", "got": "12.1.0", "swarm-js": "^0.1.40" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - } } }, "web3-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.1.tgz", - "integrity": "sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", + "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-requestmanager": "1.8.1", - "web3-utils": "1.8.1" + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-requestmanager": "1.8.2", + "web3-utils": "1.8.2" }, "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, "bignumber.js": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", @@ -28437,107 +26300,106 @@ } }, "web3-core-helpers": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz", - "integrity": "sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", + "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", "dev": true, "requires": { - "web3-eth-iban": "1.8.1", - "web3-utils": "1.8.1" + "web3-eth-iban": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-core-method": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.1.tgz", - "integrity": "sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", + "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", "dev": true, "requires": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-utils": "1.8.1" + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-core-promievent": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz", - "integrity": "sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", + "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", "dev": true, "requires": { "eventemitter3": "4.0.4" } }, "web3-core-requestmanager": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz", - "integrity": "sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", + "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", "dev": true, "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.8.1", - "web3-providers-http": "1.8.1", - "web3-providers-ipc": "1.8.1", - "web3-providers-ws": "1.8.1" + "util": "^0.12.5", + "web3-core-helpers": "1.8.2", + "web3-providers-http": "1.8.2", + "web3-providers-ipc": "1.8.2", + "web3-providers-ws": "1.8.2" } }, "web3-core-subscriptions": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz", - "integrity": "sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", + "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" } }, "web3-eth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.1.tgz", - "integrity": "sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", + "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", "dev": true, "requires": { - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-accounts": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-eth-ens": "1.8.1", - "web3-eth-iban": "1.8.1", - "web3-eth-personal": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-accounts": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-eth-ens": "1.8.2", + "web3-eth-iban": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-eth-abi": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz", - "integrity": "sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", + "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", "dev": true, "requires": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" } }, "web3-eth-accounts": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz", - "integrity": "sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", + "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", "dev": true, "requires": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", - "crypto-browserify": "3.12.0", "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", + "ethereumjs-util": "^7.1.5", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" }, "dependencies": { "eth-lib": { @@ -28560,45 +26422,45 @@ } }, "web3-eth-contract": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz", - "integrity": "sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", + "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", "dev": true, "requires": { "@types/bn.js": "^5.1.0", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-eth-ens": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz", - "integrity": "sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", + "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", "dev": true, "requires": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-promievent": "1.8.1", - "web3-eth-abi": "1.8.1", - "web3-eth-contract": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-eth-iban": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz", - "integrity": "sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", + "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", "dev": true, "requires": { "bn.js": "^5.2.1", - "web3-utils": "1.8.1" + "web3-utils": "1.8.2" }, "dependencies": { "bn.js": { @@ -28610,87 +26472,79 @@ } }, "web3-eth-personal": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz", - "integrity": "sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", + "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", "dev": true, "requires": { "@types/node": "^12.12.6", - "web3-core": "1.8.1", - "web3-core-helpers": "1.8.1", - "web3-core-method": "1.8.1", - "web3-net": "1.8.1", - "web3-utils": "1.8.1" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - } + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-net": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.1.tgz", - "integrity": "sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", + "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", "dev": true, "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-utils": "1.8.1" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" } }, "web3-providers-http": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.1.tgz", - "integrity": "sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", + "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", "dev": true, "requires": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" } }, "web3-providers-ipc": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz", - "integrity": "sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", + "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", "dev": true, "requires": { "oboe": "2.1.5", - "web3-core-helpers": "1.8.1" + "web3-core-helpers": "1.8.2" } }, "web3-providers-ws": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz", - "integrity": "sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", + "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", "dev": true, "requires": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.1", + "web3-core-helpers": "1.8.2", "websocket": "^1.0.32" } }, "web3-shh": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.1.tgz", - "integrity": "sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", + "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", "dev": true, "requires": { - "web3-core": "1.8.1", - "web3-core-method": "1.8.1", - "web3-core-subscriptions": "1.8.1", - "web3-net": "1.8.1" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-net": "1.8.2" } }, "web3-utils": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz", - "integrity": "sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", "dev": true, "requires": { "bn.js": "^5.2.1", @@ -28859,6 +26713,30 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, "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", @@ -28893,15 +26771,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", @@ -28976,9 +26845,9 @@ "dev": true }, "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { "cliui": "^8.0.1", @@ -29031,10 +26900,22 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } }, "yargs-unparser": { "version": "2.0.0", @@ -29053,6 +26934,18 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "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 } } }, From 8b47e96af1f3fe06fb581820bbb28d51a0abd4f6 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Fri, 24 Feb 2023 21:29:49 +0100 Subject: [PATCH 194/197] Add SafeERC20.forceApprove() (#4067) --- .changeset/small-terms-sleep.md | 5 + .../mocks/token/ERC20ForceApproveMock.sol | 13 ++ contracts/mocks/token/ERC20NoReturnMock.sol | 31 ++-- .../mocks/token/ERC20PermitNoRevertMock.sol | 4 +- .../mocks/token/ERC20ReturnFalseMock.sol | 18 +- contracts/mocks/token/ERC20ReturnTrueMock.sol | 27 --- contracts/token/ERC20/utils/SafeERC20.sol | 64 ++++++- package-lock.json | 2 +- package.json | 2 +- test/token/ERC20/utils/SafeERC20.test.js | 164 +++++++++++++----- 10 files changed, 226 insertions(+), 104 deletions(-) create mode 100644 .changeset/small-terms-sleep.md create mode 100644 contracts/mocks/token/ERC20ForceApproveMock.sol delete mode 100644 contracts/mocks/token/ERC20ReturnTrueMock.sol diff --git a/.changeset/small-terms-sleep.md b/.changeset/small-terms-sleep.md new file mode 100644 index 000000000..ed184a1c4 --- /dev/null +++ b/.changeset/small-terms-sleep.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`SafeERC20`: Add a `forceApprove` function to improve compatibility with tokens behaving like USDT. diff --git a/contracts/mocks/token/ERC20ForceApproveMock.sol b/contracts/mocks/token/ERC20ForceApproveMock.sol new file mode 100644 index 000000000..955224bcf --- /dev/null +++ b/contracts/mocks/token/ERC20ForceApproveMock.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../../token/ERC20/ERC20.sol"; + +// contract that replicate USDT (0xdac17f958d2ee523a2206206994597c13d831ec7) approval beavior +abstract contract ERC20ForceApproveMock is ERC20 { + function approve(address spender, uint256 amount) public virtual override returns (bool) { + require(amount == 0 || allowance(msg.sender, spender) == 0, "USDT approval failure"); + return super.approve(spender, amount); + } +} diff --git a/contracts/mocks/token/ERC20NoReturnMock.sol b/contracts/mocks/token/ERC20NoReturnMock.sol index 023dab2cb..348c0d6bb 100644 --- a/contracts/mocks/token/ERC20NoReturnMock.sol +++ b/contracts/mocks/token/ERC20NoReturnMock.sol @@ -2,20 +2,27 @@ pragma solidity ^0.8.0; -contract ERC20NoReturnMock { - mapping(address => uint256) private _allowances; +import "../../token/ERC20/ERC20.sol"; - function transfer(address, uint256) public {} - - function transferFrom(address, address, uint256) public {} - - function approve(address, uint256) public {} - - function setAllowance(address account, uint256 allowance_) public { - _allowances[account] = allowance_; +abstract contract ERC20NoReturnMock is ERC20 { + function transfer(address to, uint256 amount) public override returns (bool) { + super.transfer(to, amount); + assembly { + return(0, 0) + } } - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; + function transferFrom(address from, address to, uint256 amount) public override returns (bool) { + super.transferFrom(from, to, amount); + assembly { + return(0, 0) + } + } + + function approve(address spender, uint256 amount) public override returns (bool) { + super.approve(spender, amount); + assembly { + return(0, 0) + } } } diff --git a/contracts/mocks/token/ERC20PermitNoRevertMock.sol b/contracts/mocks/token/ERC20PermitNoRevertMock.sol index 2b6e2503b..2176c51ae 100644 --- a/contracts/mocks/token/ERC20PermitNoRevertMock.sol +++ b/contracts/mocks/token/ERC20PermitNoRevertMock.sol @@ -5,9 +5,7 @@ pragma solidity ^0.8.0; import "../../token/ERC20/ERC20.sol"; import "../../token/ERC20/extensions/draft-ERC20Permit.sol"; -contract ERC20PermitNoRevertMock is ERC20, ERC20Permit { - constructor() ERC20("ERC20PermitNoRevertMock", "ERC20PermitNoRevertMock") ERC20Permit("ERC20PermitNoRevertMock") {} - +abstract contract ERC20PermitNoRevertMock is ERC20Permit { function permitThatMayRevert( address owner, address spender, diff --git a/contracts/mocks/token/ERC20ReturnFalseMock.sol b/contracts/mocks/token/ERC20ReturnFalseMock.sol index 3f8f64037..c4dc6921f 100644 --- a/contracts/mocks/token/ERC20ReturnFalseMock.sol +++ b/contracts/mocks/token/ERC20ReturnFalseMock.sol @@ -2,26 +2,18 @@ pragma solidity ^0.8.0; -contract ERC20ReturnFalseMock { - mapping(address => uint256) private _allowances; +import "../../token/ERC20/ERC20.sol"; - function transfer(address, uint256) public pure returns (bool) { +abstract contract ERC20ReturnFalseMock is ERC20 { + function transfer(address, uint256) public pure override returns (bool) { return false; } - function transferFrom(address, address, uint256) public pure returns (bool) { + function transferFrom(address, address, uint256) public pure override returns (bool) { return false; } - function approve(address, uint256) public pure returns (bool) { + function approve(address, uint256) public pure override returns (bool) { return false; } - - function setAllowance(address account, uint256 allowance_) public { - _allowances[account] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } } diff --git a/contracts/mocks/token/ERC20ReturnTrueMock.sol b/contracts/mocks/token/ERC20ReturnTrueMock.sol deleted file mode 100644 index 8953aad64..000000000 --- a/contracts/mocks/token/ERC20ReturnTrueMock.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract ERC20ReturnTrueMock { - mapping(address => uint256) private _allowances; - - function transfer(address, uint256) public pure returns (bool) { - return true; - } - - function transferFrom(address, address, uint256) public pure returns (bool) { - return true; - } - - function approve(address, uint256) public pure returns (bool) { - return true; - } - - function setAllowance(address account, uint256 allowance_) public { - _allowances[account] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } -} diff --git a/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/token/ERC20/utils/SafeERC20.sol index 028711ddf..2f76386d5 100644 --- a/contracts/token/ERC20/utils/SafeERC20.sol +++ b/contracts/token/ERC20/utils/SafeERC20.sol @@ -19,10 +19,18 @@ import "../../../utils/Address.sol"; library SafeERC20 { using Address for address; + /** + * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } + /** + * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the + * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. + */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } @@ -45,20 +53,45 @@ library SafeERC20 { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } + /** + * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + uint256 oldAllowance = token.allowance(address(this), spender); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } + /** + * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. + */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } + /** + * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, + * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to + * 0 before setting it to a non-zero value. + */ + function forceApprove(IERC20 token, address spender, uint256 value) internal { + bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); + + if (!_callOptionalReturnBool(token, approvalCall)) { + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); + _callOptionalReturn(token, approvalCall); + } + } + + /** + * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. + * Revert on invalid signature. + */ function safePermit( IERC20Permit token, address owner, @@ -87,9 +120,24 @@ library SafeERC20 { // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); - } + require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + * + * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. + */ + function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false + // and not revert is the subcall reverts. + + (bool success, bytes memory returndata) = address(token).call(data); + return + success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } diff --git a/package-lock.json b/package-lock.json index 87fd3a795..fc3918807 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", - "hardhat-exposed": "^0.3.1", + "hardhat-exposed": "^0.3.2", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", diff --git a/package.json b/package.json index 66d44888a..f0ee95ab0 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "glob": "^8.0.3", "graphlib": "^2.1.8", "hardhat": "^2.9.1", - "hardhat-exposed": "^0.3.1", + "hardhat-exposed": "^0.3.2", "hardhat-gas-reporter": "^1.0.4", "hardhat-ignore-warnings": "^0.2.0", "keccak256": "^1.0.2", diff --git a/test/token/ERC20/utils/SafeERC20.test.js b/test/token/ERC20/utils/SafeERC20.test.js index a6b10fae3..d4981dd30 100644 --- a/test/token/ERC20/utils/SafeERC20.test.js +++ b/test/token/ERC20/utils/SafeERC20.test.js @@ -1,10 +1,11 @@ -const { constants, expectRevert } = require('@openzeppelin/test-helpers'); +const { constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); const SafeERC20 = artifacts.require('$SafeERC20'); -const ERC20ReturnFalseMock = artifacts.require('ERC20ReturnFalseMock'); -const ERC20ReturnTrueMock = artifacts.require('ERC20ReturnTrueMock'); -const ERC20NoReturnMock = artifacts.require('ERC20NoReturnMock'); -const ERC20PermitNoRevertMock = artifacts.require('ERC20PermitNoRevertMock'); +const ERC20ReturnFalseMock = artifacts.require('$ERC20ReturnFalseMock'); +const ERC20ReturnTrueMock = artifacts.require('$ERC20'); // default implementation returns true +const ERC20NoReturnMock = artifacts.require('$ERC20NoReturnMock'); +const ERC20PermitNoRevertMock = artifacts.require('$ERC20PermitNoRevertMock'); +const ERC20ForceApproveMock = artifacts.require('$ERC20ForceApproveMock'); const { getDomain, domainType, Permit } = require('../../../helpers/eip712'); @@ -12,6 +13,9 @@ const { fromRpcSig } = require('ethereumjs-util'); const ethSigUtil = require('eth-sig-util'); const Wallet = require('ethereumjs-wallet').default; +const name = 'ERC20Mock'; +const symbol = 'ERC20Mock'; + contract('SafeERC20', function (accounts) { const [hasNoCode] = accounts; @@ -24,31 +28,31 @@ contract('SafeERC20', function (accounts) { this.token = { address: hasNoCode }; }); - shouldRevertOnAllCalls('Address: call to non-contract'); + shouldRevertOnAllCalls(accounts, 'Address: call to non-contract'); }); describe('with token that returns false on all calls', function () { beforeEach(async function () { - this.token = await ERC20ReturnFalseMock.new(); + this.token = await ERC20ReturnFalseMock.new(name, symbol); }); - shouldRevertOnAllCalls('SafeERC20: ERC20 operation did not succeed'); + shouldRevertOnAllCalls(accounts, 'SafeERC20: ERC20 operation did not succeed'); }); describe('with token that returns true on all calls', function () { beforeEach(async function () { - this.token = await ERC20ReturnTrueMock.new(); + this.token = await ERC20ReturnTrueMock.new(name, symbol); }); - shouldOnlyRevertOnErrors(); + shouldOnlyRevertOnErrors(accounts); }); describe('with token that returns no boolean values', function () { beforeEach(async function () { - this.token = await ERC20NoReturnMock.new(); + this.token = await ERC20NoReturnMock.new(name, symbol); }); - shouldOnlyRevertOnErrors(); + shouldOnlyRevertOnErrors(accounts); }); describe("with token that doesn't revert on invalid permit", function () { @@ -57,7 +61,7 @@ contract('SafeERC20', function (accounts) { const spender = hasNoCode; beforeEach(async function () { - this.token = await ERC20PermitNoRevertMock.new(); + this.token = await ERC20PermitNoRevertMock.new(name, symbol, name); this.data = await getDomain(this.token).then(domain => ({ primaryType: 'Permit', @@ -165,65 +169,134 @@ contract('SafeERC20', function (accounts) { ); }); }); + + describe('with usdt approval beaviour', function () { + const spender = hasNoCode; + + beforeEach(async function () { + this.token = await ERC20ForceApproveMock.new(name, symbol); + }); + + describe('with initial approval', function () { + beforeEach(async function () { + await this.token.$_approve(this.mock.address, spender, 100); + }); + + it('safeApprove fails to update approval to non-zero', async function () { + await expectRevert( + this.mock.$safeApprove(this.token.address, spender, 200), + 'SafeERC20: approve from non-zero to non-zero allowance', + ); + }); + + it('safeApprove can update approval to zero', async function () { + await this.mock.$safeApprove(this.token.address, spender, 0); + }); + + it('safeApprove can increase approval', async function () { + await expectRevert(this.mock.$safeIncreaseAllowance(this.token.address, spender, 10), 'USDT approval failure'); + }); + + it('safeApprove can decrease approval', async function () { + await expectRevert(this.mock.$safeDecreaseAllowance(this.token.address, spender, 10), 'USDT approval failure'); + }); + + it('forceApprove works', async function () { + await this.mock.$forceApprove(this.token.address, spender, 200); + }); + }); + }); }); -function shouldRevertOnAllCalls(reason) { +function shouldRevertOnAllCalls([receiver, spender], reason) { it('reverts on transfer', async function () { - await expectRevert(this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0), reason); + await expectRevert(this.mock.$safeTransfer(this.token.address, receiver, 0), reason); }); it('reverts on transferFrom', async function () { - await expectRevert( - this.mock.$safeTransferFrom(this.token.address, this.mock.address, constants.ZERO_ADDRESS, 0), - reason, - ); + await expectRevert(this.mock.$safeTransferFrom(this.token.address, this.mock.address, receiver, 0), reason); }); it('reverts on approve', async function () { - await expectRevert(this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0), reason); + await expectRevert(this.mock.$safeApprove(this.token.address, spender, 0), reason); }); it('reverts on increaseAllowance', async function () { // [TODO] make sure it's reverting for the right reason - await expectRevert.unspecified(this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 0)); + await expectRevert.unspecified(this.mock.$safeIncreaseAllowance(this.token.address, spender, 0)); }); it('reverts on decreaseAllowance', async function () { // [TODO] make sure it's reverting for the right reason - await expectRevert.unspecified(this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 0)); + await expectRevert.unspecified(this.mock.$safeDecreaseAllowance(this.token.address, spender, 0)); + }); + + it('reverts on forceApprove', async function () { + await expectRevert(this.mock.$forceApprove(this.token.address, spender, 0), reason); }); } -function shouldOnlyRevertOnErrors() { - it("doesn't revert on transfer", async function () { - await this.mock.$safeTransfer(this.token.address, constants.ZERO_ADDRESS, 0); - }); +function shouldOnlyRevertOnErrors([owner, receiver, spender]) { + describe('transfers', function () { + beforeEach(async function () { + await this.token.$_mint(owner, 100); + await this.token.$_mint(this.mock.address, 100); + await this.token.approve(this.mock.address, constants.MAX_UINT256, { from: owner }); + }); - it("doesn't revert on transferFrom", async function () { - await this.mock.$safeTransferFrom(this.token.address, this.mock.address, constants.ZERO_ADDRESS, 0); + it("doesn't revert on transfer", async function () { + const { tx } = await this.mock.$safeTransfer(this.token.address, receiver, 10); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: this.mock.address, + to: receiver, + value: '10', + }); + }); + + it("doesn't revert on transferFrom", async function () { + const { tx } = await this.mock.$safeTransferFrom(this.token.address, owner, receiver, 10); + await expectEvent.inTransaction(tx, this.token, 'Transfer', { + from: owner, + to: receiver, + value: '10', + }); + }); }); describe('approvals', function () { context('with zero allowance', function () { beforeEach(async function () { - await this.token.setAllowance(this.mock.address, 0); + await this.token.$_approve(this.mock.address, spender, 0); }); it("doesn't revert when approving a non-zero allowance", async function () { - await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 100); + await this.mock.$safeApprove(this.token.address, spender, 100); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('100'); }); it("doesn't revert when approving a zero allowance", async function () { - await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); + await this.mock.$safeApprove(this.token.address, spender, 0); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('0'); + }); + + it("doesn't revert when force approving a non-zero allowance", async function () { + await this.mock.$forceApprove(this.token.address, spender, 100); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('100'); + }); + + it("doesn't revert when force approving a zero allowance", async function () { + await this.mock.$forceApprove(this.token.address, spender, 0); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('0'); }); it("doesn't revert when increasing the allowance", async function () { - await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); + await this.mock.$safeIncreaseAllowance(this.token.address, spender, 10); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('10'); }); it('reverts when decreasing the allowance', async function () { await expectRevert( - this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10), + this.mock.$safeDecreaseAllowance(this.token.address, spender, 10), 'SafeERC20: decreased allowance below zero', ); }); @@ -231,31 +304,44 @@ function shouldOnlyRevertOnErrors() { context('with non-zero allowance', function () { beforeEach(async function () { - await this.token.setAllowance(this.mock.address, 100); + await this.token.$_approve(this.mock.address, spender, 100); }); it('reverts when approving a non-zero allowance', async function () { await expectRevert( - this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 20), + this.mock.$safeApprove(this.token.address, spender, 20), 'SafeERC20: approve from non-zero to non-zero allowance', ); }); it("doesn't revert when approving a zero allowance", async function () { - await this.mock.$safeApprove(this.token.address, constants.ZERO_ADDRESS, 0); + await this.mock.$safeApprove(this.token.address, spender, 0); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('0'); + }); + + it("doesn't revert when force approving a non-zero allowance", async function () { + await this.mock.$forceApprove(this.token.address, spender, 20); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('20'); + }); + + it("doesn't revert when force approving a zero allowance", async function () { + await this.mock.$forceApprove(this.token.address, spender, 0); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('0'); }); it("doesn't revert when increasing the allowance", async function () { - await this.mock.$safeIncreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 10); + await this.mock.$safeIncreaseAllowance(this.token.address, spender, 10); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('110'); }); it("doesn't revert when decreasing the allowance to a positive value", async function () { - await this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 50); + await this.mock.$safeDecreaseAllowance(this.token.address, spender, 50); + expect(await this.token.allowance(this.mock.address, spender)).to.be.bignumber.equal('50'); }); it('reverts when decreasing the allowance to a negative value', async function () { await expectRevert( - this.mock.$safeDecreaseAllowance(this.token.address, constants.ZERO_ADDRESS, 200), + this.mock.$safeDecreaseAllowance(this.token.address, spender, 200), 'SafeERC20: decreased allowance below zero', ); }); From 3f3774c5df70a7d2399810872056bb5338a09b4c Mon Sep 17 00:00:00 2001 From: Vittorio Minacori Date: Fri, 24 Feb 2023 22:28:37 +0100 Subject: [PATCH 195/197] Improve ERC1363 documentation (#3993) Co-authored-by: Francisco --- contracts/interfaces/IERC1363.sol | 31 ++++++++++++++--------- contracts/interfaces/IERC1363Receiver.sol | 11 +++++--- contracts/interfaces/IERC1363Spender.sol | 11 +++++--- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/contracts/interfaces/IERC1363.sol b/contracts/interfaces/IERC1363.sol index 1517197fe..63d87b962 100644 --- a/contracts/interfaces/IERC1363.sol +++ b/contracts/interfaces/IERC1363.sol @@ -6,6 +6,13 @@ pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC165.sol"; +/** + * @dev Interface of an ERC1363 compliant contract, as defined in the + * https://eips.ethereum.org/EIPS/eip-1363[EIP]. + * + * Defines a interface for ERC20 tokens that supports executing recipient + * code after `transfer` or `transferFrom`, or spender code after `approve`. + */ interface IERC1363 is IERC165, IERC20 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. @@ -21,53 +28,53 @@ interface IERC1363 is IERC165, IERC20 { /** * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred + * @param amount uint256 The amount of tokens to be transferred * @return true unless throwing */ - function transferAndCall(address to, uint256 value) external returns (bool); + function transferAndCall(address to, uint256 amount) external returns (bool); /** * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred + * @param amount uint256 The amount of tokens to be transferred * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ - function transferAndCall(address to, uint256 value, bytes memory data) external returns (bool); + function transferAndCall(address to, uint256 amount, bytes memory data) external returns (bool); /** * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred + * @param amount uint256 The amount of tokens to be transferred * @return true unless throwing */ - function transferFromAndCall(address from, address to, uint256 value) external returns (bool); + function transferFromAndCall(address from, address to, uint256 amount) external returns (bool); /** * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred + * @param amount uint256 The amount of tokens to be transferred * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ - function transferFromAndCall(address from, address to, uint256 value, bytes memory data) external returns (bool); + function transferFromAndCall(address from, address to, uint256 amount, bytes memory data) external returns (bool); /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender * and then call `onApprovalReceived` on spender. * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent + * @param amount uint256 The amount of tokens to be spent */ - function approveAndCall(address spender, uint256 value) external returns (bool); + function approveAndCall(address spender, uint256 amount) external returns (bool); /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender * and then call `onApprovalReceived` on spender. * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent + * @param amount uint256 The amount of tokens to be spent * @param data bytes Additional data with no specified format, sent in call to `spender` */ - function approveAndCall(address spender, uint256 value, bytes memory data) external returns (bool); + function approveAndCall(address spender, uint256 amount, bytes memory data) external returns (bool); } diff --git a/contracts/interfaces/IERC1363Receiver.sol b/contracts/interfaces/IERC1363Receiver.sol index bc5eaddb0..f5e7a0c28 100644 --- a/contracts/interfaces/IERC1363Receiver.sol +++ b/contracts/interfaces/IERC1363Receiver.sol @@ -3,6 +3,10 @@ pragma solidity ^0.8.0; +/** + * @dev Interface for any contract that wants to support {IERC1363-transferAndCall} + * or {IERC1363-transferFromAndCall} from {ERC1363} token contracts. + */ interface IERC1363Receiver { /* * Note: the ERC-165 identifier for this interface is 0x88a7ca5c. @@ -18,15 +22,14 @@ interface IERC1363Receiver { * Note: the token contract address is always the message sender. * @param operator address The address which called `transferAndCall` or `transferFromAndCall` function * @param from address The address which are token transferred from - * @param value uint256 The amount of tokens transferred + * @param amount uint256 The amount of tokens transferred * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` - * unless throwing + * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` unless throwing */ function onTransferReceived( address operator, address from, - uint256 value, + uint256 amount, bytes memory data ) external returns (bytes4); } diff --git a/contracts/interfaces/IERC1363Spender.sol b/contracts/interfaces/IERC1363Spender.sol index 28775e140..16dd5e0fe 100644 --- a/contracts/interfaces/IERC1363Spender.sol +++ b/contracts/interfaces/IERC1363Spender.sol @@ -3,6 +3,10 @@ pragma solidity ^0.8.0; +/** + * @dev Interface for any contract that wants to support {IERC1363-approveAndCall} + * from {ERC1363} token contracts. + */ interface IERC1363Spender { /* * Note: the ERC-165 identifier for this interface is 0x7b04a2d0. @@ -17,10 +21,9 @@ interface IERC1363Spender { * transaction being reverted. * Note: the token contract address is always the message sender. * @param owner address The address which called `approveAndCall` function - * @param value uint256 The amount of tokens to be spent + * @param amount uint256 The amount of tokens to be spent * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` - * unless throwing + * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`unless throwing */ - function onApprovalReceived(address owner, uint256 value, bytes memory data) external returns (bytes4); + function onApprovalReceived(address owner, uint256 amount, bytes memory data) external returns (bytes4); } From 2c69f9f9f5d0e59bba030f6eba5495f7a6991162 Mon Sep 17 00:00:00 2001 From: Clayton Rabenda Date: Sat, 25 Feb 2023 05:31:54 +0800 Subject: [PATCH 196/197] Fix comment on ERC777._beforeTokenTransfer (#3982) --- contracts/token/ERC777/ERC777.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/token/ERC777/ERC777.sol b/contracts/token/ERC777/ERC777.sol index 0e5af5d08..aa95b1843 100644 --- a/contracts/token/ERC777/ERC777.sol +++ b/contracts/token/ERC777/ERC777.sol @@ -498,7 +498,7 @@ contract ERC777 is Context, IERC777, IERC20 { /** * @dev Hook that is called before any token transfer. This includes - * calls to {send}, {transfer}, {operatorSend}, minting and burning. + * calls to {send}, {transfer}, {operatorSend}, {transferFrom}, minting and burning. * * Calling conditions: * From dad73159df3d3053c72b5e430fa8164330f18068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Fri, 24 Feb 2023 14:48:08 -0700 Subject: [PATCH 197/197] Add AccessControlDefaultAdminRules (#4009) Co-authored-by: Hadrien Croubois Co-authored-by: Francisco --- .changeset/silent-dancers-type.md | 5 + contracts/access/AccessControl.sol | 3 +- .../access/AccessControlDefaultAdminRules.sol | 240 +++++++++++++++ .../IAccessControlDefaultAdminRules.sol | 73 +++++ contracts/access/Ownable.sol | 4 +- contracts/access/README.adoc | 2 + contracts/interfaces/README.adoc | 2 + docs/modules/ROOT/pages/access-control.adoc | 2 + .../ROOT/pages/extending-contracts.adoc | 2 + test/access/AccessControl.behavior.js | 284 ++++++++++++++++++ .../AccessControlDefaultAdminRules.test.js | 18 ++ test/access/Ownable.test.js | 10 +- test/access/Ownable2Step.test.js | 22 +- .../SupportsInterface.behavior.js | 9 + 14 files changed, 666 insertions(+), 10 deletions(-) create mode 100644 .changeset/silent-dancers-type.md create mode 100644 contracts/access/AccessControlDefaultAdminRules.sol create mode 100644 contracts/access/IAccessControlDefaultAdminRules.sol create mode 100644 test/access/AccessControlDefaultAdminRules.test.js diff --git a/.changeset/silent-dancers-type.md b/.changeset/silent-dancers-type.md new file mode 100644 index 000000000..74ecf500d --- /dev/null +++ b/.changeset/silent-dancers-type.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': minor +--- + +`AccessControlDefaultAdminRules`: Add an extension of `AccessControl` with additional security rules for the `DEFAULT_ADMIN_ROLE`. diff --git a/contracts/access/AccessControl.sol b/contracts/access/AccessControl.sol index 5f2829e74..3a73de78b 100644 --- a/contracts/access/AccessControl.sol +++ b/contracts/access/AccessControl.sol @@ -44,7 +44,8 @@ import "../utils/introspection/ERC165.sol"; * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { diff --git a/contracts/access/AccessControlDefaultAdminRules.sol b/contracts/access/AccessControlDefaultAdminRules.sol new file mode 100644 index 000000000..e3bce6b75 --- /dev/null +++ b/contracts/access/AccessControlDefaultAdminRules.sol @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControlDefaultAdminRules.sol) + +pragma solidity ^0.8.0; + +import "./AccessControl.sol"; +import "./IAccessControlDefaultAdminRules.sol"; +import "../utils/math/SafeCast.sol"; +import "../interfaces/IERC5313.sol"; + +/** + * @dev Extension of {AccessControl} that allows specifying special rules to manage + * the `DEFAULT_ADMIN_ROLE` holder, which is a sensitive role with special permissions + * over other roles that may potentially have privileged rights in the system. + * + * If a specific role doesn't have an admin role assigned, the holder of the + * `DEFAULT_ADMIN_ROLE` will have the ability to grant it and revoke it. + * + * This contract implements the following risk mitigations on top of {AccessControl}: + * + * * Only one account holds the `DEFAULT_ADMIN_ROLE` since deployment until it's potentially renounced. + * * Enforce a 2-step process to transfer the `DEFAULT_ADMIN_ROLE` to another account. + * * Enforce a configurable delay between the two steps, with the ability to cancel in between. + * - Even after the timer has passed to avoid locking it forever. + * * It is not possible to use another role to manage the `DEFAULT_ADMIN_ROLE`. + * + * Example usage: + * + * ```solidity + * contract MyToken is AccessControlDefaultAdminRules { + * constructor() AccessControlDefaultAdminRules( + * 3 days, + * msg.sender // Explicit initial `DEFAULT_ADMIN_ROLE` holder + * ) {} + *} + * ``` + * + * NOTE: The `delay` can only be set in the constructor and is fixed thereafter. + * + * _Available since v4.9._ + */ +abstract contract AccessControlDefaultAdminRules is IAccessControlDefaultAdminRules, IERC5313, AccessControl { + uint48 private immutable _defaultAdminDelay; + + address private _currentDefaultAdmin; + address private _pendingDefaultAdmin; + + uint48 private _defaultAdminTransferDelayedUntil; + + /** + * @dev Sets the initial values for {defaultAdminDelay} in seconds and {defaultAdmin}. + * + * The `defaultAdminDelay` value is immutable. It can only be set at the constructor. + */ + constructor(uint48 defaultAdminDelay_, address initialDefaultAdmin) { + _defaultAdminDelay = defaultAdminDelay_; + _grantRole(DEFAULT_ADMIN_ROLE, initialDefaultAdmin); + } + + /** + * @dev See {IERC5313-owner}. + */ + function owner() public view virtual returns (address) { + return defaultAdmin(); + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function defaultAdminDelay() public view virtual returns (uint48) { + return _defaultAdminDelay; + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function defaultAdmin() public view virtual returns (address) { + return _currentDefaultAdmin; + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function pendingDefaultAdmin() public view virtual returns (address) { + return _pendingDefaultAdmin; + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function defaultAdminTransferDelayedUntil() public view virtual returns (uint48) { + return _defaultAdminTransferDelayedUntil; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControlDefaultAdminRules).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function beginDefaultAdminTransfer(address newAdmin) public virtual onlyRole(DEFAULT_ADMIN_ROLE) { + _beginDefaultAdminTransfer(newAdmin); + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function acceptDefaultAdminTransfer() public virtual { + require(_msgSender() == pendingDefaultAdmin(), "AccessControl: pending admin must accept"); + _acceptDefaultAdminTransfer(); + } + + /** + * @inheritdoc IAccessControlDefaultAdminRules + */ + function cancelDefaultAdminTransfer() public virtual onlyRole(DEFAULT_ADMIN_ROLE) { + _resetDefaultAdminTransfer(); + } + + /** + * @dev Revokes `role` from the calling account. + * + * For `DEFAULT_ADMIN_ROLE`, only allows renouncing in two steps, so it's required + * that the {defaultAdminTransferDelayedUntil} has passed and the pending default admin is the zero address. + * After its execution, it will not be possible to call `onlyRole(DEFAULT_ADMIN_ROLE)` + * functions. + * + * For other roles, see {AccessControl-renounceRole}. + * + * NOTE: Renouncing `DEFAULT_ADMIN_ROLE` will leave the contract without a defaultAdmin, + * thereby disabling any functionality that is only available to the default admin, and the + * possibility of reassigning a non-administrated role. + */ + function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { + if (role == DEFAULT_ADMIN_ROLE) { + require( + pendingDefaultAdmin() == address(0) && _hasDefaultAdminTransferDelayPassed(), + "AccessControl: only can renounce in two delayed steps" + ); + } + super.renounceRole(role, account); + } + + /** + * @dev See {AccessControl-grantRole}. Reverts for `DEFAULT_ADMIN_ROLE`. + */ + function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { + require(role != DEFAULT_ADMIN_ROLE, "AccessControl: can't directly grant default admin role"); + super.grantRole(role, account); + } + + /** + * @dev See {AccessControl-revokeRole}. Reverts for `DEFAULT_ADMIN_ROLE`. + */ + function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { + require(role != DEFAULT_ADMIN_ROLE, "AccessControl: can't directly revoke default admin role"); + super.revokeRole(role, account); + } + + /** + * @dev See {AccessControl-_setRoleAdmin}. Reverts for `DEFAULT_ADMIN_ROLE`. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual override { + require(role != DEFAULT_ADMIN_ROLE, "AccessControl: can't violate default admin rules"); + super._setRoleAdmin(role, adminRole); + } + + /** + * @dev Grants `role` to `account`. + * + * For `DEFAULT_ADMIN_ROLE`, it only allows granting if there isn't already a role's holder + * or if the role has been previously renounced. + * + * For other roles, see {AccessControl-renounceRole}. + * + * NOTE: Exposing this function through another mechanism may make the + * `DEFAULT_ADMIN_ROLE` assignable again. Make sure to guarantee this is + * the expected behavior in your implementation. + */ + function _grantRole(bytes32 role, address account) internal virtual override { + if (role == DEFAULT_ADMIN_ROLE) { + require(defaultAdmin() == address(0), "AccessControl: default admin already granted"); + _currentDefaultAdmin = account; + } + super._grantRole(role, account); + } + + /** + * @dev See {acceptDefaultAdminTransfer}. + * + * Internal function without access restriction. + */ + function _acceptDefaultAdminTransfer() internal virtual { + require(_hasDefaultAdminTransferDelayPassed(), "AccessControl: transfer delay not passed"); + _revokeRole(DEFAULT_ADMIN_ROLE, defaultAdmin()); + _grantRole(DEFAULT_ADMIN_ROLE, pendingDefaultAdmin()); + _resetDefaultAdminTransfer(); + } + + /** + * @dev See {beginDefaultAdminTransfer}. + * + * Internal function without access restriction. + */ + function _beginDefaultAdminTransfer(address newAdmin) internal virtual { + _defaultAdminTransferDelayedUntil = SafeCast.toUint48(block.timestamp) + defaultAdminDelay(); + _pendingDefaultAdmin = newAdmin; + emit DefaultAdminRoleChangeStarted(pendingDefaultAdmin(), defaultAdminTransferDelayedUntil()); + } + + /** + * @dev See {AccessControl-_revokeRole}. + */ + function _revokeRole(bytes32 role, address account) internal virtual override { + if (role == DEFAULT_ADMIN_ROLE) { + delete _currentDefaultAdmin; + } + super._revokeRole(role, account); + } + + /** + * @dev Resets the pending default admin and delayed until. + */ + function _resetDefaultAdminTransfer() private { + delete _pendingDefaultAdmin; + delete _defaultAdminTransferDelayedUntil; + } + + /** + * @dev Checks if a {defaultAdminTransferDelayedUntil} has been set and passed. + */ + function _hasDefaultAdminTransferDelayPassed() private view returns (bool) { + uint48 delayedUntil = defaultAdminTransferDelayedUntil(); + return delayedUntil > 0 && delayedUntil < block.timestamp; + } +} diff --git a/contracts/access/IAccessControlDefaultAdminRules.sol b/contracts/access/IAccessControlDefaultAdminRules.sol new file mode 100644 index 000000000..753c7c802 --- /dev/null +++ b/contracts/access/IAccessControlDefaultAdminRules.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.9.0 (access/IAccessControlDefaultAdminRules.sol) + +pragma solidity ^0.8.0; + +import "./IAccessControl.sol"; + +/** + * @dev External interface of AccessControlDefaultAdminRules declared to support ERC165 detection. + * + * _Available since v4.9._ + */ +interface IAccessControlDefaultAdminRules is IAccessControl { + /** + * @dev Emitted when a `DEFAULT_ADMIN_ROLE` transfer is started, setting `newDefaultAdmin` + * as the next default admin, which will have rights to claim the `DEFAULT_ADMIN_ROLE` + * after `defaultAdminTransferDelayedUntil` has passed. + */ + event DefaultAdminRoleChangeStarted(address indexed newDefaultAdmin, uint48 defaultAdminTransferDelayedUntil); + + /** + * @dev Returns the delay between each `DEFAULT_ADMIN_ROLE` transfer. + */ + function defaultAdminDelay() external view returns (uint48); + + /** + * @dev Returns the address of the current `DEFAULT_ADMIN_ROLE` holder. + */ + function defaultAdmin() external view returns (address); + + /** + * @dev Returns the address of the pending `DEFAULT_ADMIN_ROLE` holder. + */ + function pendingDefaultAdmin() external view returns (address); + + /** + * @dev Returns the timestamp after which the pending default admin can claim the `DEFAULT_ADMIN_ROLE`. + */ + function defaultAdminTransferDelayedUntil() external view returns (uint48); + + /** + * @dev Starts a `DEFAULT_ADMIN_ROLE` transfer by setting a pending default admin + * and a timer to pass. + * + * Requirements: + * + * - Only can be called by the current `DEFAULT_ADMIN_ROLE` holder. + * + * Emits a {DefaultAdminRoleChangeStarted}. + */ + function beginDefaultAdminTransfer(address newAdmin) external; + + /** + * @dev Completes a `DEFAULT_ADMIN_ROLE` transfer. + * + * Requirements: + * + * - Caller should be the pending default admin. + * - `DEFAULT_ADMIN_ROLE` should be granted to the caller. + * - `DEFAULT_ADMIN_ROLE` should be revoked from the previous holder. + */ + function acceptDefaultAdminTransfer() external; + + /** + * @dev Cancels a `DEFAULT_ADMIN_ROLE` transfer. + * + * Requirements: + * + * - Can be called even after the timer has passed. + * - Can only be called by the current `DEFAULT_ADMIN_ROLE` holder. + */ + function cancelDefaultAdminTransfer() external; +} diff --git a/contracts/access/Ownable.sol b/contracts/access/Ownable.sol index 6d4e866f4..1378ffb43 100644 --- a/contracts/access/Ownable.sol +++ b/contracts/access/Ownable.sol @@ -53,10 +53,10 @@ abstract contract Ownable is Context { /** * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. + * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. + * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); diff --git a/contracts/access/README.adoc b/contracts/access/README.adoc index 888d0e99e..80ca0020f 100644 --- a/contracts/access/README.adoc +++ b/contracts/access/README.adoc @@ -23,3 +23,5 @@ This directory provides ways to restrict who can access the functions of a contr {{IAccessControlEnumerable}} {{AccessControlEnumerable}} + +{{AccessControlDefaultAdminRules}} diff --git a/contracts/interfaces/README.adoc b/contracts/interfaces/README.adoc index 710c078e8..4525bc9a2 100644 --- a/contracts/interfaces/README.adoc +++ b/contracts/interfaces/README.adoc @@ -64,6 +64,8 @@ are useful to interact with third party contracts that implement them. {{IERC4626}} +{{IERC5313}} + {{IERC5267}} {{IERC5805}} diff --git a/docs/modules/ROOT/pages/access-control.adoc b/docs/modules/ROOT/pages/access-control.adoc index f3ddb6234..56d91e1c1 100644 --- a/docs/modules/ROOT/pages/access-control.adoc +++ b/docs/modules/ROOT/pages/access-control.adoc @@ -131,6 +131,8 @@ Every role has an associated admin role, which grants permission to call the `gr This mechanism can be used to create complex permissioning structures resembling organizational charts, but it also provides an easy way to manage simpler applications. `AccessControl` includes a special role, called `DEFAULT_ADMIN_ROLE`, which acts as the **default admin role for all roles**. An account with this role will be able to manage any other role, unless `_setRoleAdmin` is used to select a new admin role. +Since it is the admin for all roles by default, and in fact it is also its own admin, this role carries significant risk. To mitigate this risk we provide xref:api:access.adoc#AccessControlDefaultAdminRules[`AccessControlDefaultAdminRules`], a recommended extension of `AccessControl` that adds a number of enforced security measures for this role: the admin is restricted to a single account, with a 2-step transfer procedure with a delay in between steps. + Let's take a look at the ERC20 token example, this time taking advantage of the default admin role: [source,solidity] diff --git a/docs/modules/ROOT/pages/extending-contracts.adoc b/docs/modules/ROOT/pages/extending-contracts.adoc index a440f4067..d12ef7585 100644 --- a/docs/modules/ROOT/pages/extending-contracts.adoc +++ b/docs/modules/ROOT/pages/extending-contracts.adoc @@ -66,6 +66,8 @@ contract ModifiedAccessControl is AccessControl { The `super.revokeRole` statement at the end will invoke ``AccessControl``'s original version of `revokeRole`, the same code that would've run if there were no overrides in place. +NOTE: The same rule is implemented and extended in xref:api:access.adoc#AccessControlDefaultAdminRules[`AccessControlDefaultAdminRules`], an extension that also adds enforced security measures for the `DEFAULT_ADMIN_ROLE`. + [[using-hooks]] == Using Hooks diff --git a/test/access/AccessControl.behavior.js b/test/access/AccessControl.behavior.js index a93560983..e04c5a165 100644 --- a/test/access/AccessControl.behavior.js +++ b/test/access/AccessControl.behavior.js @@ -1,5 +1,7 @@ const { expectEvent, expectRevert } = require('@openzeppelin/test-helpers'); +const { ZERO_ADDRESS } = require('@openzeppelin/test-helpers/src/constants'); const { expect } = require('chai'); +const { time } = require('@nomicfoundation/hardhat-network-helpers'); const { shouldSupportInterfaces } = require('../utils/introspection/SupportsInterface.behavior'); @@ -210,8 +212,290 @@ function shouldBehaveLikeAccessControlEnumerable(errorPrefix, admin, authorized, }); } +function shouldBehaveLikeAccessControlDefaultAdminRules(errorPrefix, delay, defaultAdmin, newDefaultAdmin, other) { + shouldSupportInterfaces(['AccessControlDefaultAdminRules']); + + it('has a default disabled delayed until', async function () { + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(web3.utils.toBN(0)); + }); + + it('has a default pending default admin', async function () { + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(ZERO_ADDRESS); + }); + + it('has a default current owner set to the initial default admin', async function () { + const owner = await this.accessControl.owner(); + expect(owner).to.equal(defaultAdmin); + expect(await this.accessControl.hasRole(DEFAULT_ADMIN_ROLE, owner)).to.be.true; + }); + + it('should revert if granting default admin role', async function () { + await expectRevert( + this.accessControl.grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin, { from: defaultAdmin }), + `${errorPrefix}: can't directly grant default admin role`, + ); + }); + + it('should revert if revoking default admin role', async function () { + await expectRevert( + this.accessControl.revokeRole(DEFAULT_ADMIN_ROLE, defaultAdmin, { from: defaultAdmin }), + `${errorPrefix}: can't directly revoke default admin role`, + ); + }); + + it("should revert if defaultAdmin's admin is changed", async function () { + await expectRevert( + this.accessControl.$_setRoleAdmin(DEFAULT_ADMIN_ROLE, defaultAdmin), + `${errorPrefix}: can't violate default admin rules`, + ); + }); + + it('should not grant the default admin role twice', async function () { + await expectRevert( + this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin), + `${errorPrefix}: default admin already granted`, + ); + }); + + describe('begins transfer of default admin', function () { + let receipt; + let defaultAdminTransferDelayedUntil; + + beforeEach('begins admin transfer', async function () { + receipt = await this.accessControl.beginDefaultAdminTransfer(newDefaultAdmin, { from: defaultAdmin }); + defaultAdminTransferDelayedUntil = web3.utils.toBN(await time.latest()).add(delay); + }); + + it('should set pending default admin and delayed until', async function () { + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(newDefaultAdmin); + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal( + defaultAdminTransferDelayedUntil, + ); + expectEvent(receipt, 'DefaultAdminRoleChangeStarted', { + newDefaultAdmin, + defaultAdminTransferDelayedUntil, + }); + }); + + it('should be able to begin a transfer again before delay pass', async function () { + // Time passes just before delay + await time.setNextBlockTimestamp(defaultAdminTransferDelayedUntil.subn(1)); + + // defaultAdmin changes its mind and begin again to another address + await this.accessControl.beginDefaultAdminTransfer(other, { from: defaultAdmin }); + const newDelayedUntil = web3.utils.toBN(await time.latest()).add(delay); + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(other); + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(newDelayedUntil); + }); + + it('should be able to begin a transfer again after delay pass if not accepted', async function () { + // Time passes after delay without acceptance + await time.setNextBlockTimestamp(defaultAdminTransferDelayedUntil.addn(1)); + + // defaultAdmin changes its mind and begin again to another address + await this.accessControl.beginDefaultAdminTransfer(other, { from: defaultAdmin }); + const newDelayedUntil = web3.utils.toBN(await time.latest()).add(delay); + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(other); + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(newDelayedUntil); + }); + + it('should revert if it is called by non-admin accounts', async function () { + await expectRevert( + this.accessControl.beginDefaultAdminTransfer(newDefaultAdmin, { from: other }), + `${errorPrefix}: account ${other.toLowerCase()} is missing role ${DEFAULT_ADMIN_ROLE}`, + ); + }); + }); + + describe('accepts transfer admin', function () { + let delayPassed; + + beforeEach(async function () { + await this.accessControl.beginDefaultAdminTransfer(newDefaultAdmin, { from: defaultAdmin }); + delayPassed = web3.utils + .toBN(await time.latest()) + .add(delay) + .addn(1); + }); + + describe('caller is pending default admin and delay has passed', function () { + let from; + + beforeEach(async function () { + await time.setNextBlockTimestamp(delayPassed); + from = newDefaultAdmin; + }); + + it('accepts a transfer and changes default admin', async function () { + const receipt = await this.accessControl.acceptDefaultAdminTransfer({ from }); + + // Storage changes + expect(await this.accessControl.hasRole(DEFAULT_ADMIN_ROLE, defaultAdmin)).to.be.false; + expect(await this.accessControl.hasRole(DEFAULT_ADMIN_ROLE, newDefaultAdmin)).to.be.true; + expect(await this.accessControl.owner()).to.equal(newDefaultAdmin); + + // Emit events + expectEvent(receipt, 'RoleRevoked', { + role: DEFAULT_ADMIN_ROLE, + account: defaultAdmin, + }); + expectEvent(receipt, 'RoleGranted', { + role: DEFAULT_ADMIN_ROLE, + account: newDefaultAdmin, + }); + + // Resets pending default admin and delayed until + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(web3.utils.toBN(0)); + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(ZERO_ADDRESS); + }); + }); + + it('should revert if caller is not pending default admin', async function () { + await time.setNextBlockTimestamp(delayPassed); + await expectRevert( + this.accessControl.acceptDefaultAdminTransfer({ from: other }), + `${errorPrefix}: pending admin must accept`, + ); + }); + + describe('delayedUntil not passed', function () { + let delayNotPassed; + + beforeEach(function () { + delayNotPassed = delayPassed.subn(1); + }); + + it('should revert if block.timestamp is equal to delayed until', async function () { + await time.setNextBlockTimestamp(delayNotPassed); + await expectRevert( + this.accessControl.acceptDefaultAdminTransfer({ from: newDefaultAdmin }), + `${errorPrefix}: transfer delay not passed`, + ); + }); + + it('should revert if block.timestamp is less than delayed until', async function () { + await expectRevert( + this.accessControl.acceptDefaultAdminTransfer({ from: newDefaultAdmin }), + `${errorPrefix}: transfer delay not passed`, + ); + }); + }); + }); + + describe('cancel transfer default admin', function () { + let delayPassed; + + beforeEach(async function () { + await this.accessControl.beginDefaultAdminTransfer(newDefaultAdmin, { from: defaultAdmin }); + delayPassed = web3.utils + .toBN(await time.latest()) + .add(delay) + .addn(1); + }); + + it('resets pending default admin and delayed until', async function () { + await this.accessControl.cancelDefaultAdminTransfer({ from: defaultAdmin }); + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(web3.utils.toBN(0)); + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(ZERO_ADDRESS); + + // Advance until passed delay + await time.setNextBlockTimestamp(delayPassed); + + // Previous pending default admin should not be able to accept after cancellation. + await expectRevert( + this.accessControl.acceptDefaultAdminTransfer({ from: newDefaultAdmin }), + `${errorPrefix}: pending admin must accept`, + ); + }); + + it('cancels even after delay has passed', async function () { + await this.accessControl.cancelDefaultAdminTransfer({ from: defaultAdmin }); + await time.setNextBlockTimestamp(delayPassed); + expect(await this.accessControl.defaultAdminTransferDelayedUntil()).to.be.bignumber.equal(web3.utils.toBN(0)); + expect(await this.accessControl.pendingDefaultAdmin()).to.equal(ZERO_ADDRESS); + }); + + it('reverts if called by non default admin accounts', async function () { + await expectRevert( + this.accessControl.cancelDefaultAdminTransfer({ from: other }), + `${errorPrefix}: account ${other.toLowerCase()} is missing role ${DEFAULT_ADMIN_ROLE}`, + ); + }); + }); + + describe('renouncing admin', function () { + let delayPassed; + let from = defaultAdmin; + + beforeEach(async function () { + await this.accessControl.beginDefaultAdminTransfer(ZERO_ADDRESS, { from }); + delayPassed = web3.utils + .toBN(await time.latest()) + .add(delay) + .addn(1); + }); + + it('it renounces role', async function () { + await time.setNextBlockTimestamp(delayPassed); + const receipt = await this.accessControl.renounceRole(DEFAULT_ADMIN_ROLE, from, { from }); + + expect(await this.accessControl.hasRole(DEFAULT_ADMIN_ROLE, defaultAdmin)).to.be.false; + expect(await this.accessControl.hasRole(ZERO_ADDRESS, defaultAdmin)).to.be.false; + expectEvent(receipt, 'RoleRevoked', { + role: DEFAULT_ADMIN_ROLE, + account: from, + }); + expect(await this.accessControl.owner()).to.equal(ZERO_ADDRESS); + }); + + it('allows to recover access using the internal _grantRole', async function () { + await time.setNextBlockTimestamp(delayPassed); + await this.accessControl.renounceRole(DEFAULT_ADMIN_ROLE, from, { from }); + + const grantRoleReceipt = await this.accessControl.$_grantRole(DEFAULT_ADMIN_ROLE, other); + expectEvent(grantRoleReceipt, 'RoleGranted', { + role: DEFAULT_ADMIN_ROLE, + account: other, + }); + }); + + it('reverts if caller is not default admin', async function () { + await time.setNextBlockTimestamp(delayPassed); + await expectRevert( + this.accessControl.renounceRole(DEFAULT_ADMIN_ROLE, other, { from }), + `${errorPrefix}: can only renounce roles for self`, + ); + }); + + describe('delayed until not passed', function () { + let delayNotPassed; + + beforeEach(function () { + delayNotPassed = delayPassed.subn(1); + }); + + it('reverts if block.timestamp is equal to delayed until', async function () { + await time.setNextBlockTimestamp(delayNotPassed); + await expectRevert( + this.accessControl.renounceRole(DEFAULT_ADMIN_ROLE, defaultAdmin, { from }), + `${errorPrefix}: only can renounce in two delayed steps`, + ); + }); + + it('reverts if block.timestamp is less than delayed until', async function () { + await time.setNextBlockTimestamp(delayNotPassed.subn(1)); + await expectRevert( + this.accessControl.renounceRole(DEFAULT_ADMIN_ROLE, defaultAdmin, { from }), + `${errorPrefix}: only can renounce in two delayed steps`, + ); + }); + }); + }); +} + module.exports = { DEFAULT_ADMIN_ROLE, shouldBehaveLikeAccessControl, shouldBehaveLikeAccessControlEnumerable, + shouldBehaveLikeAccessControlDefaultAdminRules, }; diff --git a/test/access/AccessControlDefaultAdminRules.test.js b/test/access/AccessControlDefaultAdminRules.test.js new file mode 100644 index 000000000..2a23d3b6d --- /dev/null +++ b/test/access/AccessControlDefaultAdminRules.test.js @@ -0,0 +1,18 @@ +const { time } = require('@openzeppelin/test-helpers'); +const { + shouldBehaveLikeAccessControl, + shouldBehaveLikeAccessControlDefaultAdminRules, +} = require('./AccessControl.behavior.js'); + +const AccessControlDefaultAdminRules = artifacts.require('$AccessControlDefaultAdminRules'); + +contract('AccessControlDefaultAdminRules', function (accounts) { + const delay = web3.utils.toBN(time.duration.days(10)); + + beforeEach(async function () { + this.accessControl = await AccessControlDefaultAdminRules.new(delay, accounts[0], { from: accounts[0] }); + }); + + shouldBehaveLikeAccessControl('AccessControl', ...accounts); + shouldBehaveLikeAccessControlDefaultAdminRules('AccessControl', delay, ...accounts); +}); diff --git a/test/access/Ownable.test.js b/test/access/Ownable.test.js index dc308f98f..109150874 100644 --- a/test/access/Ownable.test.js +++ b/test/access/Ownable.test.js @@ -37,7 +37,7 @@ contract('Ownable', function (accounts) { }); describe('renounce ownership', function () { - it('loses owner after renouncement', async function () { + it('loses ownership after renouncement', async function () { const receipt = await this.ownable.renounceOwnership({ from: owner }); expectEvent(receipt, 'OwnershipTransferred'); @@ -47,5 +47,13 @@ contract('Ownable', function (accounts) { it('prevents non-owners from renouncement', async function () { await expectRevert(this.ownable.renounceOwnership({ from: other }), 'Ownable: caller is not the owner'); }); + + it('allows to recover access using the internal _transferOwnership', async function () { + await this.ownable.renounceOwnership({ from: owner }); + const receipt = await this.ownable.$_transferOwnership(other); + expectEvent(receipt, 'OwnershipTransferred'); + + expect(await this.ownable.owner()).to.equal(other); + }); }); }); diff --git a/test/access/Ownable2Step.test.js b/test/access/Ownable2Step.test.js index 64d432762..ce043057b 100644 --- a/test/access/Ownable2Step.test.js +++ b/test/access/Ownable2Step.test.js @@ -27,6 +27,16 @@ contract('Ownable2Step', function (accounts) { expect(await this.ownable2Step.pendingOwner()).to.not.equal(accountA); }); + it('guards transfer against invalid user', async function () { + await this.ownable2Step.transferOwnership(accountA, { from: owner }); + await expectRevert( + this.ownable2Step.acceptOwnership({ from: accountB }), + 'Ownable2Step: caller is not the new owner', + ); + }); + }); + + it('renouncing ownership', async function () { it('changes owner after renouncing ownership', async function () { await this.ownable2Step.renounceOwnership({ from: owner }); // If renounceOwnership is removed from parent an alternative is needed ... @@ -46,12 +56,12 @@ contract('Ownable2Step', function (accounts) { ); }); - it('guards transfer against invalid user', async function () { - await this.ownable2Step.transferOwnership(accountA, { from: owner }); - await expectRevert( - this.ownable2Step.acceptOwnership({ from: accountB }), - 'Ownable2Step: caller is not the new owner', - ); + it('allows to recover access using the internal _transferOwnership', async function () { + await this.ownable.renounceOwnership({ from: owner }); + const receipt = await this.ownable.$_transferOwnership(accountA); + expectEvent(receipt, 'OwnershipTransferred'); + + expect(await this.ownable.owner()).to.equal(accountA); }); }); }); diff --git a/test/utils/introspection/SupportsInterface.behavior.js b/test/utils/introspection/SupportsInterface.behavior.js index 02d147884..5ffe242ed 100644 --- a/test/utils/introspection/SupportsInterface.behavior.js +++ b/test/utils/introspection/SupportsInterface.behavior.js @@ -37,6 +37,15 @@ const INTERFACES = { 'renounceRole(bytes32,address)', ], AccessControlEnumerable: ['getRoleMember(bytes32,uint256)', 'getRoleMemberCount(bytes32)'], + AccessControlDefaultAdminRules: [ + 'defaultAdminDelay()', + 'defaultAdmin()', + 'defaultAdminTransferDelayedUntil()', + 'pendingDefaultAdmin()', + 'beginDefaultAdminTransfer(address)', + 'acceptDefaultAdminTransfer()', + 'cancelDefaultAdminTransfer()', + ], Governor: [ 'name()', 'version()',