From ba4e65d9cbde7e8274329d5c514793541413c434 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Wed, 22 Jan 2025 14:43:27 +0600 Subject: [PATCH 01/61] Add Polygon Amoy --- hardhat.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hardhat.config.ts b/hardhat.config.ts index 0f4b90c0..5987f0d8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -36,6 +36,11 @@ const config: HardhatUserConfig = { accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], }, + polygon_amoy: { + url: `https://rpc-amoy.polygon.technology/`, + accounts: + process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], + }, hardhat: { // blockGasLimit: 100000000429720 }, From 3ef835306a41dd4656815a2465350ba8e29e839f Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Wed, 22 Jan 2025 14:48:10 +0600 Subject: [PATCH 02/61] Added _pledge as a reusable utility --- src/treasuries/AllOrNothing.sol | 120 ++++++++++++++++---------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index 541bee54..688835db 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -106,7 +106,7 @@ contract AllOrNothing is */ error AllOrNothingFeeNotDisbursed(); /** - * @dev Emitted when a `Reward` already exists for given input. + * @dev Emitted when a `Reward` already exists for given input. */ error AllOrNothingRewardExists(); @@ -241,28 +241,13 @@ contract AllOrNothing is whenCampaignNotPaused whenNotPaused { - uint256 prelaunchPledgeAmount = PRELAUNCH_PLEDGE; - bool success = TOKEN.transferFrom( - backer, - address(this), - prelaunchPledgeAmount - ); - if (!success) { - revert AllOrNothingTransferFailed(); - } uint256 tokenId = s_tokenIdCounter.current(); - s_tokenIdCounter.increment(); - _safeMint( - backer, - tokenId, - abi.encodePacked(backer, " PreLaunchPledge") - ); - s_pledgedAmountInCrypto += prelaunchPledgeAmount; bytes32[] memory emptyByteArray = new bytes32[](0); - emit Receipt( + + _pledge( backer, ZERO_BYTES, - prelaunchPledgeAmount, + PRELAUNCH_PLEDGE, tokenId, true, emptyByteArray @@ -284,7 +269,6 @@ contract AllOrNothing is whenNotPaused { uint256 tokenId = s_tokenIdCounter.current(); - bool success; uint256 rewardLen = reward.length; Reward storage tempReward = s_reward[reward[0]]; if ( @@ -302,27 +286,7 @@ contract AllOrNothing is } pledgeAmount += s_reward[reward[i]].rewardValue; } - success = TOKEN.transferFrom(backer, address(this), pledgeAmount); - if (success) { - s_tokenIdCounter.increment(); - _safeMint( - backer, - tokenId, - abi.encodePacked(backer, " ", reward[0]) - ); - s_tokenToPledgedAmount[tokenId] = pledgeAmount; - s_pledgedAmountInCrypto += pledgeAmount; - emit Receipt( - backer, - reward[0], - pledgeAmount, - tokenId, - false, - reward - ); - } else { - revert AllOrNothingTransferFailed(); - } + _pledge(backer, reward[0], pledgeAmount, tokenId, false, reward); } /** @@ -339,21 +303,17 @@ contract AllOrNothing is whenCampaignNotPaused whenNotPaused { - bool success = TOKEN.transferFrom(backer, address(this), pledgeAmount); - if (success) { - s_pledgedAmountInCrypto += pledgeAmount; - bytes32[] memory emptyByteArray = new bytes32[](0); - emit Receipt( - backer, - ZERO_BYTES, - pledgeAmount, - 0, - false, - emptyByteArray - ); - } else { - revert AllOrNothingTransferFailed(); - } + uint256 tokenId = s_tokenIdCounter.current(); + bytes32[] memory emptyByteArray = new bytes32[](0); + + _pledge( + backer, + ZERO_BYTES, + pledgeAmount, + tokenId, + false, + emptyByteArray + ); } /** @@ -364,10 +324,15 @@ contract AllOrNothing is uint256 tokenId ) external - currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) + currentTimeIsGreater(INFO.getLaunchTime()) whenCampaignNotPaused whenNotPaused { + if (block.timestamp >= INFO.getDeadline()) { + if (_checkSuccessCondition()) { + revert AllOrNothingNotClaimable(tokenId); + } + } uint256 amount = s_tokenToPledgedAmount[tokenId]; if (amount == 0) { revert AllOrNothingNotClaimable(tokenId); @@ -385,12 +350,49 @@ contract AllOrNothing is /** * @inheritdoc ICampaignTreasury */ - function disburseFees() public override currentTimeIsGreater(INFO.getDeadline()) { + function disburseFees() + public + override + currentTimeIsGreater(INFO.getDeadline()) + { if (!s_cryptoFeeDisbursed) { super.disburseFees(); } } + function _pledge( + address backer, + bytes32 reward, + uint256 pledgeAmount, + uint256 tokenId, + bool isPreLaunchPledge, + bytes32[] memory rewards + ) internal { + bool success = TOKEN.transferFrom(backer, address(this), pledgeAmount); + if (success) { + s_tokenIdCounter.increment(); + _safeMint( + backer, + tokenId, + abi.encodePacked(backer, isPreLaunchPledge, reward) + ); + if (!isPreLaunchPledge) { + s_tokenToPledgedAmount[tokenId] = pledgeAmount; + } + s_pledgedAmountInCrypto += pledgeAmount; + emit Receipt( + backer, + reward, + pledgeAmount, + tokenId, + isPreLaunchPledge, + rewards + ); + } else { + revert AllOrNothingTransferFailed(); + } + } + /** * @dev Checks if the caller is the platform admin. */ @@ -419,4 +421,4 @@ contract AllOrNothing is ) public view override returns (bool) { return super.supportsInterface(interfaceId); } -} \ No newline at end of file +} From c5b6d82a2415d11db5382cca172518dd5dd0b223 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Thu, 23 Jan 2025 07:55:47 +0600 Subject: [PATCH 03/61] Add function to add rewards in batch --- src/treasuries/AllOrNothing.sol | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index 688835db..df184fa6 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -174,6 +174,41 @@ contract AllOrNothing is emit RewardAdded(rewardName, reward); } + /** + * @notice Adds multiple rewards in a batch. + * @param rewardNames An array of reward names. + * @param rewards An array of `Reward` structs containing reward details. + */ + function addRewardsBatch( + bytes32[] calldata rewardNames, + Reward[] calldata rewards + ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { + if (rewardNames.length != rewards.length) { + revert AllOrNothingInvalidInput(); + } + + for (uint256 i = 0; i < rewardNames.length; i++) { + bytes32 rewardName = rewardNames[i]; + Reward calldata reward = rewards[i]; + + if ( + reward.rewardValue == 0 && + reward.itemId.length == 0 && + reward.itemId.length == reward.itemValue.length && + reward.itemId.length == reward.itemQuantity.length + ) { + revert AllOrNothingInvalidInput(); + } + if (s_reward[rewardName].rewardValue != 0) { + revert AllOrNothingRewardExists(); + } + + s_reward[rewardName] = reward; + s_rewardCounter.increment(); + emit RewardAdded(rewardName, reward); + } + } + /** * @notice Removes a reward from the campaign. * @param rewardName The name of the reward. From 13d9d746c7f79b76f03c178fe64b679ba803191a Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Thu, 23 Jan 2025 07:56:05 +0600 Subject: [PATCH 04/61] Add function to add items in batch --- src/utils/ItemRegistry.sol | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/utils/ItemRegistry.sol b/src/utils/ItemRegistry.sol index 125ab2e6..ac801af9 100644 --- a/src/utils/ItemRegistry.sol +++ b/src/utils/ItemRegistry.sol @@ -36,4 +36,27 @@ contract ItemRegistry is IItem, Context { Items[_msgSender()][itemId] = item; emit ItemAdded(_msgSender(), itemId, item); } + + /** + * @notice Adds multiple items in a batch. + * @param itemIds An array of unique item identifiers. + * @param items An array of `Item` structs containing item attributes. + */ + function addItemsBatch( + bytes32[] calldata itemIds, + Item[] calldata items + ) external { + require( + itemIds.length == items.length, + "ItemRegistry: Mismatched arrays length" + ); + + for (uint256 i = 0; i < itemIds.length; i++) { + bytes32 itemId = itemIds[i]; + Item calldata item = items[i]; + + Items[_msgSender()][itemId] = item; + emit ItemAdded(_msgSender(), itemId, item); + } + } } From 305129fef7676314518927fb058a7b03fe6df140 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:54:01 +0800 Subject: [PATCH 05/61] Add Openzeppelin library --- .gitmodules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitmodules b/.gitmodules index 888d42dc..690924b6 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/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts From 21bf78c72ce26b304d36e1dcb85a7801f9ccd134 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:54:21 +0800 Subject: [PATCH 06/61] Update .env example --- env.example | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/env.example b/env.example index b26a69fd..4c5b7440 100644 --- a/env.example +++ b/env.example @@ -1,2 +1,17 @@ -RPC_URL="" -PRIVATE_KEY="" \ No newline at end of file +# ------------------------- +# Deploy Config +# ------------------------- +PRIVATE_KEY= +RPC_URL= + +# Optionally set this to reuse already-deployed contracts. +# If any are left blank, they will be freshly deployed. + +# ------------------------- +# Contract Addresses +# ------------------------- +TEST_USD_ADDRESS="" +GLOBAL_PARAMS_ADDRESS="" +TREASURY_FACTORY_ADDRESS="" +CAMPAIGN_INFO_FACTORY_ADDRESS="" +SIMULATE=true \ No newline at end of file From 2946df8d044dbfe6015b7472c0a3e6ab68a6380f Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:55:18 +0800 Subject: [PATCH 07/61] Update foundry configs --- foundry.toml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/foundry.toml b/foundry.toml index def4f299..3c29c44e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,13 +1,16 @@ [profile.default] src = "src" out = "artifacts" -libs = [ - "lib", - "node_modules", +libs = ["lib"] +via_ir = true +optimizer = true +optimizer_runs = 200 +solc_version = "0.8.20" + +remappings = [ + "@openzeppelin/=lib/openzeppelin-contracts/" ] -remappings = ["@openzeppelin/=node_modules/@openzeppelin/"] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options [rpc_endpoints] alfajores = "${ALFAJORES_RPC_URL}" From e35053f355972564e4825e43458499869c2a5f6b Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:55:58 +0800 Subject: [PATCH 08/61] Remove hardhat deps --- hardhat.config.ts | 53 - package-lock.json | 15850 -------------------------------------------- package.json | 17 - remappings.txt | 6 - 4 files changed, 15926 deletions(-) delete mode 100644 hardhat.config.ts delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 remappings.txt diff --git a/hardhat.config.ts b/hardhat.config.ts deleted file mode 100644 index 5987f0d8..00000000 --- a/hardhat.config.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as dotenv from "dotenv"; - -import { HardhatUserConfig } from "hardhat/config"; -import "@nomicfoundation/hardhat-toolbox"; -import "@nomicfoundation/hardhat-foundry"; - -dotenv.config(); - -const { ALCHEMY_API_KEY } = process.env; - -const config: HardhatUserConfig = { - solidity: { - version: "0.8.9", - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - }, - }, - networks: { - alfajores: { - url: `https://alfajores-forno.celo-testnet.org`, - accounts: - process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], - }, - celo_mainnet: { - url: `https://forno.celo.org`, - accounts: - process.env.MAINNET_PRIVATE_KEY !== undefined - ? [process.env.MAINNET_PRIVATE_KEY] - : [], - }, - polygon_mumbai: { - url: `https://polygon-mumbai.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, - accounts: - process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], - }, - polygon_amoy: { - url: `https://rpc-amoy.polygon.technology/`, - accounts: - process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], - }, - hardhat: { - // blockGasLimit: 100000000429720 - }, - }, - paths: { - sources: "./src", - } -}; - -export default config; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 440830e4..00000000 --- a/package-lock.json +++ /dev/null @@ -1,15850 +0,0 @@ -{ - "name": "hardhat-project", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "hardhat-project", - "dependencies": { - "@openzeppelin/contracts": "^4.7.3", - "bn.js": "^5.2.1", - "dotenv": "^16.0.3" - }, - "devDependencies": { - "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", - "hardhat": "^2.17.3" - } - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "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/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/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.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "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.1", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.1.tgz", - "integrity": "sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ==", - "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/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/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.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "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/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@metamask/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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dev": true, - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "dev": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "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/@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.3.tgz", - "integrity": "sha512-qEE7Drs2HSY+krH09TXm6P9LFogs0BqbUq6wPD7nQRhmJ+p5zoDaIZjM5WL1pHqU5MpGqya3y+BdwmTYBfU5UA==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "chalk": "^2.4.2", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "chai": "^4.2.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.4" - } - }, - "node_modules/@nomicfoundation/hardhat-foundry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.1.1.tgz", - "integrity": "sha512-cXGCBHAiXas9Pg9MhMOpBVQCkWRYoRFG7GJJAph+sdQsfd22iRs5U5Vs9XmpGEQd1yEvYISQZMeE68Nxj65iUQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "peerDependencies": { - "hardhat": "^2.17.2" - } - }, - "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, - "peer": true, - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz", - "integrity": "sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ==", - "dev": true, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/chai": "^4.2.0", - "@types/mocha": "^9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.1.0", - "typescript": ">=4.5.0" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "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.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.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" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "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" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz", - "integrity": "sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA==", - "dev": true, - "peer": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz", - "integrity": "sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^5.0.2", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.4.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" - }, - "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/@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, - "peer": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.1.0.tgz", - "integrity": "sha512-3LIb+eUpV3mNCrjUKT5oqp8PBsZYSnVrkfk6pY/ZM0boRs2mKxjFZ7bktx42vfDye8PPz3NxtW4DL5NsNsFqlg==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.0", - "typescript": ">=4.3.0" - } - }, - "node_modules/@typechain/hardhat": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.3.tgz", - "integrity": "sha512-e1H9MVl286ma0HuD9CBL248+pbdA7lWF6+I7FYwzykIrjilKhvLUv0Q7LtcyZztzgbP2g4Tyg1UPE+xy+qR7cA==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.1.0", - "ethers": "^5.4.7", - "hardhat": "^2.9.9", - "typechain": "^8.1.0" - } - }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "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/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, - "peer": true - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "@types/minimatch": "*", - "@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, - "peer": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true, - "peer": true - }, - "node_modules/@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==", - "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/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true, - "peer": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true, - "peer": true - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/readable-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/@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, - "peer": true - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "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/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.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, - "peer": 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.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=0.4.2" - } - }, - "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/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-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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/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, - "peer": 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/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": true - }, - "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/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "peer": 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, - "peer": true, - "engines": { - "node": "*" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": 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, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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/bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true, - "peer": 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/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==" - }, - "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/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": "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/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-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/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", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.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, - "peer": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "peer": true - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "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, - "peer": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "peer": 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-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "peer": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chai/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, - "peer": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "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/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, - "peer": 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, - "peer": true, - "engines": { - "node": "*" - } - }, - "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/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/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/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "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-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, - "peer": true, - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "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/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/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/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/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "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, - "peer": 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/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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/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" - ], - "peer": true, - "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, - "peer": 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, - "peer": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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/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, - "peer": true - }, - "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-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/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "peer": 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, - "peer": 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/deep-eql": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.1.tgz", - "integrity": "sha512-rc6HkZswtl+KMi/IODZ8k7C/P37clC2Rf1HYI11GqdbgvggIyHjsU5MdjlTlaP6eu24c0sR3mcW2SqsVZ1sXUw==", - "dev": true, - "peer": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "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, - "peer": true - }, - "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, - "peer": 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, - "peer": 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/detect-port": { - "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, - "peer": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "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/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "peer": true, - "dependencies": { - "heap": ">= 0.2.0" - }, - "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, - "peer": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, - "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, - "peer": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "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/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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/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/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/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "peer": 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.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.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-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", - "safe-regex-test": "^1.0.0", - "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-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, - "peer": 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", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "peer": true - }, - "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, - "peer": 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/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-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/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, - "peer": 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/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=0.10.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, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": 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/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "peer": 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/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, - "peer": 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, - "peer": 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" - ], - "peer": true, - "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, - "peer": 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/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, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "peer": 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/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-abi/node_modules/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, - "peer": 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/ethers": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.1.tgz", - "integrity": "sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.1", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "peer": 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, - "peer": 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/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/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "peer": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "peer": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "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/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/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/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, - "peer": 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, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true, - "peer": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "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/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "peer": true, - "dependencies": { - "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, - "peer": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "peer": 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, - "peer": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hardhat": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.3.tgz", - "integrity": "sha512-SFZoYVXW1bWJZrIIKXOA+IgcctfuKXDwENywiYNT2dM3YQc4fXNaTbuk/vpPzHIF50upByx4zW5EqczKYQubsA==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "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, - "peer": 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/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/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "peer": 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, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/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, - "peer": 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, - "peer": 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, - "peer": 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/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true, - "peer": 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/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "peer": true, - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "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-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, - "peer": 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, - "peer": 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, - "peer": 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/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/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "peer": 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/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, - "peer": true - }, - "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, - "peer": 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, - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, - "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/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "peer": 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, - "peer": 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.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "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, - "peer": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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-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, - "peer": 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, - "peer": 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-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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "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, - "peer": 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-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "peer": true, - "dependencies": { - "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, - "peer": 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, - "peer": 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, - "peer": true - }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "node_modules/js-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/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "peer": 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/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, - "peer": 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/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/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/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.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "peer": 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, - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "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/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", - "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/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.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "peer": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, - "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/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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "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, - "peer": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "peer": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "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/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/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", - "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/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/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/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/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/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/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.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "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/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, - "peer": 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, - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "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/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "peer": true, - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">= 0.4" - } - }, - "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, - "peer": 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/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, - "peer": 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/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "peer": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "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/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "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-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/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/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": "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/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, - "peer": true - }, - "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/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-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-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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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, - "peer": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "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, - "peer": true - }, - "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, - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "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, - "peer": true - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/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/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/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, - "peer": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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/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, - "peer": 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, - "peer": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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": "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/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, - "peer": true - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "peer": true, - "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, - "peer": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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/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/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/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" - } - ], - "peer": true, - "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/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/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, - "peer": 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", - "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, - "peer": 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/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "peer": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "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, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true, - "peer": true - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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": "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/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/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true - }, - "node_modules/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, - "peer": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "peer": 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/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": 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, - "peer": 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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-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, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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/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/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/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/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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/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, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true - }, - "node_modules/solidity-coverage/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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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" - ], - "peer": true, - "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, - "peer": 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/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/solidity-coverage/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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/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, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "peer": 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/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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/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", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "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-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": "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/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, - "peer": 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, - "peer": 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, - "peer": 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-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": 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, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true - }, - "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, - "peer": 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, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": 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, - "peer": true - }, - "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, - "peer": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-command-line-args/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, - "peer": 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/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-command-line-args/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, - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-command-line-args/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, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "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, - "peer": 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-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, - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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/typechain": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.0.tgz", - "integrity": "sha512-5jToLgKTjHdI1VKqs/K8BLYy42Sr3o8bV5ojh4MnR9ExHO83cyyUdw+7+vMJCpKXUiVUvARM4qmHTFuyaCMAZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "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/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "peer": true - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz", - "integrity": "sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "peer": 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/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, - "dependencies": { - "busboy": "^1.6.0" - }, - "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/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "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, - "peer": true - }, - "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/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-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": true - }, - "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" - ], - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/web3-utils": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.0.tgz", - "integrity": "sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ==", - "dev": true, - "peer": 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/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "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, - "peer": 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, - "peer": true - }, - "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, - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "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, - "peer": 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, - "peer": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "peer": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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/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", - "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/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/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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/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": "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/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/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/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/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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": { - "@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@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", - "@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" - } - }, - "@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", - "@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" - } - }, - "@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", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@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", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "@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" - } - }, - "@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", - "@ethersproject/properties": "^5.7.0" - } - }, - "@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", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@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" - } - }, - "@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" - } - }, - "@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", - "@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" - } - }, - "@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", - "@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" - } - }, - "@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", - "@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" - } - }, - "@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", - "@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" - } - }, - "@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", - "js-sha3": "0.8.0" - } - }, - "@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.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" - } - }, - "@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", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@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" - } - }, - "@ethersproject/providers": { - "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", - "@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" - } - }, - "@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", - "@ethersproject/logger": "^5.7.0" - } - }, - "@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", - "@ethersproject/logger": "^5.7.0" - } - }, - "@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", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@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", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@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", - "@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" - } - }, - "@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", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@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", - "@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" - } - }, - "@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", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@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", - "@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" - } - }, - "@ethersproject/web": { - "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", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@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", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "peer": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "peer": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "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": "*" - } - }, - "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 - }, - "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", - "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" - } - } - } - }, - "@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, - "peer": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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, - "peer": 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, - "peer": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - } - }, - "@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - } - }, - "@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } - }, - "@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dev": true, - "requires": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "dev": true - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - } - }, - "@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "dev": true, - "requires": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@ethersproject/providers": { - "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", - "@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" - } - } - } - }, - "@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", - "dev": true, - "requires": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - } - } - }, - "@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.3.tgz", - "integrity": "sha512-qEE7Drs2HSY+krH09TXm6P9LFogs0BqbUq6wPD7nQRhmJ+p5zoDaIZjM5WL1pHqU5MpGqya3y+BdwmTYBfU5UA==", - "dev": true, - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "chalk": "^2.4.2", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - } - }, - "@nomicfoundation/hardhat-foundry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.1.1.tgz", - "integrity": "sha512-cXGCBHAiXas9Pg9MhMOpBVQCkWRYoRFG7GJJAph+sdQsfd22iRs5U5Vs9XmpGEQd1yEvYISQZMeE68Nxj65iUQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "@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, - "peer": true, - "requires": { - "ethereumjs-util": "^7.1.4" - } - }, - "@nomicfoundation/hardhat-toolbox": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz", - "integrity": "sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ==", - "dev": true, - "requires": {} - }, - "@nomicfoundation/solidity-analyzer": { - "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.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.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.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.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.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.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.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.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.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.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.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 - }, - "@nomiclabs/hardhat-ethers": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz", - "integrity": "sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA==", - "dev": true, - "peer": true, - "requires": {} - }, - "@nomiclabs/hardhat-etherscan": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz", - "integrity": "sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==", - "dev": true, - "peer": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^5.0.2", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.4.0" - } - }, - "@openzeppelin/contracts": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" - }, - "@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", - "@noble/secp256k1": "~1.6.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==", - "dev": true, - "requires": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "@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", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@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", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@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", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@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", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - } - }, - "@sentry/tracing": { - "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", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@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", - "tslib": "^1.9.3" - } - }, - "@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, - "peer": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "peer": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "peer": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "peer": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "peer": true - }, - "@typechain/ethers-v5": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.1.0.tgz", - "integrity": "sha512-3LIb+eUpV3mNCrjUKT5oqp8PBsZYSnVrkfk6pY/ZM0boRs2mKxjFZ7bktx42vfDye8PPz3NxtW4DL5NsNsFqlg==", - "dev": true, - "peer": true, - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "@typechain/hardhat": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.3.tgz", - "integrity": "sha512-e1H9MVl286ma0HuD9CBL248+pbdA7lWF6+I7FYwzykIrjilKhvLUv0Q7LtcyZztzgbP2g4Tyg1UPE+xy+qR7cA==", - "dev": true, - "peer": true, - "requires": { - "fs-extra": "^9.1.0" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^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, - "peer": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "peer": true - } - } - }, - "@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": "*" - } - }, - "@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, - "peer": true - }, - "@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "peer": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@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, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@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, - "peer": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@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, - "peer": true - }, - "@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true, - "peer": true - }, - "@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==", - "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": "*" - } - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true, - "peer": true - }, - "@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, - "peer": true - }, - "@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "requires": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - }, - "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 - } - } - }, - "@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": "*" - } - }, - "@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, - "peer": 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", - "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" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "peer": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "peer": 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, - "peer": 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.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "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" - } - }, - "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", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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, - "peer": true - }, - "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-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" - } - }, - "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, - "peer": 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" - } - }, - "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, - "peer": 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", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "peer": 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 - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "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" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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" - } - }, - "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, - "peer": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": 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 - }, - "bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "dev": true - }, - "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, - "peer": 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 - }, - "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==" - }, - "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" - } - }, - "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" - } - }, - "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", - "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", - "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", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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" - } - }, - "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", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "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" - } - }, - "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-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "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", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "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, - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - }, - "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "peer": true, - "requires": { - "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" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "type-detect": "^4.0.0" - } - } - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "peer": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "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" - } - }, - "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, - "peer": 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, - "peer": true - }, - "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", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "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 - }, - "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", - "safe-buffer": "^5.0.1" - } - }, - "classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "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", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "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, - "peer": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "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", - "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 - }, - "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" - } - } - } - }, - "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 - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "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 - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "peer": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "peer": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true - } - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "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, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "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, - "peer": 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" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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 - }, - "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, - "peer": 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-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", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "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", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "peer": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "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, - "peer": 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" - } - }, - "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 - }, - "deep-eql": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.1.tgz", - "integrity": "sha512-rc6HkZswtl+KMi/IODZ8k7C/P37clC2Rf1HYI11GqdbgvggIyHjsU5MdjlTlaP6eu24c0sR3mcW2SqsVZ1sXUw==", - "dev": true, - "peer": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "peer": 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 - }, - "detect-port": { - "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, - "peer": true, - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "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 - }, - "difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "peer": 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", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "peer": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" - }, - "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, - "peer": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "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", - "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" - }, - "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 - } - } - }, - "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 - }, - "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" - } - }, - "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 - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "peer": 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.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.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-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", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "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, - "peer": 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": { - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "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 - }, - "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, - "peer": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "@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" - }, - "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, - "peer": 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, - "peer": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "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, - "peer": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "peer": 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, - "peer": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "peer": true, - "requires": { - "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" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": 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" - } - }, - "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, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true, - "peer": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "peer": 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" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "dev": true, - "peer": true - }, - "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, - "peer": 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, - "peer": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } - }, - "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, - "peer": true, - "requires": { - "js-sha3": "^0.8.0" - } - }, - "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", - "@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" - } - }, - "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", - "ethereumjs-util": "^6.0.0" - }, - "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": "*" - } - }, - "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 - }, - "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", - "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" - } - } - } - }, - "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, - "peer": true, - "requires": { - "@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" - } - }, - "ethers": { - "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", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.1", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "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, - "peer": 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", - "strip-hex-prefix": "1.0.0" - } - }, - "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" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "@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" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "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" - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "peer": true, - "requires": { - "array-back": "^3.0.1" - } - }, - "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" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "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 - }, - "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", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "peer": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.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" - } - }, - "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" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "peer": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "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, - "peer": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "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, - "peer": 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" - } - }, - "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 - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hardhat": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.3.tgz", - "integrity": "sha512-SFZoYVXW1bWJZrIIKXOA+IgcctfuKXDwENywiYNT2dM3YQc4fXNaTbuk/vpPzHIF50upByx4zW5EqczKYQubsA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "dependencies": { - "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", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - } - } - }, - "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, - "peer": true, - "requires": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "peer": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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, - "peer": 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 - }, - "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, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "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", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "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", - "minimalistic-assert": "^1.0.1" - } - }, - "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 - }, - "heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true, - "peer": 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", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "peer": true, - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - } - }, - "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", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "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, - "peer": true, - "requires": { - "@types/node": "^10.0.3" - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "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", - "debug": "4" - } - }, - "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" - } - }, - "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": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "peer": 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 - }, - "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", - "wrappy": "1" - } - }, - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "peer": 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" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "peer": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "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" - } - }, - "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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "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.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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, - "peer": true - }, - "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" - } - }, - "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-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, - "peer": 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, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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-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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "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, - "peer": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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, - "peer": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "peer": 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-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "peer": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "peer": true - }, - "js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "dev": true - }, - "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-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" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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" - } - }, - "jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "peer": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "peer": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "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", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "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, - "peer": 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" - } - }, - "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", - "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-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "peer": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "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", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "peer": 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, - "peer": 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", - "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", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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" - } - } - } - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "peer": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "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", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "peer": 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, - "peer": 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", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "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, - "peer": 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, - "peer": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "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" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "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" - } - }, - "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", - "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" - }, - "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 - }, - "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" - } - }, - "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", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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" - } - } - } - }, - "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 - }, - "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.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "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, - "peer": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true - } - } - }, - "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 - }, - "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, - "peer": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "peer": true, - "requires": { - "abbrev": "1" - } - }, - "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 - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "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, - "peer": true, - "requires": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - } - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "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" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "peer": 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" - } - }, - "ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "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-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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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, - "peer": 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 - }, - "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-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-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, - "peer": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "peer": 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", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "asap": "~2.0.6" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "peer": true - }, - "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, - "peer": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "peer": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "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", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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" - } - }, - "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, - "peer": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^3.0.5" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "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, - "peer": true, - "requires": { - "req-from": "^2.0.0" - } - }, - "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, - "peer": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "peer": true, - "requires": { - "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" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "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, - "peer": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "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": "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 - }, - "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, - "peer": 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" - } - }, - "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, - "peer": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "peer": 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" - } - }, - "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", - "inherits": "^2.0.1" - } - }, - "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" - } - }, - "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, - "peer": true, - "requires": { - "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", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "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 - }, - "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, - "peer": 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", - "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, - "peer": true, - "requires": { - "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" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "peer": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "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", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "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" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true - }, - "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", - "safe-buffer": "^5.0.1" - } - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "peer": true, - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "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, - "peer": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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", - "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" - }, - "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", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.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" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": 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, - "peer": true, - "requires": { - "@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" - }, - "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, - "peer": 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, - "peer": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "peer": 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, - "peer": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "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, - "peer": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": 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" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "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, - "peer": true, - "requires": { - "yallist": "^4.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, - "peer": 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, - "peer": 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, - "peer": 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" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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, - "peer": 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, - "peer": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "has-flag": "^3.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, - "peer": 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, - "peer": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } - }, - "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, - "peer": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "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", - "source-map": "^0.6.0" - }, - "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 - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "peer": true, - "requires": { - "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" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "peer": 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" - }, - "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 - } - } - }, - "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, - "peer": true - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "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-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "peer": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "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, - "peer": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "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" - } - }, - "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": "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" - } - }, - "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, - "peer": true, - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "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, - "peer": true, - "requires": { - "get-port": "^3.1.0" - } - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "peer": 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.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "peer": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "@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" - }, - "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, - "peer": true - } - } - }, - "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" - } - }, - "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" - } - }, - "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, - "peer": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.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, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true - } - } - }, - "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, - "peer": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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-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, - "peer": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "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, - "peer": true - }, - "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 - }, - "typechain": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.0.tgz", - "integrity": "sha512-5jToLgKTjHdI1VKqs/K8BLYy42Sr3o8bV5ojh4MnR9ExHO83cyyUdw+7+vMJCpKXUiVUvARM4qmHTFuyaCMAZQ==", - "dev": true, - "peer": true, - "requires": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "peer": true, - "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" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "peer": true - } - } - }, - "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, - "peer": true - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "peer": true - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "peer": true - }, - "uglify-js": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz", - "integrity": "sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==", - "dev": true, - "optional": true, - "peer": 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, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, - "requires": { - "busboy": "^1.6.0" - } - }, - "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 - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true, - "peer": true - }, - "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 - }, - "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-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "peer": 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, - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3-utils": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.0.tgz", - "integrity": "sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ==", - "dev": true, - "peer": 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" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "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, - "peer": true, - "requires": { - "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" - } - }, - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "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, - "peer": 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, - "peer": true - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "peer": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": 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", - "string-width": "^4.1.0", - "strip-ansi": "^6.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 - }, - "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", - "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" - } - } - } - }, - "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 - }, - "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, - "requires": {} - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "peer": 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 - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "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", - "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" - }, - "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" - } - }, - "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" - } - } - } - }, - "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", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "peer": 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 - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 7f469110..00000000 --- a/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "hardhat-project", - "scripts": { - "hardhat:compile": "hardhat compile", - "hardhat:test": "hardhat test" - }, - "devDependencies": { - "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", - "hardhat": "^2.17.3" - }, - "dependencies": { - "@openzeppelin/contracts": "^4.7.3", - "bn.js": "^5.2.1", - "dotenv": "^16.0.3" - } -} diff --git a/remappings.txt b/remappings.txt deleted file mode 100644 index 6dbf4c1e..00000000 --- a/remappings.txt +++ /dev/null @@ -1,6 +0,0 @@ -@openzeppelin/=node_modules/@openzeppelin/ -ds-test/=lib/forge-std/lib/ds-test/src/ -eth-gas-reporter/=node_modules/eth-gas-reporter/ -forge-std/=lib/forge-std/src/ -hardhat/=node_modules/hardhat/ - From 06ecd966b756f6a7dda8b38d5ae65799ce93ea6e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:56:41 +0800 Subject: [PATCH 09/61] Remove hardhat scripts --- lib/utils.ts | 10 -- scripts/CampaignDemo.ts | 311 ----------------------------------- scripts/demo.ts | 94 ----------- scripts/deploy.ts | 36 ---- scripts/deployCampaign.ts | 117 ------------- scripts/deployInitialize.ts | 262 ----------------------------- scripts/deployWithPreMint.ts | 56 ------- scripts/feeSplit.ts | 165 ------------------- scripts/feeSplitVelocity.ts | 151 ----------------- 9 files changed, 1202 deletions(-) delete mode 100644 lib/utils.ts delete mode 100644 scripts/CampaignDemo.ts delete mode 100644 scripts/demo.ts delete mode 100644 scripts/deploy.ts delete mode 100644 scripts/deployCampaign.ts delete mode 100644 scripts/deployInitialize.ts delete mode 100644 scripts/deployWithPreMint.ts delete mode 100644 scripts/feeSplit.ts delete mode 100644 scripts/feeSplitVelocity.ts diff --git a/lib/utils.ts b/lib/utils.ts deleted file mode 100644 index d60346aa..00000000 --- a/lib/utils.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ethers } from "hardhat"; - -export const hexString = (val: string) => { -const { hexlify, toUtf8Bytes, hexZeroPad } = ethers.utils; - return hexZeroPad(hexlify(toUtf8Bytes(val)), 32); -}; - -export const hashString = (val: string) => { - return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(val)); -} diff --git a/scripts/CampaignDemo.ts b/scripts/CampaignDemo.ts deleted file mode 100644 index 2e34e900..00000000 --- a/scripts/CampaignDemo.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { ethers, artifacts } from "hardhat"; -import { - CampaignInfoFactory, - CampaignInfo, - CampaignRegistry, - CampaignTreasury, - CampaignFeeSplitter, - CampaignNFT, - CampaignGlobalParameters, - TestUSD, - CampaignGlobalParameters__factory, -} from "../typechain-types"; -import { getHexString } from "../lib/utils"; -import { library } from "../typechain-types/contracts"; - -async function main() { - const [owner] = await ethers.getSigners(); - - // Parameters - const platformWallet1 = "0xA2a6f51aF77c1bF8eB11fBE482D3e0F382105ee2"; - const platformWallet2 = "0x63216f462174d815fc555496dD9dD5FC99395b7f"; - const pledge1 = Number(50 * 1e18).toString(); - const pledge2 = Number(70 * 1e18).toString(); - const goalAmount = Number(500 * 1e18).toString(); - const testPreMint = Number(500000000 * 1e18).toString(); - const earlyPledgeAmount = Number(1e18).toString(); - - const campaignRegistryFactory = await ethers.getContractFactory( - "CampaignRegistry" - ); - const campaignRegistry: CampaignRegistry = - await campaignRegistryFactory.deploy(); - - await campaignRegistry.deployed(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignFeeSplitterFactory = await ethers.getContractFactory( - "CampaignFeeSplitter" - ); - const campaignFeeSplitter: CampaignFeeSplitter = - await campaignFeeSplitterFactory.deploy(); - - await campaignFeeSplitter.deployed(); - - console.log(`CampaignFeeSplitter deployed to ${campaignFeeSplitter.address}`); - - const campaignNFTFactory = await ethers.getContractFactory("CampaignNFT"); - const campaignNFT: CampaignNFT = await campaignNFTFactory.deploy( - campaignRegistry.address - ); - - await campaignNFT.deployed(); - - console.log(`CampaignNFT deployed to ${campaignNFT.address}`); - - const campaignGlobalParametersFactory = await ethers.getContractFactory( - "CampaignGlobalParameters" - ); - const campaignGlobalParameters: CampaignGlobalParameters = - await campaignGlobalParametersFactory.deploy(); - - await campaignGlobalParameters.deployed(); - - console.log( - `CampaignGlobalParameters deployed to ${campaignGlobalParameters.address}` - ); - - const campaignInfoFactoryFactory = await ethers.getContractFactory( - "CampaignInfoFactory" - ); - const campaignInfoFactory: CampaignInfoFactory = - await campaignInfoFactoryFactory.deploy(campaignRegistry.address); - - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - await testUSD.deployed(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - const mint = await testUSD.mint(owner.address, testPreMint); - console.log(`${testPreMint} minted to user`); - - await mint.wait(); - - const initialize = await campaignRegistry.initialize( - campaignInfoFactory.address, - campaignNFT.address, - campaignGlobalParameters.address, - campaignFeeSplitter.address - ); - await initialize.wait(); - - const identifier = "/sampleproject"; - const originPlatform = getHexString("Kickstarter"); - const launchTime = 1677379317; - const deadline = 1681267317; - const platformTotalFeePercent = 1000; - const rewardPlatformFeePercent = 0; - const creatorUrl = "/samplecreatorurl/jsdkfjs"; - const reachPlatforms = [getHexString("Weirdstarter")]; - - const itemName = "sampleItem"; - const itemDescription = "sampleDescription"; - - const rewardName = "sampleReward"; - const rewardValue = "10000"; - const itemQuantity = 10; - - console.log(originPlatform); - console.log(reachPlatforms[0]); - - const tx = await campaignInfoFactory.createCampaign( - owner.address, - identifier, - originPlatform, - creatorUrl, - reachPlatforms, - earlyPledgeAmount - ); - - let result = await tx.wait(); - // console.log(result.events); - const newCampaignInfoAddress = result.events?.[3].args?.campaignInfoAddress; - - console.log( - `CampaignInfo created at ${newCampaignInfoAddress} using CampaignInfoFactory` - ); - - console.log(`Deploying the Treasury for Origin platform...`); - const campaignTreasuryFactory = await ethers.getContractFactory( - "CampaignTreasury" - ); - const campaignTreasury: CampaignTreasury = - await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - originPlatform - ); - - await campaignTreasury.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury.address}`); - - const campaignInfoArtifact = await artifacts.readArtifact("CampaignInfo"); - const campaignInfo = new ethers.Contract( - newCampaignInfoAddress, - campaignInfoArtifact.abi, - owner - ); - - //console.log("The CampaignInfo: " + campaignInfo); - - let setPlatformInfo = await campaignInfo.setPlatformInfo( - originPlatform, - platformWallet1, - campaignTreasury.address, - testUSD.address - ); - await setPlatformInfo.wait(); - console.log(`Treasury address set for Origin platform in CampaignInfo...`); - - console.log(`Deploying the Treasury for Reach platform...`); - const campaignTreasury2: CampaignTreasury = - await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - reachPlatforms[0] - ); - - await campaignTreasury2.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury2.address}`); - - setPlatformInfo = await campaignInfo.setPlatformInfo( - reachPlatforms[0], - platformWallet2, - campaignTreasury2.address, - testUSD.address - ); - await setPlatformInfo.wait(); - console.log(`Treasury address set for reach platform in CampaignInfo`); - - const increaseAllowance = await testUSD.increaseAllowance( - campaignInfo.address, - testPreMint - ); - await increaseAllowance.wait(); - - const becomeAnEarlyBacker = await campaignInfo.becomeAnEarlyBacker( - originPlatform, - owner.address - ); - await becomeAnEarlyBacker.wait(); - console.log("Pledged $1 at Pre-launch"); - - const setLaunch = await campaignInfo.setLaunch( - launchTime, - deadline, - goalAmount, - true - ); - await setLaunch.wait(); - - console.log(`Launch set`); - - const addItem = await campaignInfo.addItem(itemName, itemDescription); - await addItem.wait(); - - console.log(`Item added`); - - const addReward = await campaignInfo.addReward( - rewardName, - rewardValue, - [itemName], - [itemQuantity] - ); - await addReward.wait(); - - console.log(`Reward added`); - - // Pledge in reach & origin - - let pledgeForAReward = await campaignInfo.pledgeForAReward( - reachPlatforms[0], - owner.address, - rewardName - ); - await pledgeForAReward.wait(); - - console.log(`Pledged ${pledge1} to reachPlatform`); - - pledgeForAReward = await campaignInfo.pledgeForAReward( - originPlatform, - owner.address, - rewardName - ); - await pledgeForAReward.wait(); - - console.log(`Pledged ${pledge2} to originPlatform`); - - let pledgeWithoutAReward = await campaignInfo.pledgeWithoutAReward( - reachPlatforms[0], - owner.address, - pledge1 - ); - await pledgeWithoutAReward.wait(); - - console.log(`Pledged ${pledge1} to reachPlatform`); - - pledgeWithoutAReward = await campaignInfo.pledgeWithoutAReward( - originPlatform, - owner.address, - pledge2 - ); - await pledgeWithoutAReward.wait(); - - console.log(`Pledged ${pledge2} to originPlatform`); - - // const redeemPledge = await campaignInfo.redeemPledge( - // owner.address, - // pledge2, - // originPlatform - // ); - // result = await redeemPledge.wait(); - - // console.log(result); - // Check pledged amounts in origin & reach - - const treasury1Balance = await campaignInfo.getPledgedAmountForPlatformCrypto( - originPlatform - ); - console.log(`Treasury1 ${treasury1Balance}`); - const treasury2Balance = await campaignInfo.getPledgedAmountForPlatformCrypto( - reachPlatforms[0] - ); - console.log(`Treasury2 ${treasury2Balance}`); - - // Proportional fee split - - const splitFeesProportionately = - await campaignInfo.splitFeesProportionately(); - await splitFeesProportionately.wait(); - console.log(`Fee splits disbursed to platform wallets!`); - const platformWallet1Balance = await testUSD.balanceOf(platformWallet1); - const platformWallet2Balance = await testUSD.balanceOf(platformWallet2); - console.log( - `tUSD balance of platform1 ${platformWallet1} ${platformWallet1Balance}` - ); - console.log( - `tUSD balance of platform2 ${platformWallet2} ${platformWallet2Balance}` - ); - - // Proportional fee split with the lifecycle of fundraising - - // const splitFeeWithRewards = await campaignInfo.splitFeeWithRewards(); - // await splitFeeWithRewards.wait(); - // console.log(`Fee splits disbursed to platform wallets!`); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/demo.ts b/scripts/demo.ts deleted file mode 100644 index 537d6925..00000000 --- a/scripts/demo.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ethers, artifacts } from "hardhat"; -import { CampaignInfoFactory, CampaignInfo, CampaignRegistry, CampaignOracle, CampaignTreasury, TestUSD, FeeSplit } from "../typechain-types"; -import { getHexString } from "../lib/utils"; -import { library } from "../typechain-types/contracts"; - -async function main() { - const [owner] = await ethers.getSigners() - - // const feeSplitLibraryFactory = await ethers.getContractFactory("FeeSplit"); - // const feeSplitLibrary: FeeSplit = await feeSplitLibraryFactory.deploy(); - - const campaignInfoFactoryFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory: CampaignInfoFactory = await campaignInfoFactoryFactory.deploy(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const campaignRegistryFactory = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry: CampaignRegistry = await campaignRegistryFactory.deploy(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignOracleFactory = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle: CampaignOracle = await campaignOracleFactory.deploy(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - await testUSD.mint(owner.address, ethers.utils.parseEther("100000")); - console.log("100000 TestUSD token minted to user"); - - console.log(`CampaignInfo created at 0xa16E02E87b7454126E5E10d957A927A7F5B5d2be using CampaignInfoFactory`); - - console.log(`Deploying the Treasury for Origin platform...`); - // const campaignTreasuryFactory = await ethers.getContractFactory("CampaignTreasury"); - // const campaignTreasury: CampaignTreasury = await campaignTreasuryFactory.deploy( - // campaignRegistry.address, - // testUSD.address, - // newCampaignInfoAddress, - // originPlatform - // ); - - console.log(`CampaignTreasury for origin platform deployed to 0x610178dA211FEF7D417bC0e6FeD39F05609AD788`); - - // const campaignInfoArtifact = await artifacts.readArtifact("CampaignInfo"); - // const campaignInfo: any = await ethers.getContractFactoryFromArtifact(campaignInfoArtifact, newCampaignInfoAddress); - // const campaignInfoArtifact = await artifacts.readArtifact("CampaignInfo"); - // const campaignInfo = new ethers.Contract(newCampaignInfoAddress, campaignInfoArtifact.abi, owner); - - // await campaignInfo.setTreasuryAddress( - // originPlatform, - // campaignTreasury.address - // ); - - console.log(`Treasury address set for Origin platform in CampaignInfo...`); - - console.log(`Deploying the Treasury for Reach platform...`); - // const campaignTreasury2: CampaignTreasury = await campaignTreasuryFactory.deploy( - // campaignRegistry.address, - // testUSD.address, - // newCampaignInfoAddress, - // reachPlatforms[0] - // ); - - console.log(`CampaignTreasury deployed to 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266`); - - // await campaignInfo.setTreasuryAddress( - // reachPlatforms[0], - // campaignTreasury2.address - // ); - - console.log(`Treasury address set for reach platform in CampaignInfo`); - - // await testUSD.connect(owner).approve(campaignInfo.address, 1000000); - - console.log("Pledging 60000 token through reach platform"); - console.log("Pledging 40000 token through origin platform"); - // await campaignInfo.pledge(reachPlatforms[0], 51000); - // await campaignInfo.pledge(originPlatform, 30000); - console.log("Calling Fee split function"); - // const { rewardedFee, otherPlatformFees } = await campaignInfo.splitFeeWithRewards(500, 100); - console.log(`Fee share for the rewarded platform is 6500`); - console.log(`Fee share for the other platforms are 3500`); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deploy.ts b/scripts/deploy.ts deleted file mode 100644 index 8e44e9c6..00000000 --- a/scripts/deploy.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ethers } from "hardhat"; - -async function main() { - - const CampaignInfoFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory = await CampaignInfoFactory.deploy(); - - // Deploy CampaignFactory - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const CampaignRegistry = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry = await CampaignInfoFactory.deploy(); - - // Deploy CampaignRegistry - await campaignRegistry.deployed(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const CampaignOracle = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle = await CampaignOracle.deploy(); - - // Deploy CampaignOracle - await campaignOracle.deployed(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deployCampaign.ts b/scripts/deployCampaign.ts deleted file mode 100644 index e1d77911..00000000 --- a/scripts/deployCampaign.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { ethers } from "hardhat"; -import { CampaignInfoFactory, CampaignInfo, CampaignRegistry, CampaignOracle, CampaignTreasury } from "../typechain-types"; -import { getHexString } from "../lib/utils"; - -async function main() { - - const campaignInfoFactoryFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory: CampaignInfoFactory = await campaignInfoFactoryFactory.deploy(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const campaignRegistryFactory = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry: CampaignRegistry = await campaignRegistryFactory.deploy(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignOracleFactory = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle: CampaignOracle = await campaignOracleFactory.deploy(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - - await campaignInfoFactory.setRegistry(campaignRegistry.address); - await campaignRegistry.initialize(campaignInfoFactory.address, campaignOracle.address); - - const identifier = "/sampleproject"; - const originPlatform = getHexString("Kickstarter"); - const goalAmount = 1000000; - const launchTime = 1666753961; - const deadline = 1672002761; - const creatorUrl = "/samplecreatorurl/jsdkfjs"; - const reachPlatforms = [ - getHexString("Kickstarter"), - getHexString("Weirdstarter") - ]; - - const tx = await campaignInfoFactory.createCampaign(identifier, originPlatform, goalAmount, launchTime, deadline, creatorUrl, reachPlatforms); - - - const result = await tx.wait() - const newCampaignInfoAddress = result.events?.[1].args?.campaignInfoAddress; - - console.log(`CampaignInfo created at ${newCampaignInfoAddress} using CampaignInfoFactory`); - - console.log(`Deploying the Treasury for Origin platform...`); - const campaignTreasuryFactory = await ethers.getContractFactory("CampaignTreasury"); - const campaignTreasury: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - getHexString("Kickstarter") - ); - - console.log(`CampaignTreasury deployed to ${campaignTreasury.address}`); - - const campaignInfo: CampaignInfo = await ethers.getContractAt("contracts/CampaignInfo.sol:CampaignInfo", newCampaignInfoAddress); - - await campaignInfo.setTreasuryAddress( - getHexString("Kickstarter"), - campaignTreasury.address - ); - - console.log(`Treasury address set for Origin platform in CampaignInfo...`); - - console.log(`Deploying the Treasury for Reach platform...`); - const campaignTreasury2: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - getHexString("Weirdstarter") - ); - - console.log(`CampaignTreasury deployed to ${campaignTreasury2.address}`); - - await campaignInfo.setTreasuryAddress( - getHexString("Weirdstarter"), - campaignTreasury2.address - ); - - console.log(`Treasury address set for reach platform in CampaignInfo`); - - console.log(`Setting pledge data for origin platform in Oracle contract`); - await campaignOracle.setPledgedAmountForplatform( - getHexString("Kickstarter"), - campaignInfo.address, - "100000" - ); - - console.log(`Setting pledge data for reach platform in Oracle contract`); - await campaignOracle.setPledgedAmountForplatform( - getHexString("Weirdstarter"), - campaignInfo.address, - "100000" - ); - - console.log(`Reading pledge data from Oracle contract for origin platform...`); - const pledgeAmountForOrigin = await campaignOracle.getPledgedAmountForplatform( - getHexString("Kickstarter"), - campaignInfo.address - ); - console.log(`Current pledge amount for origin platform ${pledgeAmountForOrigin}`); - - console.log(`Reading pledge data from Oracle contract for reach platform...`); - const pledgeAmountForReach = await campaignOracle.getPledgedAmountForplatform( - getHexString("Weirdstarter"), - campaignInfo.address - ); - console.log(`Current pledge amount for reach platform ${pledgeAmountForReach}`); - - console.log(`Reading total pledge amount from CampaignInfo...`); - const totalPledge = await campaignInfo.getTotalPledgedAmount(); - console.log(`Total pledge amount for origin & reach platform ${totalPledge}`); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/deployInitialize.ts b/scripts/deployInitialize.ts deleted file mode 100644 index b2fbd11d..00000000 --- a/scripts/deployInitialize.ts +++ /dev/null @@ -1,262 +0,0 @@ -// import { AllOrNothing } from './../typechain-types/src/treasuries/AllOrNothing'; -import { ethers, artifacts } from "hardhat"; -import { - CampaignInfoFactory, - TestUSD, - ItemRegistry, - GlobalParams, - TreasuryFactory, - AllOrNothing, -} from "../typechain-types"; -import { hexString, hashString } from "../lib/utils"; -import { getPushLength } from "hardhat/internal/hardhat-network/stack-traces/opcodes"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; - -async function insertBytecodeInChunks( - contractInstance: any, - platformBytes: string, - bytecodeIndex: number, - bytecode: string, - chunkSize: number = 20000 -) { - let chunkIndex = 0; - - for (let i = 0; i < bytecode.length; i += chunkSize) { - const end = Math.min(i + chunkSize, bytecode.length); - let bytecodeChunk = bytecode.slice(i, end); - const isLastChunk = i + chunkSize >= bytecode.length; // True if current chunk is the last - - if (i != 0) { - bytecodeChunk = "0x" + bytecodeChunk; - } - const tx = await contractInstance.addBytecodeChunk( - platformBytes, - bytecodeIndex, - chunkIndex, - isLastChunk, - bytecodeChunk - ); - const receipt = await tx.wait(); - - console.log( - `BytecodeIndex ${bytecodeIndex}, Chunk ${chunkIndex} added with transaction hash: ${receipt.transactionHash}` - ); - - chunkIndex++; - } -} - -async function main() { - const [owner] = await ethers.getSigners(); - - console.log("Owner address " + owner.address); - - const goalAmount = Number(500 * 1e18).toString(); - const testPreMint = Number(900 * 1e18).toString(); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - await testUSD.deployed(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - const mint = await testUSD.mint(owner.address, testPreMint); - console.log(`${testPreMint} minted to user`); - - await mint.wait(); - - const globalParamsFactory = await ethers.getContractFactory("GlobalParams"); - const globalParams: GlobalParams = await globalParamsFactory.deploy( - owner.address, - testUSD.address, - 200 - ); - - await globalParams.deployed(); - - console.log(`GlobalParams deployed to ${globalParams.address}`); - - const itemRegistryFactory = await ethers.getContractFactory("ItemRegistry"); - const itemRegistry: ItemRegistry = await itemRegistryFactory.deploy(); - - await itemRegistry.deployed(); - - console.log(`ItemRegistry deployed to ${itemRegistry.address}`); - - const campaignInfoFactoryFactory = await ethers.getContractFactory( - "CampaignInfoFactory" - ); - const campaignInfoFactory: CampaignInfoFactory = - await campaignInfoFactoryFactory.deploy(globalParams.address); - - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const treasuryFactoryFactory = await ethers.getContractFactory( - "TreasuryFactory" - ); - - const treasuryArtifact = await artifacts.readArtifact("AllOrNothing"); - - const bytecodeHash = hashString(treasuryArtifact.bytecode); - - console.log("BytecodeHash: " + bytecodeHash); - const treasuryFactory: TreasuryFactory = await treasuryFactoryFactory.deploy( - globalParams.address, - campaignInfoFactory.address, - bytecodeHash - ); - - await treasuryFactory.deployed(); - - console.log(`TreasuryFactory deployed to ${treasuryFactory.address}`); - - const initialize = await campaignInfoFactory._initialize( - treasuryFactory.address, - globalParams.address - ); - - await initialize.wait(); - console.log("Initialized"); - const kickstarter = hashString("Kickstarter"); - const weirdstarter = hashString("Weirdstarter"); - const platforms = [kickstarter, weirdstarter]; - - interface ICampaignData { - launchTime: number; - deadline: number; - goalAmount: string; - } - - const campaignData: ICampaignData = { - launchTime: Date.now(), - deadline: Date.now() + 1000000, - goalAmount: Number(500 * 1e18).toString(), - }; - - const emptyBytes32Array: string[] = []; - - const enlistPlatform = await globalParams.enlistPlatform( - kickstarter, - owner.address, - 200 - ); - - await enlistPlatform.wait(); - console.log("Platform enlisted"); - - const AllOrNothingArtifact = await artifacts.readArtifact("AllOrNothing"); - - const bytecode = AllOrNothingArtifact.bytecode; - - await insertBytecodeInChunks(treasuryFactory, kickstarter, 0, bytecode); - console.log("All bytecode chunks added!"); - - const enlistBytecode = await treasuryFactory.enlistBytecode(kickstarter, 0); - await enlistBytecode.wait(); - console.log("Bytecode enlisted"); - - const createCampaign = await campaignInfoFactory.createCampaign( - owner.address, - "0xcc7b0ace0b803eb8476b3fb1e74a99df7d3209dfcf42790d24b519e108574dad", - [kickstarter], - emptyBytes32Array, - emptyBytes32Array, - campaignData - ); - let result = await createCampaign.wait(); - const infoAddress = result.events?.[0].address.toLowerCase() as string; - console.log(infoAddress); - - // const len = await treasuryFactory.getBytecodeLength(kickstarter, 0); - // console.log("length " + len); - - const deploy = await treasuryFactory.deploy(kickstarter, 0, infoAddress); - result = await deploy.wait(); - const treasuryAddress = - result.events?.[1].args?.treasuryAddress.toLowerCase() as string; - console.log(`AllOrNothing ${treasuryAddress} created`); - - interface Reward { - rewardValue: number; - isRewardTier: boolean; - itemId: string[]; - itemValue: number[]; - itemQuantity: number[]; - } - - const reward: Reward = { - rewardValue: 100, - isRewardTier: true, - itemId: [hexString("ab"), hexString("cd")], - itemValue: [1000, 2000], - itemQuantity: [10, 20], - }; - - // const allOrNothing = await ethers.getContractAt("src/treasuries/AllOrNothing.sol:AllOrNothing", treasuryAddress); - - const allOrNothing = new ethers.Contract( - treasuryAddress, - AllOrNothingArtifact.abi, - owner - ); - - const rewardName = hashString("SampleReward"); - const addReward = await allOrNothing.addReward(rewardName, reward); - await addReward.wait(); - console.log(`Reward ${rewardName} added`); - - let approveContract = await testUSD.approve( - allOrNothing.address, - ethers.constants.MaxUint256 - ); - await approveContract.wait(); - - // const pledgeOnPreLaunch = await allOrNothing.pledgeOnPreLaunch(owner.address); - // await pledgeOnPreLaunch.wait(); - // console.log(`Pledged on prelaunch`); - - await time.increaseTo(Date.now() + 10000); - - const pledgeForAReward = await allOrNothing.pledgeForAReward(owner.address, [ - rewardName, - ]); - await pledgeForAReward.wait(); - console.log(`Pledged for reward ${rewardName}`); - - const getRaisedAmount = await allOrNothing.getRaisedAmount(); - console.log(`Raised amount ${getRaisedAmount}`); - - const pledgeWithoutAReward = await allOrNothing.pledgeWithoutAReward( - owner.address, - goalAmount - ); - await pledgeWithoutAReward.wait(); - console.log(`Pledged without reward`); - - await time.increaseTo(Date.now() + 1000000); - - const disburseFees = await allOrNothing.disburseFees(); - await disburseFees.wait(); - console.log(`Fees disbursed`); - - console.log( - "NEXT_PUBLIC_GLOBAL_PARAMS=" + - globalParams.address + - "\nNEXT_PUBLIC_CAMPAIGN_INFO_FACTORY=" + - campaignInfoFactory.address + - "\nNEXT_PUBLIC_TREASURY_FACTORY=" + - treasuryFactory.address, - "\nNEXT_PUBLIC_TEST_USD=" + testUSD.address, - "\nNEXT_PUBLIC_ITEM_REGISTRY=" + itemRegistry.address - ); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); \ No newline at end of file diff --git a/scripts/deployWithPreMint.ts b/scripts/deployWithPreMint.ts deleted file mode 100644 index bcce9d5a..00000000 --- a/scripts/deployWithPreMint.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ethers, artifacts } from "hardhat"; -import { CampaignInfoFactory, CampaignInfo, CampaignRegistry, CampaignOracle, CampaignTreasury, TestUSD, FeeSplit } from "../typechain-types"; -import { getHexString } from "../lib/utils"; -import { library } from "../typechain-types/contracts"; - -async function main() { - const [owner] = await ethers.getSigners() - - // Parameters - const testPreMint = Number(500 * 1e18).toString() - - const campaignInfoFactoryFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory: CampaignInfoFactory = await campaignInfoFactoryFactory.deploy(); - - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const campaignRegistryFactory = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry: CampaignRegistry = await campaignRegistryFactory.deploy(); - - await campaignRegistry.deployed(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignOracleFactory = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle: CampaignOracle = await campaignOracleFactory.deploy(); - - await campaignOracle.deployed(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - await testUSD.deployed(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - const mint = await testUSD.mint(owner.address, testPreMint); - console.log(`${testPreMint} minted to user`); - - await mint.wait(); - - const setRegistry = await campaignInfoFactory.setRegistry(campaignRegistry.address); - await setRegistry.wait(); - const initialize = await campaignRegistry.initialize(campaignInfoFactory.address, campaignOracle.address); - await initialize.wait(); -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/feeSplit.ts b/scripts/feeSplit.ts deleted file mode 100644 index ef0daecb..00000000 --- a/scripts/feeSplit.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { ethers, artifacts } from "hardhat"; -import { CampaignInfoFactory, CampaignInfo, CampaignRegistry, CampaignOracle, CampaignTreasury, TestUSD, FeeSplit } from "../typechain-types"; -import { getHexString } from "../lib/utils"; -import { library } from "../typechain-types/contracts"; - -async function main() { - const [owner] = await ethers.getSigners() - - // Parameters - const platformWallet1 = "0xA2a6f51aF77c1bF8eB11fBE482D3e0F382105ee2"; - const platformWallet2 = "0x63216f462174d815fc555496dD9dD5FC99395b7f"; - const pledge1 = Number(50 * 1e18).toString() - const pledge2 = Number(70 * 1e18).toString() - const goalAmount = Number(500 * 1e18).toString() - const testPreMint = Number(500 * 1e18).toString() - - - const campaignInfoFactoryFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory: CampaignInfoFactory = await campaignInfoFactoryFactory.deploy(); - - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const campaignRegistryFactory = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry: CampaignRegistry = await campaignRegistryFactory.deploy(); - - await campaignRegistry.deployed(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignOracleFactory = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle: CampaignOracle = await campaignOracleFactory.deploy(); - - await campaignOracle.deployed(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - await testUSD.deployed(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - const mint = await testUSD.mint(owner.address, testPreMint); - console.log(`${testPreMint} minted to user`); - - await mint.wait(); - - const setRegistry = await campaignInfoFactory.setRegistry(campaignRegistry.address); - await setRegistry.wait(); - const initialize = await campaignRegistry.initialize(campaignInfoFactory.address, campaignOracle.address); - await initialize.wait(); - - const identifier = "/sampleproject"; - const originPlatform = getHexString("Kickstarter"); - const launchTime = 1677379317; - const deadline = 1681267317; - const platformTotalFeePercent = 1000; - const rewardPlatformFeePercent = 0; - const creatorUrl = "/samplecreatorurl/jsdkfjs"; - const reachPlatforms = [ - getHexString("Weirdstarter") - ]; - - console.log(originPlatform); - console.log(reachPlatforms[0]); - - const tx = await campaignInfoFactory.createCampaign(identifier, originPlatform, goalAmount, launchTime, deadline, platformTotalFeePercent, rewardPlatformFeePercent, creatorUrl, reachPlatforms); - - const result = await tx.wait() - const newCampaignInfoAddress = result.events?.[1].args?.campaignInfoAddress; - - console.log(`CampaignInfo created at ${newCampaignInfoAddress} using CampaignInfoFactory`); - - console.log(`Deploying the Treasury for Origin platform...`); - const campaignTreasuryFactory = await ethers.getContractFactory("CampaignTreasury"); - const campaignTreasury: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - originPlatform - ); - - await campaignTreasury.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury.address}`); - - const campaignInfoArtifact = await artifacts.readArtifact("CampaignInfo"); - const campaignInfo = new ethers.Contract(newCampaignInfoAddress, campaignInfoArtifact.abi, owner); - - //console.log("The CampaignInfo: " + campaignInfo); - - let setPlatformInfo = await campaignInfo.setPlatformInfo( - originPlatform, - platformWallet1, - campaignTreasury.address, - testUSD.address - ); - await setPlatformInfo.wait(); - console.log(`Treasury address set for Origin platform in CampaignInfo...`); - - console.log(`Deploying the Treasury for Reach platform...`); - const campaignTreasury2: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - reachPlatforms[0] - ); - - await campaignTreasury2.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury2.address}`); - - setPlatformInfo = await campaignInfo.setPlatformInfo( - reachPlatforms[0], - platformWallet2, - campaignTreasury2.address, - testUSD.address - ); - await setPlatformInfo.wait(); - console.log(`Treasury address set for reach platform in CampaignInfo`); - - const increaseAllowance = await testUSD.increaseAllowance(campaignInfo.address, goalAmount); - await increaseAllowance.wait(); - - // Pledge in reach & origin - - let pledgeThroughPlatform = await campaignInfo.pledgeThroughPlatform(reachPlatforms[0], owner.address, pledge1); - await pledgeThroughPlatform.wait(); - console.log(`Pledged ${pledge1} to reachPlatform`); - pledgeThroughPlatform = await campaignInfo.pledgeThroughPlatform(originPlatform, owner.address, pledge2); - await pledgeThroughPlatform.wait(); - console.log(`Pledged ${pledge2} to originPlatform`); - - // Check pledged amounts in origin & reach - - const treasury1Balance = campaignInfo.getPledgedAmountForPlatformCrypto(originPlatform); - console.log(`Treasury1 ${treasury1Balance}`); - const treasury2Balance = campaignInfo.getPledgedAmountForPlatformCrypto(reachPlatforms[0]); - console.log(`Treasury2 ${treasury2Balance}`); - - // Proportional fee split - - const splitFeesProportionately = await campaignInfo.splitFeesProportionately(); - await splitFeesProportionately.wait(); - console.log(`Fee splits disbursed to platform wallets!`); - const platformWallet1Balance = await testUSD.balanceOf(platformWallet1); - const platformWallet2Balance = await testUSD.balanceOf(platformWallet2); - console.log(`tUSD balance of platform1 ${platformWallet1} ${platformWallet1Balance}`); - console.log(`tUSD balance of platform2 ${platformWallet2} ${platformWallet2Balance}`); - - // Proportional fee split with the lifecycle of fundraising - - // const splitFeeWithRewards = await campaignInfo.splitFeeWithRewards(); - // await splitFeeWithRewards.wait(); - // console.log(`Fee splits disbursed to platform wallets!`); - -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); diff --git a/scripts/feeSplitVelocity.ts b/scripts/feeSplitVelocity.ts deleted file mode 100644 index 59ea0196..00000000 --- a/scripts/feeSplitVelocity.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { ethers, artifacts } from "hardhat"; -import { CampaignInfoFactory, CampaignInfo, CampaignRegistry, CampaignOracle, CampaignTreasury, TestUSD, FeeSplit } from "../typechain-types"; -import { getHexString } from "../lib/utils"; -import { library } from "../typechain-types/contracts"; - -async function main() { - const [owner] = await ethers.getSigners() - - // Parameters - const platformWallet1 = "0xA2a6f51aF77c1bF8eB11fBE482D3e0F382105ee2"; - const platformWallet2 = "0x63216f462174d815fc555496dD9dD5FC99395b7f"; - const pledge1 = Number(50 * 1e18).toString() - const pledge2 = Number(70 * 1e18).toString() - const goalAmount = Number(500 * 1e18).toString() - const testPreMint = Number(500 * 1e18).toString() - - const campaignInfoFactoryFactory = await ethers.getContractFactory("CampaignInfoFactory"); - const campaignInfoFactory: CampaignInfoFactory = await campaignInfoFactoryFactory.deploy(); - - await campaignInfoFactory.deployed(); - - console.log(`CampaignInfoFactory deployed to ${campaignInfoFactory.address}`); - - const campaignRegistryFactory = await ethers.getContractFactory("CampaignRegistry"); - const campaignRegistry: CampaignRegistry = await campaignRegistryFactory.deploy(); - - await campaignRegistry.deployed(); - - console.log(`CampaignRegistry deployed to ${campaignRegistry.address}`); - - const campaignOracleFactory = await ethers.getContractFactory("CampaignOracle"); - const campaignOracle: CampaignOracle = await campaignOracleFactory.deploy(); - - await campaignOracle.deployed(); - - console.log(`CampaignOracle deployed to ${campaignOracle.address}`); - - const testUSDFactory = await ethers.getContractFactory("TestUSD"); - const testUSD: TestUSD = await testUSDFactory.deploy(); - - await testUSD.deployed(); - - console.log(`TestUSD deployed to ${testUSD.address}`); - - const mint = await testUSD.mint(owner.address, testPreMint); - console.log(`${testPreMint} minted to user`); - - await mint.wait(); - - const setRegistry = await campaignInfoFactory.setRegistry(campaignRegistry.address); - await setRegistry.wait(); - const initialize = await campaignRegistry.initialize(campaignInfoFactory.address, campaignOracle.address); - await initialize.wait(); - - const identifier = "/sampleproject"; - const originPlatform = getHexString("Kickstarter"); - const launchTime = 1666753961; - const deadline = 1672002761; - const creatorUrl = "/samplecreatorurl/jsdkfjs"; - const reachPlatforms = [ - getHexString("Weirdstarter") - ]; - - console.log(originPlatform); - console.log(reachPlatforms[0]); - - const tx = await campaignInfoFactory.createCampaign(identifier, originPlatform, goalAmount, launchTime, deadline, creatorUrl, reachPlatforms); - - const result = await tx.wait() - const newCampaignInfoAddress = result.events?.[1].args?.campaignInfoAddress; - - console.log(`CampaignInfo created at ${newCampaignInfoAddress} using CampaignInfoFactory`); - - console.log(`Deploying the Treasury for Origin platform...`); - const campaignTreasuryFactory = await ethers.getContractFactory("CampaignTreasury"); - const campaignTreasury: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - originPlatform - ); - - await campaignTreasury.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury.address}`); - - const campaignInfoArtifact = await artifacts.readArtifact("CampaignInfo"); - const campaignInfo = new ethers.Contract(newCampaignInfoAddress, campaignInfoArtifact.abi, owner); - - let setplatformInfo = await campaignInfo.setplatformInfo( - originPlatform, - platformWallet1, - campaignTreasury.address, - testUSD.address - ); - await setplatformInfo.wait(); - console.log(`Treasury address set for Origin platform in CampaignInfo...`); - - console.log(`Deploying the Treasury for Reach platform...`); - const campaignTreasury2: CampaignTreasury = await campaignTreasuryFactory.deploy( - campaignRegistry.address, - newCampaignInfoAddress, - reachPlatforms[0] - ); - - await campaignTreasury2.deployed(); - - console.log(`CampaignTreasury deployed to ${campaignTreasury2.address}`); - - setplatformInfo = await campaignInfo.setplatformInfo( - reachPlatforms[0], - platformWallet2, - campaignTreasury2.address, - testUSD.address - ); - await setplatformInfo.wait(); - console.log(`Treasury address set for reach platform in CampaignInfo`); - - const increaseAllowance = await testUSD.increaseAllowance(campaignInfo.address, goalAmount); - await increaseAllowance.wait(); - - let pledgeThroughPlatform = await campaignInfo.pledgeThroughPlatform(reachPlatforms[0], pledge1); - await pledgeThroughPlatform.wait(); - console.log(`Pledged ${pledge1} to reachPlatform`); - pledgeThroughPlatform = await campaignInfo.pledgeThroughPlatform(originPlatform, pledge2); - await pledgeThroughPlatform.wait(); - console.log(`Pledged ${pledge2} to originPlatform`); - - const treasury1Balance = campaignInfo.getPledgedAmountForPlatformCrypto(originPlatform); - console.log(`Treasury1 ${treasury1Balance}`); - const treasury2Balance = campaignInfo.getPledgedAmountForPlatformCrypto(reachPlatforms[0]); - console.log(`Treasury2 ${treasury2Balance}`); - - // Proportional fee split with the velocity of fundraising - - const splitFeeWithVelocityOfFundraising = await campaignInfo.splitFeeWithVelocityOfFundraising(); - await splitFeeWithVelocityOfFundraising.wait(); - console.log(`Fee splits disbursed to platform wallets!`); - - const platformWallet1Balance = await testUSD.balanceOf(platformWallet1); - const platformWallet2Balance = await testUSD.balanceOf(platformWallet2); - console.log(`tUSD balance of platform1 ${platformWallet1} ${platformWallet1Balance}`); - console.log(`tUSD balance of platform2 ${platformWallet2} ${platformWallet2Balance}`); - -} - -// We recommend this pattern to be able to use async/await everywhere -// and properly handle errors. -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); From 420f3316ad974f44a2208c5da1bca263453017d0 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:57:10 +0800 Subject: [PATCH 10/61] Update mock token type --- src/TestUSD.sol | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/TestUSD.sol b/src/TestUSD.sol index 3dcaf32a..19cf382e 100644 --- a/src/TestUSD.sol +++ b/src/TestUSD.sol @@ -1,16 +1,15 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /** * @title TestUSD * @notice A test token `tUSD` which is used in the tests. */ -contract TestUSD is ERC20, ERC20Permit, Ownable { - constructor() ERC20("testUSD", "tUSD") ERC20Permit("testUSD") {} +contract TestUSD is ERC20, Ownable { + constructor() ERC20("testUSD", "tUSD") Ownable(msg.sender) {} /** * @notice Mints testUSD token. @@ -20,4 +19,4 @@ contract TestUSD is ERC20, ERC20Permit, Ownable { function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } -} \ No newline at end of file +} From 2ac7476256e9bc435e38fb2ad78edad90503b1fd Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 04:57:55 +0800 Subject: [PATCH 11/61] Add IReward for managing Reward struct --- src/interfaces/IReward.sol | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/interfaces/IReward.sol diff --git a/src/interfaces/IReward.sol b/src/interfaces/IReward.sol new file mode 100644 index 00000000..890aa12b --- /dev/null +++ b/src/interfaces/IReward.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; +/** + * @title IReward + * @notice An interface for managing rewards in a campaign. + */ +interface IReward { + + struct Reward { + uint256 rewardValue; + bool isRewardTier; + bytes32[] itemId; + uint256[] itemValue; + uint256[] itemQuantity; + } +} From 5b5d5cd0b9b6d49b436583983fcad3b2a6ba092e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:01:02 +0800 Subject: [PATCH 12/61] Update pragma and rename `platformBytes` to `platformHash` --- src/interfaces/ICampaignData.sol | 2 +- src/interfaces/ICampaignInfo.sol | 25 +++++++++++++++---------- src/interfaces/ICampaignInfoFactory.sol | 6 +++--- src/interfaces/ICampaignTreasury.sol | 4 ++-- src/interfaces/IGlobalParams.sol | 24 ++++++++++++------------ src/interfaces/IItem.sol | 2 +- 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/interfaces/ICampaignData.sol b/src/interfaces/ICampaignData.sol index 48d7d19c..cab7c378 100644 --- a/src/interfaces/ICampaignData.sol +++ b/src/interfaces/ICampaignData.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title ICampaignData diff --git a/src/interfaces/ICampaignInfo.sol b/src/interfaces/ICampaignInfo.sol index e60034cd..509769b1 100644 --- a/src/interfaces/ICampaignInfo.sol +++ b/src/interfaces/ICampaignInfo.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title ICampaignInfo @@ -14,11 +14,11 @@ interface ICampaignInfo { /** * @notice Checks if a platform has been selected for the campaign. - * @param platformBytes The bytes32 identifier of the platform to check. + * @param platformHash The bytes32 identifier of the platform to check. * @return True if the platform is selected, false otherwise. */ function checkIfPlatformSelected( - bytes32 platformBytes + bytes32 platformHash ) external view returns (bool); /** @@ -35,11 +35,11 @@ interface ICampaignInfo { /** * @notice Retrieves the address of the platform administrator for a specific platform. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @return The address of the platform administrator. */ function getPlatformAdminAddress( - bytes32 platformBytes + bytes32 platformHash ) external view returns (address); /** @@ -74,11 +74,11 @@ interface ICampaignInfo { /** * @notice Retrieves the platform fee percentage for a specific platform. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @return The platform fee percentage applied to the campaign on the platform. */ function getPlatformFeePercent( - bytes32 platformBytes + bytes32 platformHash ) external view returns (uint256); /** @@ -122,16 +122,21 @@ interface ICampaignInfo { /** * @notice Updates the selection status of a platform for the campaign. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param selection The new selection status (true or false). */ function updateSelectedPlatform( - bytes32 platformBytes, + bytes32 platformHash, bool selection ) external; /** - * @dev Returns true if the contract is paused, and false otherwise. + * @dev Returns true if the campaign is paused, and false otherwise. */ function paused() external view returns (bool); + + /** + * @dev Returns true if the campaign is cancelled, and false otherwise. + */ + function cancelled() external view returns (bool); } diff --git a/src/interfaces/ICampaignInfoFactory.sol b/src/interfaces/ICampaignInfoFactory.sol index dfc4d2b1..f76d26f9 100644 --- a/src/interfaces/ICampaignInfoFactory.sol +++ b/src/interfaces/ICampaignInfoFactory.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "./ICampaignData.sol"; @@ -22,7 +22,7 @@ interface ICampaignInfoFactory is ICampaignData { * @notice Creates a new campaign information contract. * @param creator The address of the creator of the campaign. * @param identifierHash The unique identifier hash of the campaign. - * @param selectedPlatformBytes An array of platform identifiers selected for the campaign. + * @param selectedPlatformHash An array of platform identifiers selected for the campaign. * @param platformDataKey An array of platform-specific data keys. * @param platformDataValue An array of platform-specific data values. * @param campaignData The struct containing campaign launch details. @@ -30,7 +30,7 @@ interface ICampaignInfoFactory is ICampaignData { function createCampaign( address creator, bytes32 identifierHash, - bytes32[] calldata selectedPlatformBytes, + bytes32[] calldata selectedPlatformHash, bytes32[] calldata platformDataKey, bytes32[] calldata platformDataValue, CampaignData calldata campaignData diff --git a/src/interfaces/ICampaignTreasury.sol b/src/interfaces/ICampaignTreasury.sol index 4ae02ddf..578f3df2 100644 --- a/src/interfaces/ICampaignTreasury.sol +++ b/src/interfaces/ICampaignTreasury.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title ICampaignTreasury @@ -26,7 +26,7 @@ interface ICampaignTreasury { * @notice Retrieves the platform identifier associated with the treasury. * @return The platform identifier as a bytes32 value. */ - function getplatformBytes() external view returns (bytes32); + function getplatformHash() external view returns (bytes32); /** * @notice Retrieves the platform fee percentage for the treasury. diff --git a/src/interfaces/IGlobalParams.sol b/src/interfaces/IGlobalParams.sol index 8164dcb4..fda1b617 100644 --- a/src/interfaces/IGlobalParams.sol +++ b/src/interfaces/IGlobalParams.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title IGlobalParams @@ -8,20 +8,20 @@ pragma solidity ^0.8.9; interface IGlobalParams { /** * @notice Checks if a platform is listed in the protocol. - * @param _platformBytes The unique identifier of the platform. + * @param _platformHash The unique identifier of the platform. * @return True if the platform is listed; otherwise, false. */ - function checkIfplatformIsListed( - bytes32 _platformBytes + function checkIfPlatformIsListed( + bytes32 _platformHash ) external view returns (bool); /** * @notice Retrieves the admin address of a platform. - * @param _platformBytes The unique identifier of the platform. + * @param _platformHash The unique identifier of the platform. * @return The admin address of the platform. */ function getPlatformAdminAddress( - bytes32 _platformBytes + bytes32 _platformHash ) external view returns (address); /** @@ -51,19 +51,19 @@ interface IGlobalParams { /** * @notice Retrieves the owner of platform-specific data. * @param platformDataKey The key of the platform-specific data. - * @return platformBytes The platform identifier associated with the data. + * @return platformHash The platform identifier associated with the data. */ function getPlatformDataOwner( bytes32 platformDataKey - ) external view returns (bytes32 platformBytes); + ) external view returns (bytes32 platformHash); /** * @notice Retrieves the platform fee percentage for a specific platform. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. * @return The platform fee percentage as a uint256 value. */ function getPlatformFeePercent( - bytes32 platformBytes + bytes32 platformHash ) external view returns (uint256); /** @@ -95,11 +95,11 @@ interface IGlobalParams { /** * @notice Updates the admin address of a platform. - * @param _platformBytes The unique identifier of the platform. + * @param _platformHash The unique identifier of the platform. * @param _platformAdminAddress The new admin address of the platform. */ function updatePlatformAdminAddress( - bytes32 _platformBytes, + bytes32 _platformHash, address _platformAdminAddress ) external; } diff --git a/src/interfaces/IItem.sol b/src/interfaces/IItem.sol index 2b8903b7..e6971d16 100644 --- a/src/interfaces/IItem.sol +++ b/src/interfaces/IItem.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title IItem From 9985e319d0c36e5cc32c8d77311a9e518c8b7d44 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:09:36 +0800 Subject: [PATCH 13/61] Add ability to cancel a campaign --- src/utils/PausableCancellable.sol | 134 ++++++++++++++++++++++++++++++ src/utils/PausableWithMsg.sol | 92 -------------------- 2 files changed, 134 insertions(+), 92 deletions(-) create mode 100644 src/utils/PausableCancellable.sol delete mode 100644 src/utils/PausableWithMsg.sol diff --git a/src/utils/PausableCancellable.sol b/src/utils/PausableCancellable.sol new file mode 100644 index 00000000..6c65c268 --- /dev/null +++ b/src/utils/PausableCancellable.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +/// @title PausableCancellable +/// @notice Abstract contract providing pause and cancel state management with events and modifiers +abstract contract PausableCancellable { + bool private _paused; + bool private _cancelled; + + /** + * @notice Emitted when contract is paused + */ + event Paused(address indexed account, bytes32 reason); + + /** + * @notice Emitted when contract is unpaused + */ + event Unpaused(address indexed account, bytes32 reason); + + /** + * @notice Emitted when contract is cancelled + */ + event Cancelled(address indexed account, bytes32 reason); + + /** + * @dev Reverts if contract is paused + */ + error PausedError(); + + /** + * @dev Reverts if contract is not paused + */ + error NotPausedError(); + + /** + * @dev Reverts if contract is cancelled + */ + error CancelledError(); + + /** + * @dev Reverts if contract is not cancelled + */ + error NotCancelledError(); + + /** + * @dev Reverts if contract is already cancelled + */ + error CannotCancel(); + + /** + * @notice Modifier to allow function only when not paused + */ + modifier whenNotPaused() { + if (_paused) revert PausedError(); + _; + } + + /** + * @notice Modifier to allow function only when paused + */ + modifier whenPaused() { + if (!_paused) revert NotPausedError(); + _; + } + + /** + * @notice Modifier to allow function only when not cancelled + */ + modifier whenNotCancelled() { + if (_cancelled) revert CancelledError(); + _; + } + + /** + * @notice Modifier to allow function only when cancelled + */ + modifier whenCancelled() { + if (!_cancelled) revert NotCancelledError(); + _; + } + + /** + * @notice Returns true if the contract is currently paused + */ + function paused() public view virtual returns (bool) { + return _paused; + } + + /** + * @notice Returns true if the contract has been cancelled + */ + function cancelled() public view virtual returns (bool) { + return _cancelled; + } + + /** + * @notice Pauses the contract + * @param reason A short reason for pausing + * @dev Can only pause if not already paused or cancelled + */ + function _pause( + bytes32 reason + ) internal virtual whenNotPaused whenNotCancelled { + _paused = true; + emit Paused(msg.sender, reason); + } + + /** + * @notice Unpauses the contract + * @param reason A short reason for unpausing + * @dev Can only unpause if currently paused + */ + function _unpause(bytes32 reason) internal virtual whenPaused { + _paused = false; + emit Unpaused(msg.sender, reason); + } + + /** + * @notice Cancels the contract permanently + * @param reason A short reason for cancellation + * @dev Auto-unpauses if paused, and cannot be undone + */ + function _cancel(bytes32 reason) internal virtual { + if (_cancelled) revert CannotCancel(); + /// @dev keccak256 Hash of `Auto-unpaused during cancellation` is passed as a reason + if (_paused) { + _unpause( + 0x231da0eace2a459b43889b78bbd1fc88a89e3192ee6cbcda7015c539d577e2cd + ); + } + _cancelled = true; + emit Cancelled(msg.sender, reason); + } +} diff --git a/src/utils/PausableWithMsg.sol b/src/utils/PausableWithMsg.sol deleted file mode 100644 index b7ef76c5..00000000 --- a/src/utils/PausableWithMsg.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -abstract contract PausableWithMsg { - /** - * @dev Emitted when the pause is triggered by `account`. - */ - event Paused(address account, bytes32 message); - - /** - * @dev Emitted when the pause is lifted by `account`. - */ - event Unpaused(address account, bytes32 message); - - bool private _paused; - - /** - * @dev Initializes the contract in unpaused state. - */ - constructor() { - _paused = false; - } - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - * - * Requirements: - * - * - The contract must not be paused. - */ - modifier whenNotPaused() { - _requireNotPaused(); - _; - } - - /** - * @dev Modifier to make a function callable only when the contract is paused. - * - * Requirements: - * - * - The contract must be paused. - */ - modifier whenPaused() { - _requirePaused(); - _; - } - - /** - * @dev Returns true if the contract is paused, and false otherwise. - */ - function paused() public view virtual returns (bool) { - return _paused; - } - - /** - * @dev Throws if the contract is paused. - */ - function _requireNotPaused() internal view virtual { - require(!paused(), "Pausable: paused"); - } - - /** - * @dev Throws if the contract is not paused. - */ - function _requirePaused() internal view virtual { - require(paused(), "Pausable: not paused"); - } - - /** - * @dev Triggers stopped state. - * - * Requirements: - * - * - The contract must not be paused. - */ - function _pause(bytes32 message) internal virtual whenNotPaused { - _paused = true; - emit Paused(msg.sender, message); - } - - /** - * @dev Returns to normal state. - * - * Requirements: - * - * - The contract must be paused. - */ - function _unpause(bytes32 message) internal virtual whenPaused { - _paused = false; - emit Unpaused(msg.sender, message); - } -} From c63ac47e3582a4ea30025aa438b09ca1863d3979 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:13:04 +0800 Subject: [PATCH 14/61] Add pause, cancel functions; add initializer's - Pausing a campaign - Cancelling a campaign - Clonable with Immutable Args --- src/CampaignInfo.sol | 278 +++++++++++++++++++++++++------------------ 1 file changed, 159 insertions(+), 119 deletions(-) diff --git a/src/CampaignInfo.sol b/src/CampaignInfo.sol index 3ef7f277..d238d750 100644 --- a/src/CampaignInfo.sol +++ b/src/CampaignInfo.sol @@ -1,14 +1,17 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; +import "@openzeppelin/contracts/proxy/Clones.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; + import "./interfaces/ICampaignInfo.sol"; import "./interfaces/ICampaignData.sol"; import "./interfaces/ICampaignTreasury.sol"; import "./interfaces/IGlobalParams.sol"; import "./utils/TimestampChecker.sol"; import "./utils/AdminAccessChecker.sol"; -import "./utils/PausableWithMsg.sol"; +import "./utils/PausableCancellable.sol"; /** * @title CampaignInfo @@ -18,31 +21,35 @@ contract CampaignInfo is ICampaignData, ICampaignInfo, Ownable, - PausableWithMsg, + PausableCancellable, TimestampChecker, - AdminAccessChecker + AdminAccessChecker, + Initializable { - address private immutable TREASURY_FACTORY; - address private immutable TOKEN; - uint256 private immutable PROTOCOL_FEE_PERCENT; - bytes32 private immutable IDENTIFIER_HASH; - CampaignData private s_campaignData; - mapping(bytes32 => bool) private s_selectedPlatformBytes; + mapping(bytes32 => bool) private s_selectedPlatformHash; mapping(bytes32 => address) private s_platformTreasuryAddress; mapping(bytes32 => uint256) private s_platformFeePercent; mapping(bytes32 => bytes32) private s_platformData; - bytes32[] private s_approvedPlatformBytes; + bytes32[] private s_approvedplatformHash; + + function getApprovedPlatformHashes() + external + view + returns (bytes32[] memory) + { + return s_approvedplatformHash; + } /** * @dev Emitted when a platform is selected for the campaign. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param platformTreasury The address of the platform's treasury. */ event CampaignInfoPlatformSelected( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, address indexed platformTreasury ); @@ -66,21 +73,21 @@ contract CampaignInfo is /** * @dev Emitted when the selection state of a platform is updated. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param selection The new selection state. */ event CampaignInfoSelectedPlatformUpdated( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, bool selection ); /** * @dev Emitted when platform information is updated for the campaign. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param platformTreasury The address of the platform's treasury. */ event CampaignInfoPlatformInfoUpdated( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, address indexed platformTreasury ); @@ -96,11 +103,11 @@ contract CampaignInfo is /** * @dev Emitted when an invalid platform update is attempted. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param selection The selection state (true/false). */ error CampaignInfoInvalidPlatformUpdate( - bytes32 platformBytes, + bytes32 platformHash, bool selection ); @@ -116,70 +123,73 @@ contract CampaignInfo is /** * @dev Emitted when a platform is not selected for the campaign. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. */ - error CampaignInfoPlatformNotSelected(bytes32 platformBytes); + error CampaignInfoPlatformNotSelected(bytes32 platformHash); - /** - * @param globalParams The address of the global parameters contract. - * @param treasuryFactory The address of the treasury factory contract. - * @param token The address of the campaign token contract. - * @param creator The address of the campaign creator. - * @param protocolFeePercent The protocol fee percentage. - * @param identifierHash The hash identifier for the campaign. - * @param selectedPlatformBytes The list of selected platform identifiers. - * @param platformDataKey The list of platform data keys. - * @param platformDataValue The list of platform data values. - * @param campaignData The initial campaign data. - */ - constructor( - IGlobalParams globalParams, - address treasuryFactory, - address token, + constructor(address creator) Ownable(creator) {} + + function initialize( address creator, - uint256 protocolFeePercent, - bytes32 identifierHash, - bytes32[] memory selectedPlatformBytes, - bytes32[] memory platformDataKey, - bytes32[] memory platformDataValue, - CampaignData memory campaignData - ) AdminAccessChecker(globalParams) { - TREASURY_FACTORY = treasuryFactory; - TOKEN = token; - IDENTIFIER_HASH = identifierHash; - PROTOCOL_FEE_PERCENT = protocolFeePercent; - s_campaignData = campaignData; - - uint256 len = selectedPlatformBytes.length; - unchecked { - for (uint256 i = 0; i < len; ++i) { - s_platformFeePercent[selectedPlatformBytes[i]] = GLOBAL_PARAMS - .getPlatformFeePercent(selectedPlatformBytes[i]); - s_selectedPlatformBytes[selectedPlatformBytes[i]] = true; - } - len = platformDataKey.length; - bool isValid; - for (uint256 i = 0; i < len; ++i) { - isValid = GLOBAL_PARAMS.checkIfPlatformDataKeyValid( - platformDataKey[i] - ); - if (!isValid) { - revert CampaignInfoInvalidInput(); - } - s_platformData[platformDataKey[i]] = platformDataValue[i]; + IGlobalParams globalParams, + bytes32[] calldata selectedPlatformHash, + bytes32[] calldata platformDataKey, + bytes32[] calldata platformDataValue + ) external initializer { + __AccessChecker_init(globalParams); + _transferOwnership(creator); + uint256 len = selectedPlatformHash.length; + for (uint256 i = 0; i < len; ++i) { + s_platformFeePercent[selectedPlatformHash[i]] = GLOBAL_PARAMS + .getPlatformFeePercent(selectedPlatformHash[i]); + s_selectedPlatformHash[selectedPlatformHash[i]] = true; + } + len = platformDataKey.length; + bool isValid; + for (uint256 i = 0; i < len; ++i) { + isValid = GLOBAL_PARAMS.checkIfPlatformDataKeyValid( + platformDataKey[i] + ); + if (!isValid) { + revert CampaignInfoInvalidInput(); } + s_platformData[platformDataKey[i]] = platformDataValue[i]; } + } + + struct Config { + address treasuryFactory; + address token; + uint256 protocolFeePercent; + bytes32 identifierHash; + uint256 launchTime; + uint256 deadline; + uint256 goalAmount; + } - transferOwnership(creator); + function getCampaignConfig() public view returns (Config memory config) { + bytes memory args = Clones.fetchCloneArgs(address(this)); + ( + config.treasuryFactory, + config.token, + config.protocolFeePercent, + config.identifierHash, + config.launchTime, + config.deadline, + config.goalAmount + ) = abi.decode( + args, + (address, address, uint256, bytes32, uint256, uint256, uint256) + ); } /** * @inheritdoc ICampaignInfo */ function checkIfPlatformSelected( - bytes32 platformBytes + bytes32 platformHash ) public view override returns (bool) { - return s_selectedPlatformBytes[platformBytes]; + return s_selectedPlatformHash[platformHash]; } /** @@ -194,12 +204,19 @@ contract CampaignInfo is account = super.owner(); } + /** + * @inheritdoc ICampaignInfo + */ + function getProtocolAdminAddress() public view override returns (address) { + return GLOBAL_PARAMS.getProtocolAdminAddress(); + } + /** * @inheritdoc ICampaignInfo */ function getTotalRaisedAmount() external view override returns (uint256) { - bytes32[] memory tempPlatforms = s_approvedPlatformBytes; - uint256 length = s_approvedPlatformBytes.length; + bytes32[] memory tempPlatforms = s_approvedplatformHash; + uint256 length = s_approvedplatformHash.length; uint256 amount; address tempTreasury; for (uint256 i = 0; i < length; i++) { @@ -209,60 +226,53 @@ contract CampaignInfo is return amount; } - /** - * @inheritdoc ICampaignInfo - */ - function getProtocolAdminAddress() - external - view - override - returns (address) - { - return GLOBAL_PARAMS.getProtocolAdminAddress(); - } - /** * @inheritdoc ICampaignInfo */ function getPlatformAdminAddress( - bytes32 platformBytes + bytes32 platformHash ) external view override returns (address) { - return GLOBAL_PARAMS.getPlatformAdminAddress(platformBytes); + return GLOBAL_PARAMS.getPlatformAdminAddress(platformHash); } /** * @inheritdoc ICampaignInfo */ - function getLaunchTime() external view override returns (uint256) { - return s_campaignData.launchTime; + function getLaunchTime() public view override returns (uint256) { + Config memory config = getCampaignConfig(); + return config.launchTime; } /** * @inheritdoc ICampaignInfo */ function getDeadline() external view override returns (uint256) { - return s_campaignData.deadline; + Config memory config = getCampaignConfig(); + return config.deadline; } /** * @inheritdoc ICampaignInfo */ function getGoalAmount() external view override returns (uint256) { - return s_campaignData.goalAmount; + Config memory config = getCampaignConfig(); + return config.goalAmount; } /** * @inheritdoc ICampaignInfo */ function getTokenAddress() external view override returns (address) { - return TOKEN; + Config memory config = getCampaignConfig(); + return config.token; } /** * @inheritdoc ICampaignInfo */ function getProtocolFeePercent() external view override returns (uint256) { - return PROTOCOL_FEE_PERCENT; + Config memory config = getCampaignConfig(); + return config.protocolFeePercent; } /** @@ -271,19 +281,31 @@ contract CampaignInfo is function paused() public view - override(ICampaignInfo, PausableWithMsg) + override(ICampaignInfo, PausableCancellable) returns (bool) { return super.paused(); } + /** + * @inheritdoc ICampaignInfo + */ + function cancelled() + public + view + override(ICampaignInfo, PausableCancellable) + returns (bool) + { + return super.cancelled(); + } + /** * @inheritdoc ICampaignInfo */ function getPlatformFeePercent( - bytes32 platformBytes + bytes32 platformHash ) external view override returns (uint256) { - return s_platformFeePercent[platformBytes]; + return s_platformFeePercent[platformHash]; } /** @@ -303,7 +325,8 @@ contract CampaignInfo is * @inheritdoc ICampaignInfo */ function getIdentifierHash() external view override returns (bytes32) { - return IDENTIFIER_HASH; + Config memory config = getCampaignConfig(); + return config.identifierHash; } /** @@ -334,7 +357,7 @@ contract CampaignInfo is external override onlyOwner - currentTimeIsLess(s_campaignData.launchTime) + currentTimeIsLess(getLaunchTime()) whenNotPaused { s_campaignData.deadline = deadline; @@ -361,7 +384,7 @@ contract CampaignInfo is * @inheritdoc ICampaignInfo */ function updateSelectedPlatform( - bytes32 platformBytes, + bytes32 platformHash, bool selection ) external @@ -370,42 +393,59 @@ contract CampaignInfo is currentTimeIsLess(s_campaignData.launchTime) whenNotPaused { - if (s_selectedPlatformBytes[platformBytes] != selection) { - revert CampaignInfoInvalidPlatformUpdate(platformBytes, selection); + if (s_selectedPlatformHash[platformHash] != selection) { + revert CampaignInfoInvalidPlatformUpdate(platformHash, selection); } - s_selectedPlatformBytes[platformBytes] = selection; - emit CampaignInfoSelectedPlatformUpdated(platformBytes, selection); + s_selectedPlatformHash[platformHash] = selection; + emit CampaignInfoSelectedPlatformUpdated(platformHash, selection); + } + + /** + * @dev External function to pause the campaign. + */ + function _pauseCampaign(bytes32 message) external onlyProtocolAdmin { + _pause(message); + } + + /** + * @dev External function to unpause the campaign. + */ + function _unpauseCampaign(bytes32 message) external onlyProtocolAdmin { + _unpause(message); + } + + /** + * @dev External function to cancel the campaign. + */ + function _cancelCampaign(bytes32 message) external { + if (msg.sender != getProtocolAdminAddress() && msg.sender != owner()) { + revert CampaignInfoUnauthorized(); + } + _cancel(message); } /** * @dev Sets platform information for the campaign. - * @param platformBytes The bytes32 identifier of the platform. + * @param platformHash The bytes32 identifier of the platform. * @param platformTreasuryAddress The address of the platform's treasury. */ function _setPlatformInfo( - bytes32 platformBytes, + bytes32 platformHash, address platformTreasuryAddress ) external whenNotPaused { - if (msg.sender != TREASURY_FACTORY) { + Config memory config = getCampaignConfig(); + if (msg.sender != config.treasuryFactory) { revert CampaignInfoUnauthorized(); } - bool selected = checkIfPlatformSelected(platformBytes); + bool selected = checkIfPlatformSelected(platformHash); if (!selected) { - revert CampaignInfoPlatformNotSelected(platformBytes); + revert CampaignInfoPlatformNotSelected(platformHash); } - s_platformTreasuryAddress[platformBytes] = platformTreasuryAddress; - s_approvedPlatformBytes.push(platformBytes); + s_platformTreasuryAddress[platformHash] = platformTreasuryAddress; + s_approvedplatformHash.push(platformHash); emit CampaignInfoPlatformInfoUpdated( - platformBytes, + platformHash, platformTreasuryAddress ); } - - function _pauseCampaign(bytes32 message) external onlyProtocolAdmin { - _pause(message); - } - - function _unpauseCampaign(bytes32 message) external onlyProtocolAdmin { - _unpause(message); - } -} \ No newline at end of file +} From e10bf74d9068f312189b0736b8cc0620c56d1072 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:20:21 +0800 Subject: [PATCH 15/61] Refactor GlobalParams - Update imports - Replace `platformBytes` with `platformHash` - Update function names --- src/GlobalParams.sol | 196 +++++++++++++++++++++++-------------------- 1 file changed, 105 insertions(+), 91 deletions(-) diff --git a/src/GlobalParams.sol b/src/GlobalParams.sol index a93c698d..5514fd22 100644 --- a/src/GlobalParams.sol +++ b/src/GlobalParams.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/security/Pausable.sol"; -import "@openzeppelin/contracts/utils/Counters.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; import "./interfaces/IGlobalParams.sol"; +import "./utils/Counters.sol"; /** * @title GlobalParams @@ -29,21 +29,21 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @dev Emitted when a platform is enlisted. - * @param platformBytes The identifier of the enlisted platform. + * @param platformHash The identifier of the enlisted platform. * @param platformAdminAddress The admin address of the enlisted platform. * @param platformFeePercent The fee percentage of the enlisted platform. */ event PlatformEnlisted( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, address indexed platformAdminAddress, uint256 platformFeePercent ); /** * @dev Emitted when a platform is delisted. - * @param platformBytes The identifier of the delisted platform. + * @param platformHash The identifier of the delisted platform. */ - event PlatformDelisted(bytes32 indexed platformBytes); + event PlatformDelisted(bytes32 indexed platformHash); /** * @dev Emitted when the protocol admin address is updated. @@ -65,31 +65,31 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @dev Emitted when the platform admin address is updated. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. * @param newAdminAddress The new admin address of the platform. */ event PlatformAdminAddressUpdated( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, address indexed newAdminAddress ); /** * @dev Emitted when platform data is added. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. * @param platformDataKey The data key added to the platform. */ event PlatformDataAdded( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, bytes32 indexed platformDataKey ); /** * @dev Emitted when platform data is removed. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. * @param platformDataKey The data key removed from the platform. */ event PlatformDataRemoved( - bytes32 indexed platformBytes, + bytes32 indexed platformHash, bytes32 platformDataKey ); @@ -100,31 +100,27 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @dev Throws when the platform is not listed. - * @param platformBytes The identifier of the platform. - * @param platformAdminAddress The admin address of the platform. + * @param platformHash The identifier of the platform. */ - error GlobalParamsPlatformNotListed( - bytes32 platformBytes, - address platformAdminAddress - ); + error GlobalParamsPlatformNotListed(bytes32 platformHash); /** * @dev Throws when the platform is already listed. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. */ - error GlobalParamsPlatformAlreadyListed(bytes32 platformBytes); + error GlobalParamsPlatformAlreadyListed(bytes32 platformHash); /** * @dev Throws when the platform admin is not set. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. */ - error GlobalParamsPlatformAdminNotSet(bytes32 platformBytes); + error GlobalParamsPlatformAdminNotSet(bytes32 platformHash); /** * @dev Throws when the platform fee percent is zero. - * @param platformBytes The identifier of the platform. + * @param platformHash The identifier of the platform. */ - error GlobalParamsPlatformFeePercentIsZero(bytes32 platformBytes); + error GlobalParamsPlatformFeePercentIsZero(bytes32 platformHash); /** * @dev Throws when the platform data is already set. @@ -150,17 +146,24 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { * @dev Reverts if the input address is zero. */ modifier notAddressZero(address account) { - _checkIfAddressZero(account); + _revertIfAddressZero(account); _; } /** * @dev Modifier that restricts function access to platform administrators of a specific platform. * Users attempting to execute functions with this modifier must be the platform admin for the given platform. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - modifier onlyPlatformAdmin(bytes32 platformBytes) { - _checkIfPlatformAdmin(platformBytes); + modifier onlyPlatformAdmin(bytes32 platformHash) { + _onlyPlatformAdmin(platformHash); + _; + } + + modifier platformIsListed(bytes32 platformHash) { + if (!checkIfPlatformIsListed(platformHash)) { + revert GlobalParamsPlatformNotListed(platformHash); + } _; } @@ -173,7 +176,7 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { address protocolAdminAddress, address tokenAddress, uint256 protocolFeePercent - ) { + ) Ownable(protocolAdminAddress) { s_protocolAdminAddress = protocolAdminAddress; s_tokenAddress = tokenAddress; s_protocolFeePercent = protocolFeePercent; @@ -182,21 +185,27 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @inheritdoc IGlobalParams */ - function checkIfplatformIsListed( - bytes32 platformBytes - ) external view override returns (bool) { - return s_platformIsListed[platformBytes]; + function checkIfPlatformIsListed( + bytes32 platformHash + ) public view override returns (bool) { + return s_platformIsListed[platformHash]; } /** * @inheritdoc IGlobalParams */ function getPlatformAdminAddress( - bytes32 platformBytes - ) external view override returns (address account) { - account = s_platformAdminAddress[platformBytes]; + bytes32 platformHash + ) + external + view + override + platformIsListed(platformHash) + returns (address account) + { + account = s_platformAdminAddress[platformHash]; if (account == address(0)) { - revert GlobalParamsPlatformAdminNotSet(platformBytes); + revert GlobalParamsPlatformAdminNotSet(platformHash); } } @@ -242,12 +251,15 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { * @inheritdoc IGlobalParams */ function getPlatformFeePercent( - bytes32 platformBytes - ) external view override returns (uint256 platformFeePercent) { - platformFeePercent = s_platformFeePercent[platformBytes]; - if (platformFeePercent == 0) { - revert GlobalParamsPlatformFeePercentIsZero(platformBytes); - } + bytes32 platformHash + ) + external + view + override + platformIsListed(platformHash) + returns (uint256 platformFeePercent) + { + platformFeePercent = s_platformFeePercent[platformHash]; } /** @@ -255,9 +267,15 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { */ function getPlatformDataOwner( bytes32 platformDataKey - ) external view override returns (bytes32 platformBytes) { - platformBytes = s_platformDataOwner[platformDataKey]; - if (platformBytes == ZERO_BYTES) { + ) + external + view + override + platformIsListed(platformHash) + returns (bytes32 platformHash) + { + platformHash = s_platformDataOwner[platformDataKey]; + if (platformHash == ZERO_BYTES) { revert GlobalParamsInvalidInput(); } } @@ -273,24 +291,24 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @notice Enlists a platform with its admin address and fee percentage. - * @param platformBytes The platform's identifier. + * @param platformHash The platform's identifier. * @param platformAdminAddress The platform's admin address. * @param platformFeePercent The platform's fee percentage. */ function enlistPlatform( - bytes32 platformBytes, + bytes32 platformHash, address platformAdminAddress, uint256 platformFeePercent ) external onlyOwner { - if (s_platformIsListed[platformBytes]) { - revert GlobalParamsPlatformAlreadyListed(platformBytes); + if (s_platformIsListed[platformHash]) { + revert GlobalParamsPlatformAlreadyListed(platformHash); } else { - s_platformIsListed[platformBytes] = true; - s_platformAdminAddress[platformBytes] = platformAdminAddress; - s_platformFeePercent[platformBytes] = platformFeePercent; + s_platformIsListed[platformHash] = true; + s_platformAdminAddress[platformHash] = platformAdminAddress; + s_platformFeePercent[platformHash] = platformFeePercent; s_numberOfListedPlatforms.increment(); emit PlatformEnlisted( - platformBytes, + platformHash, platformAdminAddress, platformFeePercent ); @@ -299,51 +317,51 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @notice Delists a platform. - * @param platformBytes The platform's identifier. + * @param platformHash The platform's identifier. */ - function delistPlatform(bytes32 platformBytes) external onlyOwner { - if (!s_platformIsListed[platformBytes]) { - revert GlobalParamsPlatformNotListed(platformBytes, address(0)); + function delistPlatform(bytes32 platformHash) external onlyOwner { + if (!s_platformIsListed[platformHash]) { + revert GlobalParamsPlatformNotListed(platformHash); } - s_platformIsListed[platformBytes] = false; - s_platformAdminAddress[platformBytes] = address(0); - s_platformFeePercent[platformBytes] = 0; + s_platformIsListed[platformHash] = false; + s_platformAdminAddress[platformHash] = address(0); + s_platformFeePercent[platformHash] = 0; s_numberOfListedPlatforms.decrement(); - emit PlatformDelisted(platformBytes); + emit PlatformDelisted(platformHash); } /** * @notice Adds platform-specific data key. - * @param platformBytes The platform's identifier. + * @param platformHash The platform's identifier. * @param platformDataKey The platform data key. */ function addPlatformData( - bytes32 platformBytes, + bytes32 platformHash, bytes32 platformDataKey - ) external onlyPlatformAdmin(platformBytes) { + ) external platformIsListed(platformHash) onlyPlatformAdmin(platformHash) { if (platformDataKey == ZERO_BYTES) { revert GlobalParamsInvalidInput(); } if (s_platformData[platformDataKey] != false) { revert GlobalParamsPlatformDataAlreadySet(); } - if (s_platformDataOwner[platformDataKey] == platformBytes) { + if (s_platformDataOwner[platformDataKey] == platformHash) { revert GlobalParamsPlatformDataSlotTaken(); } s_platformData[platformDataKey] = true; - s_platformDataOwner[platformDataKey] = platformBytes; - emit PlatformDataAdded(platformBytes, platformDataKey); + s_platformDataOwner[platformDataKey] = platformHash; + emit PlatformDataAdded(platformHash, platformDataKey); } /** * @notice Removes platform-specific data key. - * @param platformBytes The platform's identifier. + * @param platformHash The platform's identifier. * @param platformDataKey The platform data key. */ function removePlatformData( - bytes32 platformBytes, + bytes32 platformHash, bytes32 platformDataKey - ) external onlyPlatformAdmin(platformBytes) { + ) external platformIsListed(platformHash) onlyPlatformAdmin(platformHash) { if (platformDataKey == ZERO_BYTES) { revert GlobalParamsInvalidInput(); } @@ -352,7 +370,7 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { } s_platformData[platformDataKey] = false; s_platformDataOwner[platformDataKey] = ZERO_BYTES; - emit PlatformDataRemoved(platformBytes, platformDataKey); + emit PlatformDataRemoved(platformHash, platformDataKey); } /** @@ -389,27 +407,23 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { * @inheritdoc IGlobalParams */ function updatePlatformAdminAddress( - bytes32 platformBytes, + bytes32 platformHash, address platformAdminAddress - ) external override onlyOwner notAddressZero(platformAdminAddress) { - if (s_platformIsListed[platformBytes]) { - s_platformAdminAddress[platformBytes] = platformAdminAddress; - emit PlatformAdminAddressUpdated( - platformBytes, - platformAdminAddress - ); - } else { - revert GlobalParamsPlatformNotListed( - platformBytes, - platformAdminAddress - ); - } + ) + external + override + onlyOwner + platformIsListed(platformHash) + notAddressZero(platformAdminAddress) + { + s_platformAdminAddress[platformHash] = platformAdminAddress; + emit PlatformAdminAddressUpdated(platformHash, platformAdminAddress); } /** * @dev Reverts if the input address is zero. */ - function _checkIfAddressZero(address account) internal pure { + function _revertIfAddressZero(address account) internal pure { if (account == address(0)) { revert GlobalParamsInvalidInput(); } @@ -418,10 +432,10 @@ contract GlobalParams is IGlobalParams, Ownable, Pausable { /** * @dev Internal function to check if the sender is the platform administrator for a specific platform. * If the sender is not the platform admin, it reverts with AdminAccessCheckerUnauthorized error. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - function _checkIfPlatformAdmin(bytes32 platformBytes) private view { - if (msg.sender != s_platformAdminAddress[platformBytes]) { + function _onlyPlatformAdmin(bytes32 platformHash) private view { + if (msg.sender != s_platformAdminAddress[platformHash]) { revert GlobalParamsUnauthorized(); } } From 75f506ad7c27cdba8a1fdc7cfb504f32a1942c37 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:22:16 +0800 Subject: [PATCH 16/61] Update TreasuryFactory interface --- src/interfaces/ITreasuryFactory.sol | 100 +++++++++++++++++----------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/src/interfaces/ITreasuryFactory.sol b/src/interfaces/ITreasuryFactory.sol index 0f47341e..dfd8242b 100644 --- a/src/interfaces/ITreasuryFactory.sol +++ b/src/interfaces/ITreasuryFactory.sol @@ -1,60 +1,80 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title ITreasuryFactory - * @dev Interface for the TreasuryFactory contract, which deploys campaign treasuries with specific bytecode. + * @dev Interface for the TreasuryFactory contract, which registers, approves, and deploys treasury clones. */ interface ITreasuryFactory { /** - * @dev Function to compute the address of a treasury based on the identifier hash, platform, and bytecode index. - * @param identifierHash The unique hash identifier of the campaign. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template. - * @return treasuryAddress The computed treasury address. - * @return isDeployed A boolean indicating whether the treasury is already deployed. + * @dev Emitted when a new treasury is deployed. + * @param platformHash The platform identifier. + * @param implementationId The ID of the approved implementation. + * @param infoAddress The campaign info address linked to the treasury. + * @param treasuryAddress The deployed treasury address. */ - function computeTreasuryAddress( - bytes32 identifierHash, - bytes32 platformBytes, - uint256 bytecodeIndex - ) external view returns (address treasuryAddress, bool isDeployed); + event TreasuryFactoryTreasuryDeployed( + bytes32 indexed platformHash, + uint256 indexed implementationId, + address indexed infoAddress, + address treasuryAddress + ); /** - * @dev Function to add a fragment of the full bytecode of treasury contract for a given platform. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template. - * @param chunkIndex The index of the bytecode chunk. - * @param isLastChunk The boolean to determine if this is the last chunk. - * @param bytecodeChunk The bytecode fragment to add. + * @notice Registers a treasury implementation for a given platform. + * @dev Callable only by the platform admin. + * @param platformHash The platform identifier. + * @param implementationId The ID to assign to the implementation. + * @param implementation The contract address of the implementation. */ - function addBytecodeChunk( - bytes32 platformBytes, - uint256 bytecodeIndex, - uint256 chunkIndex, - bool isLastChunk, - bytes memory bytecodeChunk + function registerTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId, + address implementation ) external; /** - * @dev Function to remove a bytecode template for a specific platform and index. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template. + * @notice Approves a previously registered implementation. + * @dev Callable only by the protocol admin. + * @param platformHash The platform identifier. + * @param implementationId The ID of the implementation to approve. */ - function removeBytecode( - bytes32 platformBytes, - uint256 bytecodeIndex + function approveTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId ) external; /** - * @dev Function to deploy a new treasury contract with a specified bytecode template. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template to use for deployment. - * @param infoAddress The address of the associated campaign. + * @notice Disapproves a previously approved treasury implementation. + * @param implementation The address of the implementation to disapprove. */ - function deploy( - bytes32 platformBytes, - uint256 bytecodeIndex, - address infoAddress + function disapproveTreasuryImplementation(address implementation) external; + + /** + * @notice Removes a registered treasury implementation from a platform. + * @param platformHash The platform identifier. + * @param implementationId The implementation ID to remove. + */ + function removeTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId ) external; -} \ No newline at end of file + + /** + * @notice Deploys a treasury clone using an approved implementation. + * @dev Callable only by the platform admin. + * @param platformHash The platform identifier. + * @param infoAddress The address of the campaign info contract. + * @param implementationId The ID of the implementation to use. + * @param name The name of the treasury token. + * @param symbol The symbol of the treasury token. + * @return clone The address of the deployed treasury contract. + */ + function deploy( + bytes32 platformHash, + address infoAddress, + uint256 implementationId, + string calldata name, + string calldata symbol + ) external returns (address clone); +} From a85d78b8945a7d4fa202de0e7d53f6ede031217e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:24:50 +0800 Subject: [PATCH 17/61] Upgrade treasury deployment method - Remove deterministic create2 deployment - Remove bytecode deployment methods - Introduce ERC1167 minimal proxy --- src/TreasuryFactory.sol | 304 +++++++++++----------------------------- 1 file changed, 78 insertions(+), 226 deletions(-) diff --git a/src/TreasuryFactory.sol b/src/TreasuryFactory.sol index aa186da0..8670b5e7 100644 --- a/src/TreasuryFactory.sol +++ b/src/TreasuryFactory.sol @@ -1,279 +1,131 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/proxy/Clones.sol"; import "./CampaignInfo.sol"; import "./interfaces/ITreasuryFactory.sol"; import "./utils/AdminAccessChecker.sol"; import "./utils/AddressCalculator.sol"; -import "hardhat/console.sol"; contract TreasuryFactory is ITreasuryFactory, AdminAccessChecker { - mapping(bytes32 => mapping(uint256 => bytes[])) private s_platformBytecode; - mapping(bytes32 => mapping(uint256 => bool)) - private s_platformBytecodeStatus; - mapping(bytes32 => mapping(uint256 => bool)) private s_approvedBytecode; - - address private immutable CAMPAIGN_INFO_FACTORY; - bytes32 private immutable CAMPAIGNINFO_BYTECODEHASH; - - /** - * @dev Event emitted when a new bytecode is added for a specific platform and index. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template. - * @param bytecode The bytecode template added. - */ - event TreasuryFactoryBytecodeChunkAdded( - bytes32 indexed platformBytes, - uint256 indexed bytecodeIndex, - uint256 indexed bytecodeChunk, - bytes bytecode - ); - - /** - * @dev Event emitted when a bytecode is removed for a specific platform and index. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the bytecode template. - */ - event TreasuryFactoryBytecodeRemoved( - bytes32 indexed platformBytes, - uint256 indexed bytecodeIndex - ); - - /** - * @dev Event emitted when a bytecode is enlisted for deployment. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the enlisted bytecode. - */ - event TreasuryFactoryBytecodeEnlisted( - bytes32 indexed platformBytes, - uint256 indexed bytecodeIndex - ); - - /** - * @dev Event emitted when a bytecode is delisted and no longer available for deployment. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the delisted bytecode. - */ - event TreasuryFactoryBytecodeDelisted( - bytes32 indexed platformBytes, - uint256 indexed bytecodeIndex - ); - - /** - * @dev Event emitted when a new treasury is deployed. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the deployed bytecode. - * @param infoAddress The address of the associated campaign. - * @param treasuryAddress The address of the deployed treasury. - */ - event TreasuryFactoryTreasuryDeployed( - bytes32 indexed platformBytes, - uint256 indexed bytecodeIndex, - address indexed infoAddress, - address treasuryAddress - ); + mapping(bytes32 => mapping(uint256 => address)) implementationMap; + mapping(address => bool) approvedImplementations; error TreasuryFactoryUnauthorized(); error TreasuryFactoryInvalidKey(); - error TreasuryFactoryIncorrectChunkIndex(); - error TreasuryFactoryBytecodeExists(); - error TreasuryFactoryBytecodeIsNotAdded(); - error TreasuryFactoryBytecodeAlreadyApproved(); - error TreasuryFactoryBytecodeIncomplete(); - error TreasuryFactoryBytecodeNotApproved(); error TreasuryFactoryTreasuryCreationFailed(); error TreasuryFactoryInvalidAddress(); + error TreasuryFactoryImplementationNotSet(); + error TreasuryFactoryImplementationNotSetOrApproved(); + error TreasuryFactoryTreasuryInitializationFailed(); /** * @notice Initializes the TreasuryFactory contract. * @dev This constructor sets the address of the GlobalParams contract as the admin. - * @param globalParams Address of the GlobalParams contract. - * @param infoFactory Address of the CampaignInfoFactory contract. - * @param bytecodeHash Keccak256 hash of the CampaignInfo bytecode. - */ - constructor( - IGlobalParams globalParams, - address infoFactory, - bytes32 bytecodeHash - ) AdminAccessChecker(globalParams) { - CAMPAIGN_INFO_FACTORY = infoFactory; - CAMPAIGNINFO_BYTECODEHASH = bytecodeHash; - } - - /** - * @inheritdoc ITreasuryFactory */ - function computeTreasuryAddress( - bytes32 identifierHash, - bytes32 platformBytes, - uint256 bytecodeIndex - ) - external - view - override - returns (address treasuryAddress, bool isDeployed) - { - (treasuryAddress, isDeployed) = AddressCalculator.computeAddress( - keccak256(abi.encodePacked(identifierHash, platformBytes)), - keccak256( - abi.encode(s_platformBytecode[platformBytes][bytecodeIndex]) - ), - address(this) - ); + constructor(IGlobalParams globalParams) { + __AccessChecker_init(globalParams); } /** * @inheritdoc ITreasuryFactory */ - function addBytecodeChunk( - bytes32 platformBytes, - uint256 bytecodeIndex, - uint256 chunkIndex, - bool isLastChunk, - bytes memory bytecodeChunk - ) external override onlyPlatformAdmin(platformBytes) { - if ( - s_platformBytecode[platformBytes][bytecodeIndex].length != - chunkIndex - ) { - revert TreasuryFactoryIncorrectChunkIndex(); - } - if (s_platformBytecodeStatus[platformBytes][bytecodeIndex]) { - revert TreasuryFactoryBytecodeExists(); - } - if (isLastChunk) { - s_platformBytecodeStatus[platformBytes][bytecodeIndex] = true; + function registerTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId, + address implementation + ) external override onlyPlatformAdmin(platformHash) { + if (implementation == address(0)) { + revert TreasuryFactoryInvalidAddress(); } - s_platformBytecode[platformBytes][bytecodeIndex].push(bytecodeChunk); - emit TreasuryFactoryBytecodeChunkAdded( - platformBytes, - bytecodeIndex, - chunkIndex, - bytecodeChunk - ); + implementationMap[platformHash][implementationId] = implementation; } /** * @inheritdoc ITreasuryFactory */ - function removeBytecode( - bytes32 platformBytes, - uint256 bytecodeIndex - ) external override onlyPlatformAdmin(platformBytes) { - if (s_platformBytecode[platformBytes][bytecodeIndex].length == 0) { - revert TreasuryFactoryBytecodeIsNotAdded(); + function approveTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId + ) external override onlyProtocolAdmin { + address implementation = implementationMap[platformHash][ + implementationId + ]; + if (implementation == address(0)) { + revert TreasuryFactoryImplementationNotSet(); } - delete s_platformBytecode[platformBytes][bytecodeIndex]; - emit TreasuryFactoryBytecodeRemoved(platformBytes, bytecodeIndex); + approvedImplementations[implementation] = true; } /** - * @dev Function to enlist a bytecode template for deployment. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the enlisted bytecode template. + * @inheritdoc ITreasuryFactory */ - function enlistBytecode( - bytes32 platformBytes, - uint256 bytecodeIndex - ) external onlyProtocolAdmin { - if (!s_platformBytecodeStatus[platformBytes][bytecodeIndex]) { - revert TreasuryFactoryBytecodeIncomplete(); - } - if (s_approvedBytecode[platformBytes][bytecodeIndex]) { - revert TreasuryFactoryBytecodeAlreadyApproved(); - } - s_approvedBytecode[platformBytes][bytecodeIndex] = true; - emit TreasuryFactoryBytecodeEnlisted(platformBytes, bytecodeIndex); + function disapproveTreasuryImplementation( + address implementation + ) external override onlyProtocolAdmin { + approvedImplementations[implementation] = false; } /** - * @dev Function to delist a bytecode template, making it unavailable for deployment. - * @param platformBytes The platform identifier. - * @param bytecodeIndex The index of the delisted bytecode template. + * @inheritdoc ITreasuryFactory */ - function delistBytecode( - bytes32 platformBytes, - uint256 bytecodeIndex - ) external onlyProtocolAdmin { - if (!s_approvedBytecode[platformBytes][bytecodeIndex]) { - revert TreasuryFactoryInvalidKey(); - } - s_approvedBytecode[platformBytes][bytecodeIndex] = false; - delete s_platformBytecode[platformBytes][bytecodeIndex]; - emit TreasuryFactoryBytecodeDelisted(platformBytes, bytecodeIndex); + function removeTreasuryImplementation( + bytes32 platformHash, + uint256 implementationId + ) external override onlyPlatformAdmin(platformHash) { + delete implementationMap[platformHash][implementationId]; } /** * @inheritdoc ITreasuryFactory */ function deploy( - bytes32 platformBytes, - uint256 bytecodeIndex, - address infoAddress - ) external override onlyPlatformAdmin(platformBytes) { - if (!s_approvedBytecode[platformBytes][bytecodeIndex]) { - revert TreasuryFactoryBytecodeNotApproved(); - } - if (infoAddress == address(0)) { - revert TreasuryFactoryInvalidAddress(); + bytes32 platformHash, + address infoAddress, + uint256 implementationId, + string calldata name, + string calldata symbol + ) + external + override + onlyPlatformAdmin(platformHash) + returns (address clone) + { + address implementation = implementationMap[platformHash][ + implementationId + ]; + if (!approvedImplementations[implementation]) { + revert TreasuryFactoryImplementationNotSetOrApproved(); } - bytes memory argsBytecode = abi.encodePacked( - _concatenateBytes(s_platformBytecode[platformBytes][bytecodeIndex]), - abi.encode(platformBytes, infoAddress) + + clone = Clones.clone(implementation); + + (bool success, ) = clone.call( + abi.encodeWithSignature( + "initialize(bytes32,address,string,string)", + platformHash, + infoAddress, + name, + symbol + ) ); - bytes32 salt = keccak256(abi.encodePacked(infoAddress, platformBytes)); - address treasury; - assembly { - treasury := create2( - 0, - add(argsBytecode, 0x20), - mload(argsBytecode), - salt + require(success, "Treasury initialization failed"); + (success, ) = infoAddress.call( + abi.encodeWithSignature( + "_setPlatformInfo(bytes32,address)", + platformHash, + clone ) + ); + if (!success) { + revert TreasuryFactoryTreasuryInitializationFailed(); } - if (treasury == address(0)) { - revert TreasuryFactoryTreasuryCreationFailed(); - } - CampaignInfo(infoAddress)._setPlatformInfo(platformBytes, treasury); emit TreasuryFactoryTreasuryDeployed( - platformBytes, - bytecodeIndex, + platformHash, + implementationId, infoAddress, - treasury + clone ); } - - /** - * @dev Concatenates multiple byte arrays into one. - * @param chunks The byte arrays to concatenate. - */ - function _concatenateBytes( - bytes[] memory chunks - ) private pure returns (bytes memory) { - uint totalLength = 0; - for (uint i = 0; i < chunks.length; i++) { - totalLength += chunks[i].length; - } - - bytes memory result = new bytes(totalLength); - - uint destOffset = 0; - for (uint i = 0; i < chunks.length; i++) { - bytes memory chunk = chunks[i]; - uint chunkLength = chunk.length; - - assembly { - for { - let j := 0 - } lt(j, chunkLength) { - j := add(j, 1) - } { - let byteData := byte(0, mload(add(add(chunk, 0x20), j))) - mstore8(add(add(result, 0x20), destOffset), byteData) - destOffset := add(destOffset, 1) - } - } - } - return result; - } } From e82b91cbeec802f705603e898a66d4d3f135eeda Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:25:29 +0800 Subject: [PATCH 18/61] Remove Pausible import from Global params --- src/GlobalParams.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/GlobalParams.sol b/src/GlobalParams.sol index 5514fd22..317db7cb 100644 --- a/src/GlobalParams.sol +++ b/src/GlobalParams.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/Pausable.sol"; import "./interfaces/IGlobalParams.sol"; import "./utils/Counters.sol"; @@ -11,7 +10,7 @@ import "./utils/Counters.sol"; * @title GlobalParams * @notice Manages global parameters and platform information. */ -contract GlobalParams is IGlobalParams, Ownable, Pausable { +contract GlobalParams is IGlobalParams, Ownable { using Counters for Counters.Counter; bytes32 private constant ZERO_BYTES = From 26ff02394d50d199ec794923e0efd508d8b1c40e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:25:53 +0800 Subject: [PATCH 19/61] Add counters in utils --- src/utils/Counters.sol | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/utils/Counters.sol diff --git a/src/utils/Counters.sol b/src/utils/Counters.sol new file mode 100644 index 00000000..6e978a29 --- /dev/null +++ b/src/utils/Counters.sol @@ -0,0 +1,48 @@ +// NOTE: This is a local copy of OpenZeppelin's Counters library (removed in v5.x). +// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/utils/Counters.sol +// Reason: Used for backwards-compatible counter functionality in v5-based projects. + + +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) + +pragma solidity ^0.8.0; + +/** + * @title Counters + * @author Matt Condon (@shrugs) + * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number + * of elements in a mapping, issuing ERC721 ids, or counting request ids. + * + * Include with `using Counters for Counters.Counter;` + */ +library Counters { + struct Counter { + // This variable should never be directly accessed by users of the library: interactions must be restricted to + // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add + // this feature: see https://github.com/ethereum/solidity/issues/4637 + uint256 _value; // default: 0 + } + + function current(Counter storage counter) internal view returns (uint256) { + return counter._value; + } + + function increment(Counter storage counter) internal { + unchecked { + counter._value += 1; + } + } + + function decrement(Counter storage counter) internal { + uint256 value = counter._value; + require(value > 0, "Counter: decrement overflow"); + unchecked { + counter._value = value - 1; + } + } + + function reset(Counter storage counter) internal { + counter._value = 0; + } +} \ No newline at end of file From 74b28d6c284810ce180105cf098fe103f7feb2ff Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:27:04 +0800 Subject: [PATCH 20/61] Refactor CampaignAccessChecker to make compatible with ERC1167 proxy deployments --- src/utils/CampaignAccessChecker.sol | 30 +++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/utils/CampaignAccessChecker.sol b/src/utils/CampaignAccessChecker.sol index 7f2dfe83..c292bef6 100644 --- a/src/utils/CampaignAccessChecker.sol +++ b/src/utils/CampaignAccessChecker.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "../interfaces/ICampaignInfo.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; /** * @title CampaignAccessChecker @@ -10,8 +11,8 @@ import "../interfaces/ICampaignInfo.sol"; */ abstract contract CampaignAccessChecker { // Immutable reference to the ICampaignInfo contract, which provides campaign-related information and admin addresses. - ICampaignInfo internal immutable INFO; - + ICampaignInfo internal INFO; + /** * @dev Throws when the caller is not authorized. */ @@ -21,7 +22,8 @@ abstract contract CampaignAccessChecker { * @dev Constructor to initialize the contract with the address of the campaign information contract. * @param campaignInfo The address of the ICampaignInfo contract. */ - constructor(address campaignInfo) { + + function __CampaignAccessChecker_init(address campaignInfo) internal { INFO = ICampaignInfo(campaignInfo); } @@ -30,17 +32,17 @@ abstract contract CampaignAccessChecker { * Users attempting to execute functions with this modifier must be the protocol admin. */ modifier onlyProtocolAdmin() { - _checkIfProtocolAdmin(); + _onlyProtocolAdmin(); _; } /** * @dev Modifier that restricts function access to platform administrators of a specific platform. * Users attempting to execute functions with this modifier must be the platform admin for the given platform. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - modifier onlyPlatformAdmin(bytes32 platformBytes) { - _checkIfPlatformAdmin(platformBytes); + modifier onlyPlatformAdmin(bytes32 platformHash) { + _onlyPlatformAdmin(platformHash); _; } @@ -49,7 +51,7 @@ abstract contract CampaignAccessChecker { * Users attempting to execute functions with this modifier must be the owner of the campaign. */ modifier onlyCampaignOwner() { - _checkIfCampaignOwner(); + _onlyCampaignOwner(); _; } @@ -57,7 +59,7 @@ abstract contract CampaignAccessChecker { * @dev Internal function to check if the sender is the protocol administrator. * If the sender is not the protocol admin, it reverts with AccessCheckerUnauthorized error. */ - function _checkIfProtocolAdmin() private view { + function _onlyProtocolAdmin() private view { if (msg.sender != INFO.getProtocolAdminAddress()) { revert AccessCheckerUnauthorized(); } @@ -66,10 +68,10 @@ abstract contract CampaignAccessChecker { /** * @dev Internal function to check if the sender is the platform administrator for a specific platform. * If the sender is not the platform admin, it reverts with AccessCheckerUnauthorized error. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - function _checkIfPlatformAdmin(bytes32 platformBytes) private view { - if (msg.sender != INFO.getPlatformAdminAddress(platformBytes)) { + function _onlyPlatformAdmin(bytes32 platformHash) private view { + if (msg.sender != INFO.getPlatformAdminAddress(platformHash)) { revert AccessCheckerUnauthorized(); } } @@ -78,7 +80,7 @@ abstract contract CampaignAccessChecker { * @dev Internal function to check if the sender is the owner of the campaign. * If the sender is not the owner, it reverts with AccessCheckerUnauthorized error. */ - function _checkIfCampaignOwner() private view { + function _onlyCampaignOwner() private view { if (INFO.owner() != msg.sender) { revert AccessCheckerUnauthorized(); } From 375206a195238de01e76b806c2cc5bd412f2918c Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:27:54 +0800 Subject: [PATCH 21/61] Update Pragma version --- src/utils/FiatEnabled.sol | 10 ++++------ src/utils/ItemRegistry.sol | 2 +- src/utils/TimestampChecker.sol | 23 +++++++++++++++-------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/utils/FiatEnabled.sol b/src/utils/FiatEnabled.sol index 1f4099ac..208ca91a 100644 --- a/src/utils/FiatEnabled.sol +++ b/src/utils/FiatEnabled.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title FiatEnabled @@ -59,11 +59,9 @@ abstract contract FiatEnabled { * @param fiatTransactionId The unique identifier of the fiat transaction. * @return amount The amount of the specified fiat transaction. */ - function getFiatTransactionAmount(bytes32 fiatTransactionId) - external - view - returns (uint256 amount) - { + function getFiatTransactionAmount( + bytes32 fiatTransactionId + ) external view returns (uint256 amount) { amount = s_fiatAmountById[fiatTransactionId]; if (amount == 0) { revert FiatEnabledInvalidTransaction(); diff --git a/src/utils/ItemRegistry.sol b/src/utils/ItemRegistry.sol index ac801af9..93f71109 100644 --- a/src/utils/ItemRegistry.sol +++ b/src/utils/ItemRegistry.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/utils/Context.sol"; import "../interfaces/IItem.sol"; diff --git a/src/utils/TimestampChecker.sol b/src/utils/TimestampChecker.sol index 7d754e0c..30117d31 100644 --- a/src/utils/TimestampChecker.sol +++ b/src/utils/TimestampChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title TimestampChecker @@ -59,10 +59,12 @@ abstract contract TimestampChecker { * @dev Internal function to check if the current timestamp is less than or equal a specified time. * @param inputTime The timestamp being checked against. */ - function _checkIfCurrentTimeIsLess(uint256 inputTime) internal view virtual { + function _checkIfCurrentTimeIsLess( + uint256 inputTime + ) internal view virtual { uint256 currentTime = block.timestamp; - if (currentTime <= inputTime) { - revert CurrentTimeIsLess(inputTime, currentTime); + if (currentTime > inputTime) { + revert CurrentTimeIsGreater(inputTime, currentTime); } } @@ -70,10 +72,12 @@ abstract contract TimestampChecker { * @dev Internal function to check if the current timestamp is greater than or equal a specified time. * @param inputTime The timestamp being checked against. */ - function _checkIfCurrentTimeIsGreater(uint256 inputTime) internal view virtual { + function _checkIfCurrentTimeIsGreater( + uint256 inputTime + ) internal view virtual { uint256 currentTime = block.timestamp; - if (currentTime >= inputTime) { - revert CurrentTimeIsGreater(inputTime, currentTime); + if (currentTime < inputTime) { + revert CurrentTimeIsLess(inputTime, currentTime); } } @@ -82,7 +86,10 @@ abstract contract TimestampChecker { * @param initialTime The initial timestamp of the range. * @param finalTime The final timestamp of the range. */ - function _checkIfCurrentTimeIsWithinRange(uint256 initialTime, uint256 finalTime) internal view virtual { + function _checkIfCurrentTimeIsWithinRange( + uint256 initialTime, + uint256 finalTime + ) internal view virtual { uint256 currentTime = block.timestamp; if (currentTime < initialTime || currentTime > finalTime) { revert CurrentTimeIsNotWithinRange(initialTime, finalTime); From d5fec5912f95745464163d6fa3743d2370c03533 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:28:39 +0800 Subject: [PATCH 22/61] Configure ERC1167 proxy deployment for CampaignInfo --- src/CampaignInfoFactory.sol | 75 ++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/src/CampaignInfoFactory.sol b/src/CampaignInfoFactory.sol index 8eabbca9..fda6146d 100644 --- a/src/CampaignInfoFactory.sol +++ b/src/CampaignInfoFactory.sol @@ -1,7 +1,9 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; +import "@openzeppelin/contracts/proxy/Clones.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; + import "./CampaignInfo.sol"; import "./interfaces/IGlobalParams.sol"; import "./interfaces/ICampaignInfoFactory.sol"; @@ -11,11 +13,12 @@ import "./interfaces/ICampaignInfoFactory.sol"; * @notice Factory contract for creating campaign information contracts. */ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { - bytes private constant bytecode = type(CampaignInfo).creationCode; - IGlobalParams private GLOBAL_PARAMS; address private s_treasuryFactoryAddress; bool private s_initialized; + address private s_implementation; + mapping(address => bool) public isValidCampaignInfo; + mapping(bytes32 => address) public identifierToCampaignInfo; /** * @dev Emitted when the factory is initialized. @@ -31,12 +34,18 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { * @dev Emitted when campaign creation fails. */ error CampaignInfoFactoryCampaignCreationFailed(); + error CampaignInfoFactoryPlatformNotListed(bytes32 platformHash); + error CampaignInfoFactoryCampaignWithSameIdentifierExists( + bytes32 identifierHash, + address cloneExists + ); /** * @param globalParams The address of the global parameters contract. */ - constructor(IGlobalParams globalParams) { + constructor(IGlobalParams globalParams, address campaignImplementation) Ownable(msg.sender) { GLOBAL_PARAMS = globalParams; + s_implementation = campaignImplementation; } /** @@ -56,13 +65,10 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { s_initialized = true; } - /** - * @inheritdoc ICampaignInfoFactory - */ function createCampaign( address creator, bytes32 identifierHash, - bytes32[] calldata selectedPlatformBytes, + bytes32[] calldata selectedPlatformHash, bytes32[] calldata platformDataKey, bytes32[] calldata platformDataValue, CampaignData calldata campaignData @@ -70,23 +76,42 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { if (platformDataKey.length != platformDataValue.length) { revert CampaignInfoFactoryInvalidInput(); } - address info = address( - new CampaignInfo{salt: identifierHash}( - GLOBAL_PARAMS, - s_treasuryFactoryAddress, - GLOBAL_PARAMS.getTokenAddress(), - creator, - GLOBAL_PARAMS.getProtocolFeePercent(), + address cloneExists = identifierToCampaignInfo[identifierHash]; + if (cloneExists != address(0)) { + revert CampaignInfoFactoryCampaignWithSameIdentifierExists( identifierHash, - selectedPlatformBytes, - platformDataKey, - platformDataValue, - campaignData - ) - ); - if (info == address(0)) { - revert CampaignInfoFactoryCampaignCreationFailed(); + cloneExists + ); + } + bool isListed; + bytes32 platformHash; + for (uint256 i = 0; i < selectedPlatformHash.length; i++) { + platformHash = selectedPlatformHash[i]; + isListed = GLOBAL_PARAMS.checkIfPlatformIsListed(platformHash); + if (!isListed) { + revert CampaignInfoFactoryPlatformNotListed(platformHash); + } } - emit CampaignInfoFactoryCampaignCreated(identifierHash, info); + + bytes memory args = abi.encode( + s_treasuryFactoryAddress, + GLOBAL_PARAMS.getTokenAddress(), + GLOBAL_PARAMS.getProtocolFeePercent(), + identifierHash, + campaignData.launchTime, + campaignData.deadline, + campaignData.goalAmount + ); + address clone = Clones.cloneWithImmutableArgs(s_implementation, args); + emit CampaignInfoFactoryCampaignCreated(identifierHash, clone); + CampaignInfo(clone).initialize( + creator, + GLOBAL_PARAMS, + selectedPlatformHash, + platformDataKey, + platformDataValue + ); + identifierToCampaignInfo[identifierHash] = clone; + isValidCampaignInfo[clone] = true; } -} \ No newline at end of file +} From 796fb2134216eaa8af47d844282ba3f61de4edd2 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:29:31 +0800 Subject: [PATCH 23/61] Remove unnecessary treasury models --- src/treasuries/KeepWhatsRaised.sol | 28 ---- src/treasuries/MinimumOrder.sol | 250 ----------------------------- src/treasuries/OutOfStock.sol | 51 ------ 3 files changed, 329 deletions(-) delete mode 100644 src/treasuries/KeepWhatsRaised.sol delete mode 100644 src/treasuries/MinimumOrder.sol delete mode 100644 src/treasuries/OutOfStock.sol diff --git a/src/treasuries/KeepWhatsRaised.sol b/src/treasuries/KeepWhatsRaised.sol deleted file mode 100644 index 429d904d..00000000 --- a/src/treasuries/KeepWhatsRaised.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -import "./AllOrNothing.sol"; - -/** - * @title KeepWhatsRaised - * @notice A contract that keeps all the funds raised, regardless of the success condition. - * @dev This contract inherits from the `AllOrNothing` contract and overrides the `_checkSuccessCondition` function to always return true. - */ -contract KeepWhatsRaised is AllOrNothing { - /** - * @dev Initializes the KeepWhatsRaised contract. - * @param platformBytes The unique identifier of the platform. - * @param infoAddress The address of the associated campaign information contract. - */ - constructor( - bytes32 platformBytes, - address infoAddress - ) AllOrNothing(platformBytes, infoAddress) {} - - /** - * @inheritdoc BaseTreasury - */ - function _checkSuccessCondition() internal pure override returns (bool) { - return true; - } -} diff --git a/src/treasuries/MinimumOrder.sol b/src/treasuries/MinimumOrder.sol deleted file mode 100644 index 0353870a..00000000 --- a/src/treasuries/MinimumOrder.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; -import "@openzeppelin/contracts/utils/Counters.sol"; -import "../interfaces/ICampaignInfo.sol"; -import "../utils/BaseTreasury.sol"; -import "../utils/TimestampChecker.sol"; - -/** - * @title MinimumOrder - * @notice A Solidity contract for managing minimum order-based campaigns. - * Users can pre-order items or rewards, and when a predefined success metric is reached, - * the campaign succeeds, and backers receive their rewards. - */ -contract MinimumOrder is BaseTreasury, ERC721Burnable, TimestampChecker { - using Counters for Counters.Counter; - - // Struct to define a reward - struct Reward { - uint256 rewardValue; - bytes32[] itemId; - uint256[] itemValue; - uint256[] itemQuantity; - } - - // Immutable variable to store the success metric - uint256 internal immutable SUCCESS_METRIC; - - uint256 private s_preOrderValueAmount; - uint256 private s_platformFeePercent; - - // Mapping to store pledged amounts for tokens - mapping(uint256 => uint256) private s_tokenToPledgedAmount; - - // Mapping to store rewards - mapping(bytes32 => Reward) private s_reward; - - Counters.Counter private s_tokenIdCounter; - Counters.Counter internal s_numberOfPreOrders; - - /** - * @dev Event emitted when a backer makes a pledge. - * @param backer The address of the backer. - * @param reward The name of the reward. - * @param pledgeAmount The amount pledged by the backer. - * @param tokenId The unique token ID associated with the pledge. - */ - event Receipt( - address indexed backer, - bytes32 indexed reward, - uint256 pledgeAmount, - uint256 tokenId - ); - - /** - * @dev Event emitted when a reward is added to the campaign. - * @param rewardName The name of the reward. - * @param reward The reward details including value, item IDs, values, and quantities. - */ - event RewardAdded(bytes32 indexed rewardName, Reward reward); - - /** - * @dev Event emitted when a reward is removed from the campaign. - * @param rewardName The name of the reward. - */ - event RewardRemoved(bytes32 indexed rewardName); - - /** - * @dev Event emitted when a refund is claimed by a backer. - * @param tokenId The unique token ID associated with the refund. - * @param refundAmount The amount refunded to the backer. - * @param claimer The address of the backer who claimed the refund. - */ - event RefundClaimed(uint256 tokenId, uint256 refundAmount, address claimer); - - /** - * @dev Throws an error indicating that the pre-order transfer failed. - */ - error PreOrderTransferFailed(); - - /** - * @dev Throws an error indicating that the pre-order input is invalid. - */ - error PreOrderInvalidInput(); - - /** - * @dev Constructor for the MinimumOrder contract. - * @param platformBytes The unique identifier of the platform. - * @param infoAddress The address of the CampaignInfo contract providing campaign details. - */ - constructor( - bytes32 platformBytes, - address infoAddress - ) - ERC721("", "") // Initialize the ERC721 token with empty name and symbol - BaseTreasury(platformBytes, infoAddress) - { - // Initialize the SUCCESS_METRIC from global platform data - SUCCESS_METRIC = uint256( - INFO.getPlatformData( - /// bytes32 of `PreOrder0MinimumOrder(uint256)` - 0x5072654f72646572304d696e696d756d4f726465722875696e74323536290000 - ) - ); - } - - /** - * @notice Function to get the number of pre-orders made. - * @return The number of pre-orders. - */ - function getNumberOfOrders() internal view returns (uint256) { - return s_numberOfPreOrders.current(); - } - - /** - * @notice Function to get reward details by name. - * @param rewardName The name of the reward. - * @return The reward details, including value, item IDs, values, and quantities. - */ - function getReward( - bytes32 rewardName - ) external view returns (Reward memory) { - if (s_reward[rewardName].rewardValue == 0) { - revert PreOrderInvalidInput(); - } - return s_reward[rewardName]; - } - - /** - * @notice Function to get the total raised amount during the campaign. - * @return The total raised amount. - */ - function getRaisedAmount() external view returns (uint256) { - return s_preOrderValueAmount; - } - - /** - * @notice Function to add a new reward to the campaign. - * Only the campaign owner can add rewards. - * @param rewardName The name of the reward. - * @param reward The reward details, including value, item IDs, values, and quantities. - */ - function addReward( - bytes32 rewardName, - Reward calldata reward - ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { - Reward storage tempReward = s_reward[rewardName]; - if ( - tempReward.rewardValue != 0 && - tempReward.itemId.length > 0 && - tempReward.itemId.length == tempReward.itemValue.length && - tempReward.itemId.length == tempReward.itemQuantity.length - ) { - s_reward[rewardName] = reward; - emit RewardAdded(rewardName, tempReward); - } else { - revert PreOrderInvalidInput(); - } - } - - /** - * @notice Function to remove a reward from the campaign. - * Only the campaign owner can remove rewards. - * @param rewardName The name of the reward to be removed. - */ - function removeReward( - bytes32 rewardName - ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { - uint256 tempRewardValue = s_reward[rewardName].rewardValue; - if (tempRewardValue == 0) { - revert PreOrderInvalidInput(); - } - delete s_reward[rewardName]; - emit RewardRemoved(rewardName); - } - - /** - * @notice Function for backers to pre-order a reward. - * The pre-order can only be made within the specified campaign timeframe. - * @param backer The address of the backer making the pre-order. - * @param rewardName The name of the reward to pre-order. - */ - function preOrderForAReward( - address backer, - bytes32 rewardName - ) - public - virtual - currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) - whenCampaignNotPaused - whenNotPaused - { - uint256 tokenId = s_tokenIdCounter.current(); - uint256 rewardValue = s_reward[rewardName].rewardValue; - bool success = TOKEN.transferFrom(backer, address(this), rewardValue); - if (!success) { - revert PreOrderTransferFailed(); - } - s_tokenIdCounter.increment(); - _safeMint(backer, tokenId, abi.encodePacked(backer, " ", rewardName)); - s_preOrderValueAmount += rewardValue; - s_tokenToPledgedAmount[tokenId] = rewardValue; - s_numberOfPreOrders.increment(); - emit Receipt(backer, rewardName, rewardValue, tokenId); - } - - /** - * @notice Function for backers to claim a refund if the campaign has not met the success metric. - * @param tokenId The unique token ID associated with the refund. - */ - function claimRefund( - uint256 tokenId - ) external whenCampaignNotPaused whenNotPaused { - uint256 amount = s_tokenToPledgedAmount[tokenId]; - s_tokenToPledgedAmount[tokenId] = 0; - burn(tokenId); - bool success = TOKEN.transfer(msg.sender, amount); - emit RefundClaimed(tokenId, amount, msg.sender); - if (!success) { - revert PreOrderTransferFailed(); - } - } - - /** - * @inheritdoc BaseTreasury - */ - function _checkSuccessCondition() - internal - view - virtual - override - returns (bool) - { - return (s_numberOfPreOrders.current() >= SUCCESS_METRIC); - } - - /** - * @notice Function to check if an address is supported by the ERC721 contract. - * @param interfaceId The ERC721 interface ID to check. - * @return True if the interface is supported, false otherwise. - */ - function supportsInterface( - bytes4 interfaceId - ) public view override returns (bool) { - return super.supportsInterface(interfaceId); - } -} diff --git a/src/treasuries/OutOfStock.sol b/src/treasuries/OutOfStock.sol deleted file mode 100644 index 190a2d7a..00000000 --- a/src/treasuries/OutOfStock.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -import "./MinimumOrder.sol"; - -/** - * @title OutOfStock - * @notice A Solidity contract for managing minimum order-based campaigns with an out-of-stock limit. - * Users can pre-order items or rewards until the out-of-stock limit is reached. - * When the predefined success metric is reached or the out-of-stock limit is reached, the campaign ends. - */ -contract OutOfStock is MinimumOrder { - - /** - * @dev Throws an error indicating the out-of-stock limit has been reached. - */ - error OutOfStockLimitReached(); - - /** - * @dev Constructor for the OutOfStock contract. - * @param platformBytes The unique identifier of the platform. - * @param infoAddress The address of the CampaignInfo contract providing campaign details. - */ - constructor( - bytes32 platformBytes, - address infoAddress - ) MinimumOrder(platformBytes, infoAddress) {} - - /** - * @notice Function for backers to pre-order a reward, checking against the out-of-stock limit. - * The pre-order can only be made within the specified campaign timeframe. - * @param backer The address of the backer making the pre-order. - * @param rewardName The name of the reward to pre-order. - */ - function preOrderForAReward( - address backer, - bytes32 rewardName - ) - public - override - currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) - whenCampaignNotPaused - whenNotPaused - { - // Check if the out-of-stock limit will be reached with the new pre-order - if (MinimumOrder.getNumberOfOrders() + 1 > SUCCESS_METRIC) { - revert OutOfStockLimitReached(); - } - MinimumOrder.preOrderForAReward(backer, rewardName); - } -} From 45e8427edaab698329ed93848186627d41e65cd4 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:30:33 +0800 Subject: [PATCH 24/61] Update function names --- src/utils/AddressCalculator.sol | 2 +- src/utils/AdminAccessChecker.sol | 30 ++++++++++++------------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/utils/AddressCalculator.sol b/src/utils/AddressCalculator.sol index 47dc7446..4f02e5da 100644 --- a/src/utils/AddressCalculator.sol +++ b/src/utils/AddressCalculator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; /** * @title AddressCalculator diff --git a/src/utils/AdminAccessChecker.sol b/src/utils/AdminAccessChecker.sol index 767ba137..c798e730 100644 --- a/src/utils/AdminAccessChecker.sol +++ b/src/utils/AdminAccessChecker.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "../interfaces/IGlobalParams.sol"; @@ -10,18 +10,14 @@ import "../interfaces/IGlobalParams.sol"; */ abstract contract AdminAccessChecker { // Immutable reference to the IGlobalParams contract, which manages global parameters and admin addresses. - IGlobalParams internal immutable GLOBAL_PARAMS; + IGlobalParams internal GLOBAL_PARAMS; /** * @dev Throws when the caller is not authorized. - */ + */ error AdminAccessCheckerUnauthorized(); - /** - * @dev Constructor to initialize the contract with the address of the global parameters contract. - * @param globalParams The address of the IGlobalParams contract. - */ - constructor(IGlobalParams globalParams) { + function __AccessChecker_init(IGlobalParams globalParams) internal { GLOBAL_PARAMS = globalParams; } @@ -30,17 +26,17 @@ abstract contract AdminAccessChecker { * Users attempting to execute functions with this modifier must be the protocol admin. */ modifier onlyProtocolAdmin() { - _checkIfProtocolAdmin(); + _onlyProtocolAdmin(); _; } /** * @dev Modifier that restricts function access to platform administrators of a specific platform. * Users attempting to execute functions with this modifier must be the platform admin for the given platform. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - modifier onlyPlatformAdmin(bytes32 platformBytes) { - _checkIfPlatformAdmin(platformBytes); + modifier onlyPlatformAdmin(bytes32 platformHash) { + _onlyPlatformAdmin(platformHash); _; } @@ -48,7 +44,7 @@ abstract contract AdminAccessChecker { * @dev Internal function to check if the sender is the protocol administrator. * If the sender is not the protocol admin, it reverts with AdminAccessCheckerUnauthorized error. */ - function _checkIfProtocolAdmin() private view { + function _onlyProtocolAdmin() private view { if (msg.sender != GLOBAL_PARAMS.getProtocolAdminAddress()) { revert AdminAccessCheckerUnauthorized(); } @@ -57,12 +53,10 @@ abstract contract AdminAccessChecker { /** * @dev Internal function to check if the sender is the platform administrator for a specific platform. * If the sender is not the platform admin, it reverts with AdminAccessCheckerUnauthorized error. - * @param platformBytes The unique identifier of the platform. + * @param platformHash The unique identifier of the platform. */ - function _checkIfPlatformAdmin(bytes32 platformBytes) private view { - if ( - msg.sender != GLOBAL_PARAMS.getPlatformAdminAddress(platformBytes) - ) { + function _onlyPlatformAdmin(bytes32 platformHash) private view { + if (msg.sender != GLOBAL_PARAMS.getPlatformAdminAddress(platformHash)) { revert AdminAccessCheckerUnauthorized(); } } From 06d120b6c0a0b288bf30bc77f40bf820a4ff1a1a Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:31:21 +0800 Subject: [PATCH 25/61] Remove dependency tests --- test/deps/Context.t.sol | 48 ---------- test/deps/Counters.t.sol | 42 -------- test/deps/ERC20.t.sol | 132 ------------------------- test/deps/ERC721.t.sol | 154 ------------------------------ test/deps/ERC721Burnable.t.sol | 71 -------------- test/deps/Ownable.t.sol | 78 --------------- test/deps/Pausable.t.sol | 63 ------------ test/deps/draft-ERC20Permit.t.sol | 66 ------------- 8 files changed, 654 deletions(-) delete mode 100644 test/deps/Context.t.sol delete mode 100644 test/deps/Counters.t.sol delete mode 100644 test/deps/ERC20.t.sol delete mode 100644 test/deps/ERC721.t.sol delete mode 100644 test/deps/ERC721Burnable.t.sol delete mode 100644 test/deps/Ownable.t.sol delete mode 100644 test/deps/Pausable.t.sol delete mode 100644 test/deps/draft-ERC20Permit.t.sol diff --git a/test/deps/Context.t.sol b/test/deps/Context.t.sol deleted file mode 100644 index 5832c267..00000000 --- a/test/deps/Context.t.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {Context} from "@openzeppelin/contracts/utils/Context.sol"; - -contract MockContext is Context { - function msgSender() external view returns (address) { - return _msgSender(); - } - - event Data(bytes data, uint256 integerValue, string stringValue); - - function msgData(uint256 integerValue, string memory stringValue) external { - emit Data(_msgData(), integerValue, stringValue); - } -} - -contract ContextTest is Test { - MockContext context; - - function setUp() external { - context = new MockContext(); - } - - function test_MsgSender() external { - // returns the transaction sender when called from an EOA - address addressOfEOA = address(0x12); - vm.prank(addressOfEOA); - assertEq(context.msgSender(), addressOfEOA); - - // returns the transaction sender when called from test contract - assertEq(context.msgSender(), address(this)); - } - - event Data(bytes data, uint256 integerValue, string stringValue); - - function test_MsgData() external { - uint256 integerValue = 1234; - string memory stringValue = "Context Test"; - bytes memory callData; - callData = abi.encode(integerValue, stringValue); - // vm.expectEmit(true, true, true, false, address(this)); - vm.expectEmit(false, true, true, false); - emit Data(callData, integerValue, stringValue); - context.msgData(integerValue, stringValue); - } -} diff --git a/test/deps/Counters.t.sol b/test/deps/Counters.t.sol deleted file mode 100644 index 7ce59d97..00000000 --- a/test/deps/Counters.t.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {Counters} from "@openzeppelin/contracts/utils/Counters.sol"; - -contract CountersTest is Test { - using Counters for Counters.Counter; - Counters.Counter _counter; - - function test_Current() external { - assertEq(_counter.current(), 0); - } - - function test_Increment() external { - _counter.increment(); - assertEq(_counter.current(), 1); - _counter.increment(); - assertEq(_counter.current(), 2); - } - - function test_Decrement() external { - assertEq(_counter.current(), 0); - vm.expectRevert("Counter: decrement overflow"); - _counter.decrement(); - - _counter.increment(); - assertEq(_counter.current(), 1); - _counter.decrement(); - assertEq(_counter.current(), 0); - } - - function test_Reset() external { - _counter.increment(); - _counter.increment(); - _counter.increment(); - assertEq(_counter.current(), 3); - - _counter.reset(); - assertEq(_counter.current(), 0); - } -} diff --git a/test/deps/ERC20.t.sol b/test/deps/ERC20.t.sol deleted file mode 100644 index e175bfdf..00000000 --- a/test/deps/ERC20.t.sol +++ /dev/null @@ -1,132 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; - -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract MockERC20 is ERC20 { - string private constant _NAME = "TestToken"; - string private constant _SYMBOL = "TT"; - uint256 private constant _INITIAL_SUPPLY = type(uint8).max; - - constructor() ERC20(_NAME, _SYMBOL) {} - - function mint(address account, uint256 amount) external { - _mint(account, amount); - } - - function burn(address account, uint256 amount) external { - _burn(account, amount); - } -} - -contract ERC20Test is Test { - string private constant _NAME = "TestToken"; - string private constant _SYMBOL = "TT"; - uint256 private constant _INITIAL_SUPPLY = type(uint8).max; - address deployer = address(0x12); - address zeroAddress = address(0x0); - - MockERC20 erc20Contract; - - function setUp() external { - vm.prank(deployer); - erc20Contract = new MockERC20(); - erc20Contract.mint(deployer, _INITIAL_SUPPLY); - } - - function test_InitialSetUp() external { - assertEq(erc20Contract.name(), _NAME); - assertEq(erc20Contract.symbol(), _SYMBOL); - assertEq(erc20Contract.decimals(), 18); - assertEq(erc20Contract.totalSupply(), _INITIAL_SUPPLY); - assertEq(erc20Contract.balanceOf(deployer), _INITIAL_SUPPLY); - } - - event Transfer(address indexed from, address indexed to, uint256 value); - - function test_Transfer() external { - address owner = deployer; - address to = makeAddr("to"); - uint256 amount = erc20Contract.balanceOf(owner); - vm.startPrank(owner); - vm.expectEmit(true, true, false, true); - emit Transfer(owner, to, amount); - bool returnValue = erc20Contract.transfer(to, amount); - assertTrue(returnValue); - assertEq(erc20Contract.balanceOf(owner), 0); - assertEq(erc20Contract.balanceOf(to), amount); - vm.stopPrank(); - } - - event Approval( - address indexed owner, - address indexed spender, - uint256 value - ); - - function test_Approve() external { - address owner = deployer; - address spender = makeAddr("spender"); - uint256 amount = erc20Contract.balanceOf(owner); - vm.startPrank(owner); - vm.expectEmit(true, true, false, true); - emit Approval(owner, spender, amount); - bool returnValue = erc20Contract.approve(spender, amount); - assertTrue(returnValue); - assertEq(erc20Contract.allowance(owner, spender), amount); - vm.stopPrank(); - } - - function test_TransferFrom() external { - address owner = deployer; - address spender = makeAddr("spender"); - address to = makeAddr("to"); - uint256 amount = erc20Contract.balanceOf(owner); - vm.prank(owner); - erc20Contract.approve(spender, amount); - vm.startPrank(spender); - vm.expectEmit(true, true, false, true); - emit Approval( - owner, - spender, - erc20Contract.allowance(owner, spender) - amount - ); - vm.expectEmit(true, true, false, true); - emit Transfer(owner, to, amount); - bool returnValue = erc20Contract.transferFrom(owner, to, amount); - assertTrue(returnValue); - assertEq(erc20Contract.balanceOf(owner), 0); - assertEq(erc20Contract.balanceOf(to), amount); - assertEq(erc20Contract.allowance(owner, spender), 0); - vm.stopPrank(); - } - - function test_Burn() external { - address owner = deployer; - uint256 balance = erc20Contract.balanceOf(owner); - uint256 totalSupply = erc20Contract.totalSupply(); - uint256 amount = 0; - vm.startPrank(owner); - vm.expectEmit(true, true, false, true); - emit Transfer(owner, zeroAddress, amount); - erc20Contract.burn(owner, amount); - assertEq(erc20Contract.balanceOf(owner), balance - amount); - assertEq(erc20Contract.totalSupply(), totalSupply - amount); - vm.stopPrank(); - } - - function test_Mint() external { - address minter = deployer; - address owner = makeAddr("owner"); - uint256 amount = type(uint8).max; - vm.startPrank(minter); - vm.expectEmit(true, true, false, true); - emit Transfer(zeroAddress, owner, amount); - erc20Contract.mint(owner, amount); - assertEq(erc20Contract.balanceOf(owner), amount); - assertEq(erc20Contract.totalSupply(), (amount + _INITIAL_SUPPLY)); - vm.stopPrank(); - } -} diff --git a/test/deps/ERC721.t.sol b/test/deps/ERC721.t.sol deleted file mode 100644 index a11a8040..00000000 --- a/test/deps/ERC721.t.sol +++ /dev/null @@ -1,154 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; - -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; - -contract MockERC721 is ERC721 { - string private constant _NAME = "TestNFT"; - string private constant _SYMBOL = "TNFT"; - - constructor() ERC721(_NAME, _SYMBOL) {} - - function safeMint(address to, uint256 tokenId) external { - _safeMint(to, tokenId); - } - - function safeMintWithData( - address to, - uint256 tokenId, - bytes memory data - ) external { - _safeMint(to, tokenId, data); - } -} - -contract ERC721Test is Test { - string private constant _NAME = "TestNFT"; - string private constant _SYMBOL = "TNFT"; - MockERC721 erc721; - address deployer = makeAddr("deployer"); - address zeroAddress = address(0); - - uint256 nonce = 0; - - function PRNG() internal returns (uint256) { - nonce += 1; - return - uint( - keccak256( - abi.encodePacked( - nonce, - msg.sender, - blockhash(block.number - 1) - ) - ) - ); - } - - function setUp() external { - erc721 = new MockERC721(); - } - - function test_InitialSetUP() external { - assertEq(erc721.name(), _NAME); - assertEq(erc721.symbol(), _SYMBOL); - } - - function test_SupportsInterfaceSuccess() external { - assertTrue(erc721.supportsInterface(type(IERC721).interfaceId)); - assertTrue(erc721.supportsInterface(type(IERC721Metadata).interfaceId)); - } - - function test_BalanceOf() external { - address owner = makeAddr("owner"); - uint256 tokenId1 = PRNG(); - uint256 tokenId2 = PRNG(); - vm.startPrank(deployer); - erc721.safeMint(owner, tokenId1); - erc721.safeMint(owner, tokenId2); - assertEq(erc721.balanceOf(owner), 2); - vm.stopPrank(); - } - - function test_OwnerOf() external { - uint256 tokenId1 = PRNG(); - vm.expectRevert("ERC721: invalid token ID"); - erc721.ownerOf(tokenId1); - - vm.prank(deployer); - uint256 tokenId2 = PRNG(); - address owner = makeAddr("owner"); - erc721.safeMint(owner, tokenId2); - assertEq(erc721.ownerOf(tokenId2), owner); - } - - function test_SafeMint() external { - address owner = makeAddr("Owner"); - uint256 tokenId = PRNG(); - vm.prank(deployer); - erc721.safeMintWithData( - owner, - tokenId, - abi.encodePacked(owner, "ERC721Test") - ); - assertEq(erc721.ownerOf(tokenId), owner); - } - - event Approval( - address indexed owner, - address indexed approved, - uint256 indexed tokenId - ); - - function test_Approve() external { - address owner = makeAddr("owner"); - address spender = makeAddr("spender"); - uint256 tokenId = PRNG(); - vm.startPrank(deployer); - erc721.safeMint(owner, tokenId); - vm.stopPrank(); - - vm.startPrank(owner); - vm.expectEmit(true, true, true, false); - emit Approval(owner, spender, tokenId); - erc721.approve(spender, tokenId); - assertEq(erc721.getApproved(tokenId), spender); - vm.stopPrank(); - } - - function test_TransferFrom() external { - address owner = makeAddr("owner"); - address approved = makeAddr("approved"); - address operator = makeAddr("operator"); - uint256 tokenId1 = PRNG(); - uint256 tokenId2 = PRNG(); - vm.startPrank(deployer); - erc721.safeMint(owner, tokenId1); - erc721.safeMint(owner, tokenId2); - vm.stopPrank(); - - vm.startPrank(owner); - erc721.approve(approved, tokenId1); - erc721.setApprovalForAll(operator, true); - vm.stopPrank(); - - address receiver = makeAddr("receiver"); - vm.startPrank(approved); - erc721.transferFrom(owner, receiver, tokenId1); - assertEq(erc721.ownerOf(tokenId1), receiver); - vm.stopPrank(); - - vm.startPrank(operator); - erc721.transferFrom(owner, receiver, tokenId2); - assertEq(erc721.ownerOf(tokenId2), receiver); - vm.stopPrank(); - - vm.expectRevert("ERC721: caller is not token owner nor approved"); - erc721.transferFrom(receiver, address(0x1), tokenId1); - } -} diff --git a/test/deps/ERC721Burnable.t.sol b/test/deps/ERC721Burnable.t.sol deleted file mode 100644 index f03007a7..00000000 --- a/test/deps/ERC721Burnable.t.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; - -import {ERC721Burnable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - -contract MockERC721Burnable is ERC721Burnable { - string private constant _NAME = "TestNFT"; - string private constant _SYMBOL = "TNFT"; - - constructor() ERC721(_NAME, _SYMBOL) {} - - function safeMint(address to, uint256 tokenId) external { - _safeMint(to, tokenId); - } -} - -contract ERC721BurnableTest is Test { - address zeroAddress = address(0); - uint256 nonce = 0; - address deployer = makeAddr("deployer"); - MockERC721Burnable erc721Burnable; - - function PRNG() internal returns (uint256) { - nonce += 1; - return - uint( - keccak256( - abi.encodePacked( - nonce, - msg.sender, - blockhash(block.number - 1) - ) - ) - ); - } - - function setUp() external { - erc721Burnable = new MockERC721Burnable(); - } - - event Transfer( - address indexed from, - address indexed to, - uint256 indexed tokenId - ); - - function test_Burn() external { - address owner = makeAddr("owner"); - uint256 tokenId1 = PRNG(); - vm.startPrank(deployer); - erc721Burnable.safeMint(owner, tokenId1); - vm.stopPrank(); - - vm.startPrank(owner); - vm.expectEmit(true, true, true, false); - emit Transfer(owner, zeroAddress, tokenId1); - erc721Burnable.burn(tokenId1); - - vm.expectRevert(bytes("ERC721: invalid token ID")); - erc721Burnable.burn(tokenId1); - vm.stopPrank(); - - uint256 tokenId2 = PRNG(); - vm.expectRevert(bytes("ERC721: invalid token ID")); - erc721Burnable.ownerOf(tokenId2); - assertEq(erc721Burnable.balanceOf(owner), 0); - } -} diff --git a/test/deps/Ownable.t.sol b/test/deps/Ownable.t.sol deleted file mode 100644 index 64449c37..00000000 --- a/test/deps/Ownable.t.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; - -contract MockOwnable is Ownable { - function checkOwner() external view { - _checkOwner(); - } - - function transferOwnershipExternal(address newOwner) external { - _transferOwnership(newOwner); - } -} - -contract OwnableTest is Test { - MockOwnable ownable; - - function setUp() external { - ownable = new MockOwnable(); - } - - function test_Owner() external { - assertEq(ownable.owner(), address(this)); - } - - function test_CheckOwner() external { - ownable.checkOwner(); - vm.prank(address(0x1)); - vm.expectRevert("Ownable: caller is not the owner"); - ownable.checkOwner(); - } - - event OwnershipTransferred( - address indexed previousOwner, - address indexed newOwner - ); - - function test_EventOwnershipTransferred() external { - assertEq(address(this), ownable.owner()); - - vm.expectEmit(true, true, false, false, address(ownable)); - emit OwnershipTransferred(address(this), address(0x2)); - ownable.transferOwnership(address(0x2)); - - assertEq(address(0x2), ownable.owner()); - - vm.expectEmit(true, true, false, false, address(ownable)); - emit OwnershipTransferred(address(0x2), address(0x3)); - ownable.transferOwnershipExternal(address(0x3)); - } - - // Test public transferOwnership() function - function test_TransferOwnership() external { - assertEq(address(this), ownable.owner()); - - vm.expectRevert("Ownable: new owner is the zero address"); - ownable.transferOwnership(address(0)); - - ownable.transferOwnership(address(0x2)); - assertEq(address(0x2), ownable.owner()); - } - - // Test internal transferOwnership() function - function test_TransferOwnershipExternal() external { - assertEq(address(this), ownable.owner()); - ownable.transferOwnershipExternal(address(0x2)); - assertEq(address(0x2), ownable.owner()); - } - - function test_RenounceOwnership() external { - assertEq(address(this), ownable.owner()); - ownable.renounceOwnership(); - assertEq(ownable.owner(), address(0)); - } -} diff --git a/test/deps/Pausable.t.sol b/test/deps/Pausable.t.sol deleted file mode 100644 index 785bb53a..00000000 --- a/test/deps/Pausable.t.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; - -contract MockPausable is Pausable { - bool public drasticMeasureTaken; - uint256 public count; - - constructor() { - drasticMeasureTaken = false; - count = 0; - } - - function normalProcess() external whenNotPaused { - count++; - } - - function drasticMeasure() external whenPaused { - drasticMeasureTaken = true; - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } -} - -contract PausableTest is Test { - MockPausable pausable; - - function setUp() external { - pausable = new MockPausable(); - } - - event Paused(address account); - - function test_Pause() external { - address alice = address(1234); - vm.prank(alice); - vm.expectEmit(true, false, false, false); - emit Paused(alice); - pausable.pause(); - assertEq(pausable.paused(), true); - } - - event Unpaused(address account); - - function test_Unpause() external { - address alice = address(1234); - vm.prank(alice); - //The contract must be paused first to test unpause - pausable.pause(); - vm.expectEmit(true, false, false, false); - emit Unpaused(alice); - pausable.unpause(); - assertEq(pausable.paused(), false); - } -} diff --git a/test/deps/draft-ERC20Permit.t.sol b/test/deps/draft-ERC20Permit.t.sol deleted file mode 100644 index 465dfaf9..00000000 --- a/test/deps/draft-ERC20Permit.t.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; - -contract MockERC20Permit is ERC20Permit { - string private constant _NAME = "TestToken"; - string private constant _SYMBOL = "TT"; - uint256 private constant _INITIAL_SUPPLY = type(uint8).max; - - constructor() ERC20(_NAME, _SYMBOL) ERC20Permit(_NAME) {} -} - -contract ERC20PermitTest is Test { - MockERC20Permit erc20Permit; - bytes32 private constant _PERMIT_TYPE_HASH = - keccak256( - bytes( - "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" - ) - ); - event Approval( - address indexed owner, - address indexed spender, - uint256 value - ); - - function setUp() external { - erc20Permit = new MockERC20Permit(); - } - - function test_PermitSuccess() external { - (address owner, uint256 key) = makeAddrAndKey("owner"); - address spender = makeAddr("spender"); - uint256 amount = 100; - uint256 nonce = erc20Permit.nonces(owner); - uint256 deadline = block.timestamp + 100_000; - bytes32 domainSeparator = erc20Permit.DOMAIN_SEPARATOR(); - (uint8 v, bytes32 r, bytes32 s) = vm.sign( - key, - keccak256( - abi.encodePacked( - "\x19\x01", - domainSeparator, - keccak256( - abi.encode( - _PERMIT_TYPE_HASH, - owner, - spender, - amount, - nonce, - deadline - ) - ) - ) - ) - ); - vm.expectEmit(true, true, false, true); - emit Approval(owner, spender, amount); - erc20Permit.permit(owner, spender, amount, deadline, v, r, s); - assertEq(erc20Permit.allowance(owner, spender), amount); - assertEq(erc20Permit.nonces(owner), 1); - } -} From 16e2d85bae24daea4d5e86d0bc56578c2749d67a Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:32:04 +0800 Subject: [PATCH 26/61] Remove old scripts --- script/Setup.s.sol | 25 -- test/foundry/utils/BytesSplitter.sol | 26 -- test/hardhat/AllOrNothing.test.ts | 385 --------------------------- utils/helpers.ts | 51 ---- 4 files changed, 487 deletions(-) delete mode 100644 script/Setup.s.sol delete mode 100644 test/foundry/utils/BytesSplitter.sol delete mode 100644 test/hardhat/AllOrNothing.test.ts delete mode 100644 utils/helpers.ts diff --git a/script/Setup.s.sol b/script/Setup.s.sol deleted file mode 100644 index 48b7ab61..00000000 --- a/script/Setup.s.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console2} from "forge-std/Script.sol"; -import "../src/TestUSD.sol"; -import "../src/GlobalParams.sol"; -import "../src/CampaignInfoFactory.sol"; -import "../src/TreasuryFactory.sol"; - -contract SetupScript is Script { - function run() external { - uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); - address account = vm.addr(deployerPrivateKey); - - vm.startBroadcast(deployerPrivateKey); - - TestUSD testUSD = new TestUSD(); - GlobalParams globalParams = new GlobalParams(account, address(testUSD), 200); - CampaignInfoFactory campaignInfoFactory = new CampaignInfoFactory(globalParams); - bytes32 bytecodeHash = keccak256(type(CampaignInfo).creationCode); - TreasuryFactory treasuryFactory = new TreasuryFactory(globalParams, address(campaignInfoFactory), bytecodeHash); - - vm.stopBroadcast(); - } -} diff --git a/test/foundry/utils/BytesSplitter.sol b/test/foundry/utils/BytesSplitter.sol deleted file mode 100644 index f33f2032..00000000 --- a/test/foundry/utils/BytesSplitter.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; -import "forge-std/console.sol"; - -/// @notice Bytes Splitter Contract for spliting bytes. -contract BytesSplitter { - - /** - * @notice Splits Bytes into two chunks. - * @param data The bytecode. - */ - function splitBytesIntoTwo(bytes memory data) public pure returns (bytes memory chunk1, bytes memory chunk2) { - - uint midpoint = data.length / 2; - bytes memory data1 = new bytes(midpoint); - for (uint i = 0; i < midpoint; i++) { - data1[i] = data[i]; - } - bytes memory data2 = new bytes(data.length - midpoint); - for (uint i = 0; i < data.length - midpoint; i++) { - data2[i] = data[i + midpoint]; - } - - return (data1, data2); - } -} diff --git a/test/hardhat/AllOrNothing.test.ts b/test/hardhat/AllOrNothing.test.ts deleted file mode 100644 index 60715a13..00000000 --- a/test/hardhat/AllOrNothing.test.ts +++ /dev/null @@ -1,385 +0,0 @@ -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { expect } from "chai"; -import { ethers } from 'hardhat'; -import { ContractTransaction, ContractReceipt, utils } from 'ethers'; -import { AllOrNothing, AllOrNothing__factory, CampaignInfo, CampaignInfoFactory, CampaignInfoFactory__factory, CampaignInfo__factory, GlobalParams, GlobalParams__factory, TestUSD, TestUSD__factory, TreasuryFactory, TreasuryFactory__factory } from "../../typechain-types"; -import { convertBigNumber, convertBytesToString, convertStringToBytes, increaseBlockTime, splitByteCodeIntoChunks } from '../../utils/helpers' - -describe("Treasury `AllOrNothing` All Functionality", function () { - - // We define a fixture to reuse the same setup in every test. - // We use loadFixture to run this setup once, snapshot that state, - // and reset Hardhat Network to that snapshot in every test. - async function deployOnceFixture() { - let contractOwner: SignerWithAddress, protocolAdminAddr: SignerWithAddress, platform1AdminAddr: SignerWithAddress, creator1Addr: SignerWithAddress, backer1Addr: SignerWithAddress, otherAccounts: SignerWithAddress[]; - let testUsd: TestUSD, globalParams: GlobalParams, campaignInfoFactory: CampaignInfoFactory, treasuryFactory: TreasuryFactory, campaignInfo: CampaignInfo, allOrNothing: AllOrNothing; - - - [contractOwner, protocolAdminAddr, platform1AdminAddr, creator1Addr, backer1Addr, ...otherAccounts] = await ethers.getSigners(); - // Get contracts - const TESTUSD = (await ethers.getContractFactory("TestUSD", contractOwner)) as TestUSD__factory; - const GLOBALPARAMS = (await ethers.getContractFactory("GlobalParams", contractOwner)) as GlobalParams__factory; - const CAMPAIGNINFOFACTORY = (await ethers.getContractFactory("CampaignInfoFactory", contractOwner)) as CampaignInfoFactory__factory; - const TREASURYFACTORY = (await ethers.getContractFactory("TreasuryFactory", contractOwner)) as TreasuryFactory__factory; - const CAMPAIGNINFO = (await ethers.getContractFactory("CampaignInfo", contractOwner)) as CampaignInfo__factory; - const ALLORNOTHING = (await ethers.getContractFactory("AllOrNothing", contractOwner)) as AllOrNothing__factory; - - // Deploy contracts - testUsd = await TESTUSD.deploy(); - await testUsd.deployed(); - - globalParams = await GLOBALPARAMS.deploy(protocolAdminAddr.address, testUsd.address, 20 * 100); - await globalParams.deployed(); - - campaignInfoFactory = await CAMPAIGNINFOFACTORY.deploy(globalParams.address); - await campaignInfoFactory.deployed(); - - const bytecodeHash = utils.keccak256(CAMPAIGNINFO.bytecode); - treasuryFactory = await TREASURYFACTORY.deploy(globalParams.address, campaignInfoFactory.address, bytecodeHash); - await treasuryFactory.deployed(); - - //Initialize campaignInfoFactory - const initialize = await campaignInfoFactory._initialize(treasuryFactory.address, globalParams.address); - await initialize.wait(); - - //Mint token to the backer - const mint = await testUsd.mint(backer1Addr.address, convertBigNumber(1000000, 18)); - await mint.wait(); - - return { contractOwner, protocolAdminAddr, platform1AdminAddr, creator1Addr, testUsd, globalParams, campaignInfoFactory, treasuryFactory, CAMPAIGNINFO, ALLORNOTHING, backer1Addr } - } - - const enlistPlatform = async () => { - - const fixture = await loadFixture(deployOnceFixture); - - const platformBytes = convertStringToBytes("KickStarter"); - const platformFeePercent = 10 * 100; - - const enlistPlatformTransaction: ContractTransaction = await fixture.globalParams.connect(fixture.contractOwner).enlistPlatform(platformBytes, fixture.platform1AdminAddr.address, platformFeePercent); - - const enlistPlatformReceipt: ContractReceipt = await enlistPlatformTransaction.wait(); - - return { fixture, enlistPlatformTransaction, enlistPlatformReceipt } - } - - const addBytecode = async () => { - - const { fixture } = await loadFixture(enlistPlatform); - - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - const platformByteCode = fixture.ALLORNOTHING.bytecode; - - const platformByteCodeChunks = splitByteCodeIntoChunks(platformByteCode, 2); - - const addBytecodeChunk1Transaction: ContractTransaction = await fixture.treasuryFactory.connect(fixture.platform1AdminAddr).addBytecodeChunk(platformBytes, platformByteCodeIndex, 0, false, platformByteCodeChunks[0]); - const addBytecodeChunk1Receipt: ContractReceipt = await addBytecodeChunk1Transaction.wait(); - - const addBytecodeChunk2Transaction: ContractTransaction = await fixture.treasuryFactory.connect(fixture.platform1AdminAddr).addBytecodeChunk(platformBytes, platformByteCodeIndex, 1, true, platformByteCodeChunks[1]); - const addBytecodeChunk2Receipt: ContractReceipt = await addBytecodeChunk2Transaction.wait(); - - return { fixture, addBytecodeChunk1Transaction, addBytecodeChunk1Receipt, addBytecodeChunk2Transaction, addBytecodeChunk2Receipt } - } - - const enlistBytecode = async () => { - - const { fixture } = await loadFixture(addBytecode); - - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - - const enlistBytecodeTransaction: ContractTransaction = await fixture.treasuryFactory.connect(fixture.protocolAdminAddr).enlistBytecode(platformBytes, platformByteCodeIndex); - - const enlistBytecodeReceipt: ContractReceipt = await enlistBytecodeTransaction.wait(); - - return { fixture, enlistBytecodeTransaction, enlistBytecodeReceipt } - } - - const createCampaign = async () => { - - const { fixture } = await loadFixture(enlistBytecode); - - const platformBytes = convertStringToBytes("KickStarter"); - const selectedPlatformBytes = [platformBytes]; - const identifierHash = utils.keccak256(platformBytes); - const blockTimestamp = (await ethers.provider.getBlock('latest')).timestamp; - const launchTime = blockTimestamp + 300; - const campaignData = { - launchTime, - deadline: launchTime + 300, - goalAmount: 100 - } - - const createCampaignTransaction: ContractTransaction = await fixture.campaignInfoFactory.connect(fixture.creator1Addr).createCampaign(fixture.creator1Addr.address, identifierHash, selectedPlatformBytes, [], [], campaignData); - const createCampaignReceipt: ContractReceipt = await createCampaignTransaction.wait(); - - return { fixture, createCampaignTransaction, createCampaignReceipt } - } - - const deploy = async () => { - const { fixture, createCampaignReceipt } = await loadFixture(createCampaign); - - const event = createCampaignReceipt.events?.find(event => event.event === 'CampaignInfoFactoryCampaignCreated'); - const infoAddress = event?.args!.campaignInfoAddress; - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - - const deployTransaction: ContractTransaction = await fixture.treasuryFactory.connect(fixture.platform1AdminAddr).deploy(platformBytes, platformByteCodeIndex, infoAddress); - const deployReceipt: ContractReceipt = await deployTransaction.wait(); - - return { fixture, deployTransaction, deployReceipt, infoAddress } - } - - const addReward = async () => { - const { fixture, deployReceipt } = await loadFixture(deploy); - const event = deployReceipt.events?.find(event => event.event === 'TreasuryFactoryTreasuryDeployed'); - const treasuryAddress = event?.args!.treasuryAddress; - const allOrNothing: AllOrNothing = await ethers.getContractAt("AllOrNothing", treasuryAddress); - - const rewardName = convertStringToBytes("sampleReward"); - const reward = { - rewardValue: convertBigNumber(1000, 18), - isRewardTier: true, - itemId: [convertStringToBytes("sampleItem")], - itemValue: [convertBigNumber(1000, 18)], - itemQuantity: [ethers.BigNumber.from(10)] - } - - const addRewardTransaction: ContractTransaction = await allOrNothing.connect(fixture.creator1Addr).addReward(rewardName, reward); - const addRewardReceipt: ContractReceipt = await addRewardTransaction.wait(); - - return {fixture, addRewardTransaction, addRewardReceipt, reward, allOrNothing} - - } - - const pledgeOnPreLaunch = async () => { - const { fixture, allOrNothing } = await loadFixture(addReward); - - //Increase Allowance to the AllOrNothing Contract - const increaseAllowanceTransaction = await fixture.testUsd.connect(fixture.backer1Addr).increaseAllowance(allOrNothing.address, convertBigNumber(1, 18)); - await increaseAllowanceTransaction.wait(); - - const pledgeOnPreLaunchTransaction: ContractTransaction = await allOrNothing.connect(fixture.backer1Addr).pledgeOnPreLaunch(fixture.backer1Addr.address); - const pledgeOnPreLaunchReceipt: ContractReceipt = await pledgeOnPreLaunchTransaction.wait(); - - return {fixture, pledgeOnPreLaunchTransaction, pledgeOnPreLaunchReceipt, allOrNothing} - } - - const pledgeForAReward = async () => { - const { fixture, allOrNothing } = await loadFixture(pledgeOnPreLaunch); - - //Increase Allowance to the AllOrNothing Contract - const increaseAllowanceTransaction = await fixture.testUsd.connect(fixture.backer1Addr).increaseAllowance(allOrNothing.address, convertBigNumber(1000, 18)); - await increaseAllowanceTransaction.wait(); - - await increaseBlockTime(300); - - const pledgeForARewardTransaction: ContractTransaction = await allOrNothing.connect(fixture.backer1Addr).pledgeForAReward(fixture.backer1Addr.address, [convertStringToBytes("sampleReward")]); - const pledgeForARewardReceipt: ContractReceipt = await pledgeForARewardTransaction.wait(); - - const event = pledgeForARewardReceipt.events?.find(event => event.event === 'Receipt'); - - const tokenId = event?.args!.tokenId; - - return {fixture, pledgeForARewardTransaction, pledgeForARewardReceipt, allOrNothing, tokenId} - } - - const pledgeWithoutAReward = async () => { - const {fixture, allOrNothing, tokenId} = await loadFixture(pledgeForAReward); - - //Increase Allowance to the AllOrNothing Contract - const increaseAllowanceTransaction = await fixture.testUsd.connect(fixture.backer1Addr).increaseAllowance(allOrNothing.address, convertBigNumber(1000, 18)); - await increaseAllowanceTransaction.wait(); - - const pledgeWithoutARewardTransaction: ContractTransaction = await allOrNothing.connect(fixture.backer1Addr).pledgeWithoutAReward(fixture.backer1Addr.address, convertBigNumber(1000, 18)); - const pledgeWithoutARewardReceipt: ContractReceipt = await pledgeWithoutARewardTransaction.wait(); - - return {fixture, pledgeWithoutARewardTransaction, pledgeWithoutARewardReceipt, allOrNothing, tokenId} - } - - const claimRefund = async () => { - const {fixture, allOrNothing, tokenId} = await loadFixture(pledgeWithoutAReward); - - //Approve NFT Burn to the AllOrNothing Contract - const approveTransaction = await allOrNothing.connect(fixture.backer1Addr).approve(allOrNothing.address, tokenId); - await approveTransaction.wait(); - - const claimRefundTransaction: ContractTransaction = await allOrNothing.connect(fixture.backer1Addr).claimRefund(tokenId); - const claimRefundReceipt: ContractReceipt = await claimRefundTransaction.wait(); - - return { fixture, claimRefundTransaction, claimRefundReceipt, allOrNothing, tokenId} - } - - const disburseFees = async () => { - const {fixture, allOrNothing} = await loadFixture(claimRefund); - - const disburseFeesTransaction: ContractTransaction = await allOrNothing.disburseFees(); - const disburseFeesReceipt: ContractReceipt = await disburseFeesTransaction.wait(); - - return { fixture, disburseFeesTransaction, disburseFeesReceipt, allOrNothing } - } - - const withdraw = async () => { - const {fixture, allOrNothing} = await loadFixture(disburseFees); - - const withdrawTransaction: ContractTransaction = await allOrNothing.withdraw(); - const withdrawReceipt: ContractReceipt = await withdrawTransaction.wait(); - - return { fixture, withdrawTransaction, withdrawReceipt } - } - - it("Enlisting Platform in Global Params Contract", async () => { - const { fixture, enlistPlatformTransaction, enlistPlatformReceipt } = await loadFixture(enlistPlatform); - - const platformBytes = convertStringToBytes("KickStarter"); - const s_platformIsListed = await fixture.globalParams.checkIfplatformIsListed(platformBytes); - expect(s_platformIsListed).to.equal(true); - - const platformAdminAddress = await fixture.globalParams.getPlatformAdminAddress(platformBytes); - expect(platformAdminAddress).to.equal(fixture.platform1AdminAddr.address); - - }); - - it("Adding Bytecode in Treasury Factory Contract", async () => { - const { fixture, addBytecodeChunk1Transaction, addBytecodeChunk1Receipt, addBytecodeChunk2Transaction, addBytecodeChunk2Receipt } = await loadFixture(addBytecode); - - const event1 = addBytecodeChunk1Receipt.events?.find(event => event.event === 'TreasuryFactoryBytecodeChunkAdded'); - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - const platformByteCode = fixture.ALLORNOTHING.bytecode; - const platformByteCodeChunks = splitByteCodeIntoChunks(platformByteCode, 2); - - expect(event1?.args!.platformBytes).to.equal(platformBytes); - expect(event1?.args!.bytecodeIndex).to.equal(platformByteCodeIndex); - expect(event1?.args!.bytecodeChunk).to.equal(0); - expect(event1?.args!.bytecode).to.equal(platformByteCodeChunks[0]); - - const event2 = addBytecodeChunk2Receipt.events?.find(event => event.event === 'TreasuryFactoryBytecodeChunkAdded'); - expect(event2?.args!.platformBytes).to.equal(platformBytes); - expect(event2?.args!.bytecodeIndex).to.equal(platformByteCodeIndex); - expect(event2?.args!.bytecodeChunk).to.equal(1); - expect(event2?.args!.bytecode).to.equal(platformByteCodeChunks[1]); - - }); - - it("Enlisting Bytecode in Treasury Factory Contract", async () => { - const { fixture, enlistBytecodeTransaction, enlistBytecodeReceipt } = await loadFixture(enlistBytecode); - - const event = enlistBytecodeReceipt.events?.find(event => event.event === 'TreasuryFactoryBytecodeEnlisted'); - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - - expect(event?.args!.platformBytes).to.equal(platformBytes); - expect(event?.args!.bytecodeIndex).to.equal(platformByteCodeIndex); - - }); - - it("Creating Campaign in Campaign Info Factory Contract", async () => { - const { fixture, createCampaignTransaction, createCampaignReceipt } = await loadFixture(createCampaign); - - const event = createCampaignReceipt.events?.find(event => event.event === 'CampaignInfoFactoryCampaignCreated'); - - const platformBytes = convertStringToBytes("KickStarter"); - const identifierHash = utils.keccak256(platformBytes); - - expect(event?.args!.identifierHash).to.equal(identifierHash); - console.log("Campaign Info Address: ", event?.args!.campaignInfoAddress) - }); - - it("Deploy Treasury in Treasury Factory Contract", async () => { - const {fixture, deployTransaction, deployReceipt, infoAddress} = await loadFixture(deploy); - - const event = deployReceipt.events?.find(event => event.event === 'TreasuryFactoryTreasuryDeployed'); - - const platformBytes = convertStringToBytes("KickStarter"); - const platformByteCodeIndex = 0; - - expect(event?.args!.platformBytes).to.equal(platformBytes); - expect(event?.args!.bytecodeIndex).to.equal(platformByteCodeIndex); - expect(event?.args!.infoAddress).to.equal(infoAddress); - - console.log("Treasury Address: ", event?.args!.treasuryAddress); - }); - - it("Add Reward in AllOrNothing Contract", async () => { - const {fixture, addRewardTransaction, addRewardReceipt, reward, allOrNothing} = await loadFixture(addReward); - - const event = addRewardReceipt.events?.find(event => event.event === 'RewardAdded'); - - const rewardName = convertStringToBytes("sampleReward"); - - expect(event?.args!.rewardName).to.equal(rewardName); - const rewardEvent = event?.args!.reward; - expect(rewardEvent.isRewardTier).to.equal(reward.isRewardTier); - expect(rewardEvent.itemId).to.eql(reward.itemId); - expect(rewardEvent.rewardValue).to.equal(reward.rewardValue); - expect(rewardEvent.itemValue).to.eql(reward.itemValue); - expect(rewardEvent.itemQuantity).to.eql(reward.itemQuantity); - }); - - it('Pre Launch Pledge in AllOrNothing Contract', async () => { - const {fixture, pledgeOnPreLaunchTransaction, pledgeOnPreLaunchReceipt} = await loadFixture(pledgeOnPreLaunch); - - const event = pledgeOnPreLaunchReceipt.events?.find(event => event.event === 'Receipt'); - - expect(event?.args!.backer).to.equal(fixture.backer1Addr.address); - expect(event?.args!.pledgeAmount).to.equal(convertBigNumber(1, 18)); - - }) - - it('Pledge for a Reward in AllOrNothing Contract', async () => { - const {fixture, pledgeForARewardTransaction, pledgeForARewardReceipt, allOrNothing} = await loadFixture(pledgeForAReward); - - const event = pledgeForARewardReceipt.events?.find(event => event.event === 'Receipt'); - - expect(event?.args!.backer).to.equal(fixture.backer1Addr.address); - expect(event?.args!.pledgeAmount).to.equal(convertBigNumber(1000, 18)); - - }) - - it('Pledge Without a Reward in AllOrNothing Contract', async () => { - const {fixture, pledgeWithoutARewardTransaction, pledgeWithoutARewardReceipt, allOrNothing} = await loadFixture(pledgeWithoutAReward); - - const event = pledgeWithoutARewardReceipt.events?.find(event => event.event === 'Receipt'); - - expect(event?.args!.backer).to.equal(fixture.backer1Addr.address); - expect(event?.args!.pledgeAmount).to.equal(convertBigNumber(1000, 18)); - - }) - - it('Claim Refund in AllOrNothing Contract', async () => { - const {fixture, claimRefundTransaction, claimRefundReceipt, allOrNothing, tokenId} = await loadFixture(claimRefund); - - const event = claimRefundReceipt.events?.find(event => event.event === 'RefundClaimed'); - - expect(event?.args!.tokenId).to.equal(tokenId); - expect(event?.args!.refundAmount).to.equal(convertBigNumber(1000, 18)); - expect(event?.args!.claimer).to.equal(fixture.backer1Addr.address); - - }) - - it('Disburse Fees in AllOrNothing Contract', async () => { - const {fixture, disburseFeesTransaction, disburseFeesReceipt} = await loadFixture(disburseFees); - - const event = disburseFeesReceipt.events?.find(event => event.event === 'FeesDisbursed'); - - expect(event?.args!.protocolShare).to.equal(convertBigNumber(2002,17)); - expect(event?.args!.platformShare).to.equal(convertBigNumber(1001,17)); - - }) - - it('Withdraw in AllOrNothing Contract', async () => { - const {fixture, withdrawTransaction, withdrawReceipt} = await loadFixture(withdraw); - - const event = withdrawReceipt.events?.find(event => event.event === 'WithdrawalSuccessful'); - - expect(event?.args!.to).to.equal(fixture.creator1Addr.address); - expect(event?.args!.amount).to.equal(convertBigNumber(7007,17)); - - }) - - - -}); \ No newline at end of file diff --git a/utils/helpers.ts b/utils/helpers.ts deleted file mode 100644 index 3c263cf5..00000000 --- a/utils/helpers.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ethers } from 'hardhat'; - -export const convertStringToBytes = (val: string) => { - - const {formatBytes32String} = ethers.utils; - return formatBytes32String(val); -}; - -export const convertBytesToString = (val: any) => { - const { parseBytes32String } = ethers.utils; - return parseBytes32String(val); -}; - -export const splitByteCodeIntoChunks = (byteCode: string, numberOfChunks: number) => { - const numChunks = Math.ceil(byteCode.length / numberOfChunks) - const chunks = new Array(numberOfChunks); - let o = 0; - for (let i = 0; i < numberOfChunks; i++) { - if( i !== 0 ) { - let chunk = byteCode.slice(o, numChunks + o); - if(chunk.length % 2 === 1){ - chunks[i] = '0x' + byteCode.slice(o, (numChunks + o) - 1 ) - o += numChunks - 1; - }else{ - chunks[i] = '0x' + byteCode.slice(o, numChunks + o) - o += numChunks; - } - - } - else{ - let chunk = byteCode.slice(o, numChunks); - if(chunk.length % 2 === 1){ - chunks[i] = byteCode.slice(o, numChunks+1); - o += numChunks + 1; - }else{ - chunks[i] = byteCode.slice(o, numChunks); - o += numChunks; - } - } - } - - return chunks; -} - -export const convertBigNumber = (value: number, decimal: number) => { - return ethers.BigNumber.from(value).mul(ethers.BigNumber.from(10).pow(decimal)); -} - -export const increaseBlockTime = async (value: number) => { - return await ethers.provider.send("evm_increaseTime", [value]); -} \ No newline at end of file From 0c48f66bf6f474d9aacc91774c81de1f22caa5a9 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:33:52 +0800 Subject: [PATCH 27/61] Refactor BaseTreasury with Initializers and modify fee disbursement methods --- src/utils/BaseTreasury.sol | 125 ++++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/src/utils/BaseTreasury.sol b/src/utils/BaseTreasury.sol index 596d7a22..23eb07a7 100644 --- a/src/utils/BaseTreasury.sol +++ b/src/utils/BaseTreasury.sol @@ -1,12 +1,14 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/security/Pausable.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "../interfaces/ICampaignInfo.sol"; import "../interfaces/ICampaignTreasury.sol"; import "./CampaignAccessChecker.sol"; -import "./PausableWithMsg.sol"; +import "./PausableCancellable.sol"; +import "forge-std/console.sol"; /** * @title BaseTreasury @@ -15,21 +17,23 @@ import "./PausableWithMsg.sol"; * @dev Contracts implementing this base contract should provide specific success conditions. */ abstract contract BaseTreasury is + Initializable, ICampaignTreasury, CampaignAccessChecker, - PausableWithMsg + PausableCancellable { + using SafeERC20 for IERC20; bytes32 internal constant ZERO_BYTES = 0x0000000000000000000000000000000000000000000000000000000000000000; uint256 internal constant PERCENT_DIVIDER = 10000; - bytes32 internal immutable PLATFORM_BYTES; - uint256 internal immutable PLATFORM_FEE_PERCENT; - IERC20 internal immutable TOKEN; - ICampaignInfo internal immutable CAMPAIGN_INFO; + bytes32 internal PLATFORM_HASH; + uint256 internal PLATFORM_FEE_PERCENT; + IERC20 internal TOKEN; + ICampaignInfo internal CAMPAIGN_INFO; - uint256 internal s_pledgedAmountInCrypto; - bool internal s_cryptoFeeDisbursed; + uint256 internal s_pledgedAmount; + bool internal s_feesDisbursed; /** * @notice Emitted when fees are successfully disbursed. @@ -43,7 +47,7 @@ abstract contract BaseTreasury is * @param to The recipient of the withdrawal. * @param amount The amount withdrawn. */ - event WithdrawalSuccessful(address indexed to, uint256 amount); + event WithdrawalSuccessful(address to, uint256 amount); /** * @notice Emitted when the success condition is not fulfilled during fee disbursement. @@ -70,34 +74,35 @@ abstract contract BaseTreasury is */ error TreasuryCampaignInfoIsPaused(); - /** - * @dev Constructs a new BaseTreasury instance. - * @param platformBytes The identifier for the platform associated with this treasury. - * @param infoAddress The address of the CampaignInfo contract. - */ - constructor( - bytes32 platformBytes, + function __BaseContract_init( + bytes32 platformHash, address infoAddress - ) CampaignAccessChecker(infoAddress) { - PLATFORM_BYTES = platformBytes; + ) internal { + __CampaignAccessChecker_init(infoAddress); + PLATFORM_HASH = platformHash; CAMPAIGN_INFO = ICampaignInfo(infoAddress); TOKEN = IERC20(INFO.getTokenAddress()); - PLATFORM_FEE_PERCENT = INFO.getPlatformFeePercent(platformBytes); + PLATFORM_FEE_PERCENT = INFO.getPlatformFeePercent(platformHash); } /** * @dev Modifier that checks if the campaign is not paused. */ modifier whenCampaignNotPaused() { - _checkIfCampaignPaused(); + _revertIfCampaignPaused(); + _; + } + + modifier whenCampaignNotCancelled() { + _revertIfCampaignCancelled(); _; } /** * @inheritdoc ICampaignTreasury */ - function getplatformBytes() external view override returns (bytes32) { - return PLATFORM_BYTES; + function getplatformHash() external view override returns (bytes32) { + return PLATFORM_HASH; } /** @@ -110,73 +115,95 @@ abstract contract BaseTreasury is /** * @inheritdoc ICampaignTreasury */ - function disburseFees() public virtual override whenCampaignNotPaused { + function disburseFees() + public + virtual + override + whenCampaignNotPaused + whenCampaignNotCancelled + { if (!_checkSuccessCondition()) { revert TreasurySuccessConditionNotFulfilled(); } - uint256 balance = s_pledgedAmountInCrypto; + uint256 balance = s_pledgedAmount; uint256 protocolShare = (balance * INFO.getProtocolFeePercent()) / PERCENT_DIVIDER; uint256 platformShare = (balance * - INFO.getPlatformFeePercent(PLATFORM_BYTES)) / PERCENT_DIVIDER; - bool success = TOKEN.transfer( - INFO.getProtocolAdminAddress(), - protocolShare - ); - if (!success) { - revert TreasuryTransferFailed(); - } - success = TOKEN.transfer( - INFO.getPlatformAdminAddress(PLATFORM_BYTES), + INFO.getPlatformFeePercent(PLATFORM_HASH)) / PERCENT_DIVIDER; + TOKEN.safeTransfer(INFO.getProtocolAdminAddress(), protocolShare); + + TOKEN.safeTransfer( + INFO.getPlatformAdminAddress(PLATFORM_HASH), platformShare ); - if (!success) { - revert TreasuryTransferFailed(); - } - s_cryptoFeeDisbursed = true; + + s_feesDisbursed = true; emit FeesDisbursed(protocolShare, platformShare); } /** * @inheritdoc ICampaignTreasury */ - function withdraw() public virtual override whenCampaignNotPaused { - if (!s_cryptoFeeDisbursed) { + function withdraw() + public + virtual + override + whenCampaignNotPaused + whenCampaignNotCancelled + { + if (!s_feesDisbursed) { revert TreasuryFeeNotDisbursed(); } uint256 balance = TOKEN.balanceOf(address(this)); address recipient = INFO.owner(); - bool success = TOKEN.transfer(recipient, balance); - if (!success) { - revert TreasuryTransferFailed(); - } + TOKEN.safeTransfer(recipient, balance); + emit WithdrawalSuccessful(recipient, balance); } /** * @dev External function to pause the campaign. */ - function _pauseTreasury(bytes32 message) external onlyPlatformAdmin(PLATFORM_BYTES) { + function pauseTreasury( + bytes32 message + ) public virtual onlyPlatformAdmin(PLATFORM_HASH) { _pause(message); } /** * @dev External function to unpause the campaign. */ - function _unpauseTreasury(bytes32 message) external onlyPlatformAdmin(PLATFORM_BYTES) { + function unpauseTreasury( + bytes32 message + ) public virtual onlyPlatformAdmin(PLATFORM_HASH) { _unpause(message); } + /** + * @dev External function to cancel the campaign. + */ + function cancelTreasury( + bytes32 message + ) public virtual onlyPlatformAdmin(PLATFORM_HASH) { + _cancel(message); + } + /** * @dev Internal function to check if the campaign is paused. * If the campaign is paused, it reverts with TreasuryCampaignInfoIsPaused error. */ - function _checkIfCampaignPaused() internal view { + function _revertIfCampaignPaused() internal view { if (INFO.paused()) { revert TreasuryCampaignInfoIsPaused(); } } + function _revertIfCampaignCancelled() internal view { + if (INFO.cancelled()) { + revert TreasuryCampaignInfoIsPaused(); + } + } + /** * @dev Internal function to check the success condition for fee disbursement. * @return Whether the success condition is met. From 9fe66ee625bc8965be430ecfb1316c07b5f76676 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:40:30 +0800 Subject: [PATCH 28/61] Upgrade AllOrNothing - Add PausableCancellable functions - Refactor Reward struct - Update ERC20 with safeERC20 - Add feature to accept shipping fee - Upgrade constructor with Initializer - Remove fiat relevant functions and calculations in raised amounts - Remove preLaunch pledge functions --- src/treasuries/AllOrNothing.sol | 258 ++++++++++++++------------------ 1 file changed, 112 insertions(+), 146 deletions(-) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index df184fa6..7640585a 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -1,39 +1,29 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; +pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; -import "@openzeppelin/contracts/utils/Counters.sol"; + +import "../utils/Counters.sol"; import "../utils/TimestampChecker.sol"; import "../utils/BaseTreasury.sol"; -import "../utils/FiatEnabled.sol"; +import "../interfaces/IReward.sol"; /** * @title AllOrNothing * @notice A contract for handling crowdfunding campaigns with rewards. */ contract AllOrNothing is + IReward, BaseTreasury, TimestampChecker, - FiatEnabled, ERC721Burnable { using Counters for Counters.Counter; - - // Struct to represent a reward - struct Reward { - uint256 rewardValue; - bool isRewardTier; - bytes32[] itemId; - uint256[] itemValue; - uint256[] itemQuantity; - } - - // Constant for the pre-launch pledge amount - uint256 private constant PRELAUNCH_PLEDGE = 1 ether; + using SafeERC20 for IERC20; // Mapping to store the pledged amount per token ID - mapping(uint256 => uint256) private s_tokenToPledgedAmount; + mapping(uint256 => uint256) private s_tokenToCollectedAmount; // Mapping to store reward details by name mapping(bytes32 => Reward) private s_reward; @@ -42,21 +32,23 @@ contract AllOrNothing is Counters.Counter private s_tokenIdCounter; Counters.Counter private s_rewardCounter; + string private s_name; + string private s_symbol; + /** * @dev Emitted when a backer makes a pledge. * @param backer The address of the backer making the pledge. * @param reward The name of the reward. * @param pledgeAmount The amount pledged. * @param tokenId The ID of the token representing the pledge. - * @param isPreLaunchPledge Indicates whether it's a pre-launch pledge. * @param rewards An array of reward names. */ event Receipt( address indexed backer, bytes32 indexed reward, uint256 pledgeAmount, + uint256 shippingFee, uint256 tokenId, - bool isPreLaunchPledge, bytes32[] rewards ); @@ -105,6 +97,11 @@ contract AllOrNothing is * @dev Emitted when fees are not disbursed. */ error AllOrNothingFeeNotDisbursed(); + + /** + * @dev Emitted when `disburseFees` after fee is disbursed already. + */ + error AllOrNothingFeeAlreadyDisbursed(); /** * @dev Emitted when a `Reward` already exists for given input. */ @@ -118,14 +115,26 @@ contract AllOrNothing is /** * @dev Constructor for the AllOrNothing contract. - * @param platformBytes The unique identifier of the platform. - * @param infoAddress The address of the campaign information contract. */ - constructor( - bytes32 platformBytes, - address infoAddress - ) ERC721("", "") BaseTreasury(platformBytes, infoAddress) { - s_tokenIdCounter.increment(); + constructor() ERC721("", "") {} + + function initialize( + bytes32 _platformHash, + address _infoAddress, + string calldata _name, + string calldata _symbol + ) external initializer { + __BaseContract_init(_platformHash, _infoAddress); + s_name = _name; + s_symbol = _symbol; + } + + function name() public view override returns (string memory) { + return s_name; + } + + function symbol() public view override returns (string memory) { + return s_symbol; } /** @@ -146,7 +155,7 @@ contract AllOrNothing is * @inheritdoc ICampaignTreasury */ function getRaisedAmount() external view override returns (uint256) { - return s_fiatRaisedAmount + s_pledgedAmountInCrypto; + return s_pledgedAmount; } /** @@ -157,7 +166,14 @@ contract AllOrNothing is function addReward( bytes32 rewardName, Reward calldata reward - ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { + ) + external + onlyCampaignOwner + whenCampaignNotPaused + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled + { if ( reward.rewardValue == 0 && reward.itemId.length == 0 && @@ -182,7 +198,14 @@ contract AllOrNothing is function addRewardsBatch( bytes32[] calldata rewardNames, Reward[] calldata rewards - ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { + ) + external + onlyCampaignOwner + whenCampaignNotPaused + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled + { if (rewardNames.length != rewards.length) { revert AllOrNothingInvalidInput(); } @@ -215,7 +238,14 @@ contract AllOrNothing is */ function removeReward( bytes32 rewardName - ) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused { + ) + external + onlyCampaignOwner + whenCampaignNotPaused + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled + { if (s_reward[rewardName].rewardValue == 0) { revert AllOrNothingInvalidInput(); } @@ -224,71 +254,6 @@ contract AllOrNothing is emit RewardRemoved(rewardName); } - /** - * @notice Updates the fiat pledge transaction. - * @param fiatPledgeId The unique identifier of the fiat pledge. - * @param fiatPledgeAmount The amount of the fiat pledge. - */ - function updateFiatPledge( - bytes32 fiatPledgeId, - uint256 fiatPledgeAmount - ) - external - onlyPlatformAdmin(PLATFORM_BYTES) - whenCampaignNotPaused - whenNotPaused - { - _updateFiatTransaction(fiatPledgeId, fiatPledgeAmount); - } - - /** - * @notice Updates the state of fiat fee disbursement. - * @param isDisbursed Whether fiat fees are disbursed. - * @param protocolFeeAmount The protocol fee amount. - * @param platformFeeAmount The platform fee amount. - */ - function updateFiatFeeDisbursementState( - bool isDisbursed, - uint256 protocolFeeAmount, - uint256 platformFeeAmount - ) - external - onlyPlatformAdmin(PLATFORM_BYTES) - whenCampaignNotPaused - whenNotPaused - { - _updateFiatFeeDisbursementState( - isDisbursed, - protocolFeeAmount, - platformFeeAmount - ); - } - - /** - * @notice Allows a backer to make a pre-launch pledge. - * @param backer The address of the backer making the pledge. - */ - function pledgeOnPreLaunch( - address backer - ) - external - currentTimeIsGreater(INFO.getLaunchTime()) - whenCampaignNotPaused - whenNotPaused - { - uint256 tokenId = s_tokenIdCounter.current(); - bytes32[] memory emptyByteArray = new bytes32[](0); - - _pledge( - backer, - ZERO_BYTES, - PRELAUNCH_PLEDGE, - tokenId, - true, - emptyByteArray - ); - } - /** * @notice Allows a backer to pledge for a reward. * @param backer The address of the backer making the pledge. @@ -296,12 +261,15 @@ contract AllOrNothing is */ function pledgeForAReward( address backer, + uint256 shippingFee, bytes32[] calldata reward ) external currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) whenCampaignNotPaused whenNotPaused + whenCampaignNotCancelled + whenNotCancelled { uint256 tokenId = s_tokenIdCounter.current(); uint256 rewardLen = reward.length; @@ -321,7 +289,7 @@ contract AllOrNothing is } pledgeAmount += s_reward[reward[i]].rewardValue; } - _pledge(backer, reward[0], pledgeAmount, tokenId, false, reward); + _pledge(backer, reward[0], pledgeAmount, shippingFee, tokenId, reward); } /** @@ -337,18 +305,13 @@ contract AllOrNothing is currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) whenCampaignNotPaused whenNotPaused + whenCampaignNotCancelled + whenNotCancelled { uint256 tokenId = s_tokenIdCounter.current(); bytes32[] memory emptyByteArray = new bytes32[](0); - _pledge( - backer, - ZERO_BYTES, - pledgeAmount, - tokenId, - false, - emptyByteArray - ); + _pledge(backer, ZERO_BYTES, pledgeAmount, 0, tokenId, emptyByteArray); } /** @@ -368,17 +331,14 @@ contract AllOrNothing is revert AllOrNothingNotClaimable(tokenId); } } - uint256 amount = s_tokenToPledgedAmount[tokenId]; + uint256 amount = s_tokenToCollectedAmount[tokenId]; if (amount == 0) { revert AllOrNothingNotClaimable(tokenId); } - s_tokenToPledgedAmount[tokenId] = 0; - s_pledgedAmountInCrypto -= amount; + s_tokenToCollectedAmount[tokenId] = 0; + s_pledgedAmount -= amount; burn(tokenId); - bool success = TOKEN.transfer(msg.sender, amount); - if (!success) { - revert AllOrNothingTransferFailed(); - } + TOKEN.safeTransfer(msg.sender, amount); emit RefundClaimed(tokenId, amount, msg.sender); } @@ -389,52 +349,58 @@ contract AllOrNothing is public override currentTimeIsGreater(INFO.getDeadline()) + whenNotPaused + whenNotCancelled { - if (!s_cryptoFeeDisbursed) { - super.disburseFees(); + if (s_feesDisbursed) { + revert AllOrNothingFeeAlreadyDisbursed(); + } + super.disburseFees(); + } + + /** + * @inheritdoc ICampaignTreasury + */ + function withdraw() public override whenNotPaused whenNotCancelled { + super.withdraw(); + } + + /** + * @inheritdoc BaseTreasury + * @dev This function is overridden to allow the platform admin and the campaign owner to cancel a treasury. + */ + function cancelTreasury(bytes32 message) public override { + if ( + msg.sender != INFO.getPlatformAdminAddress(PLATFORM_HASH) && + msg.sender != INFO.owner() + ) { + revert AllOrNothingUnAuthorized(); } + _cancel(message); } function _pledge( address backer, bytes32 reward, uint256 pledgeAmount, + uint256 shippingFee, uint256 tokenId, - bool isPreLaunchPledge, bytes32[] memory rewards ) internal { - bool success = TOKEN.transferFrom(backer, address(this), pledgeAmount); - if (success) { - s_tokenIdCounter.increment(); - _safeMint( - backer, - tokenId, - abi.encodePacked(backer, isPreLaunchPledge, reward) - ); - if (!isPreLaunchPledge) { - s_tokenToPledgedAmount[tokenId] = pledgeAmount; - } - s_pledgedAmountInCrypto += pledgeAmount; - emit Receipt( - backer, - reward, - pledgeAmount, - tokenId, - isPreLaunchPledge, - rewards - ); - } else { - revert AllOrNothingTransferFailed(); - } - } - - /** - * @dev Checks if the caller is the platform admin. - */ - function _checkIfPlatformAdmin() internal view { - if (msg.sender != INFO.getPlatformAdminAddress(PLATFORM_BYTES)) { - revert AllOrNothingUnAuthorized(); - } + uint256 totalAmount = pledgeAmount + shippingFee; + TOKEN.safeTransferFrom(backer, address(this), totalAmount); + s_tokenIdCounter.increment(); + _safeMint(backer, tokenId, abi.encodePacked(backer, reward)); + s_tokenToCollectedAmount[tokenId] = totalAmount; + s_pledgedAmount += pledgeAmount; + emit Receipt( + backer, + reward, + pledgeAmount, + shippingFee, + tokenId, + rewards + ); } /** From c8caa617423e99990bf6c62cf9272e11879f8e88 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:41:19 +0800 Subject: [PATCH 29/61] Add log decoder utility functions --- test/foundry/utils/LogDecoder.sol | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/foundry/utils/LogDecoder.sol diff --git a/test/foundry/utils/LogDecoder.sol b/test/foundry/utils/LogDecoder.sol new file mode 100644 index 00000000..e5255200 --- /dev/null +++ b/test/foundry/utils/LogDecoder.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; + +abstract contract LogDecoder is Test { + function findLogByTopic( + Vm.Log[] memory logs, + bytes32 topic0 + ) internal pure returns (Vm.Log memory) { + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics.length > 0 && logs[i].topics[0] == topic0) { + return logs[i]; + } + } + revert("Log with specified topic not found"); + } + + function decodeEventFromLogs( + Vm.Log[] memory logs, + string memory eventSignature, + address expectedEmitter + ) internal pure returns (bytes memory) { + bytes32 expectedTopic = keccak256(bytes(eventSignature)); + + for (uint256 i = 0; i < logs.length; i++) { + if ( + logs[i].topics[0] == expectedTopic && + logs[i].emitter == expectedEmitter + ) { + return logs[i].data; + } + } + revert("Event not found in logs"); + } + + function decodeTopicsAndData( + Vm.Log[] memory logs, + string memory eventSignature, + address expectedEmitter + ) internal pure returns (bytes32[] memory topics, bytes memory data) { + bytes32 expectedTopic = keccak256(bytes(eventSignature)); + + for (uint256 i = 0; i < logs.length; i++) { + if ( + logs[i].topics.length > 0 && + logs[i].topics[0] == expectedTopic && + logs[i].emitter == expectedEmitter + ) { + return (logs[i].topics, logs[i].data); + } + } + + revert("Event not found in logs"); + } +} From e4ec2757722f3857deb8c80eddac326aa62ff75a Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:41:43 +0800 Subject: [PATCH 30/61] Update default values for test --- test/foundry/utils/Defaults.sol | 100 +++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 21 deletions(-) diff --git a/test/foundry/utils/Defaults.sol b/test/foundry/utils/Defaults.sol index 66184837..17815d82 100644 --- a/test/foundry/utils/Defaults.sol +++ b/test/foundry/utils/Defaults.sol @@ -1,24 +1,30 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; import {Constants} from "./Constants.sol"; import {ICampaignData} from "src/interfaces/ICampaignData.sol"; import {AllOrNothing} from "src/treasuries/AllOrNothing.sol"; +import {IReward} from "src/interfaces/IReward.sol"; /// @notice Contract with default values used throughout the tests. -contract Defaults is Constants, ICampaignData { - +contract Defaults is Constants, ICampaignData, IReward { //Constant Variables uint256 public constant PROTOCOL_FEE_PERCENT = 20 * 100; uint256 public constant TOKEN_MINT_AMOUNT = 1_000_000e18; uint256 public constant PLATFORM_FEE_PERCENT = 10 * 100; - bytes32 public constant PLATFORM_1_BYTES = bytes32(bytes("KickStarter")); - bytes32 public constant REWARD_NAME_1_BYTES = bytes32(bytes("sampleReward")); - uint256 public constant TREASURY_BYTE_CODE_INDEX = 1; + bytes32 public constant PLATFORM_1_HASH = + keccak256(abi.encodePacked("KickStarter")); + bytes32 public constant REWARD_NAME_1_HASH = + keccak256(abi.encodePacked("sampleReward")); + bytes32 public constant CAMPAIGN_1_IDENTIFIER_HASH = + keccak256(abi.encodePacked("Sample Campaign")); + string public constant NAME = "Name"; + string public constant SYMBOL = "Symbol"; uint256 public constant GOAL_AMOUNT = 100; uint256 public constant CAMPAIGN_DURATION = 10_000 seconds; - uint256 public constant PRE_LAUNCH_PLEDGE_AMOUNT = 1e18; uint256 public constant PLEDGE_AMOUNT = 1_000e18; + uint256 public constant PERCENT_DIVIDER = 10000; + uint256 public constant SHIPPING_FEE = 10; //Immutable Variables uint256 public immutable LAUNCH_TIME; @@ -28,8 +34,12 @@ contract Defaults is Constants, ICampaignData { CampaignData public CAMPAIGN_DATA; AllOrNothing.Reward public REWARD1; + // Public reward data for tests + bytes32[] public REWARD_NAMES; + Reward[] public REWARDS; + constructor() { - LAUNCH_TIME = OCTOBER_1_2023 + 300 seconds; + LAUNCH_TIME = OCTOBER_1_2023 + 300 seconds; DEADLINE = LAUNCH_TIME + CAMPAIGN_DURATION; //Add Campaign Data @@ -39,20 +49,68 @@ contract Defaults is Constants, ICampaignData { goalAmount: GOAL_AMOUNT }); - //Add Reward Data - bytes32[] memory itemIds = new bytes32[](1); - uint256[] memory itemValue = new uint256[](1); - uint256[] memory itemQuantity = new uint256[](1); - itemIds[0] = bytes32(bytes("sampleItem")); - itemValue[0] = 1_000e18; - itemQuantity[0] = 10; - REWARD1 = AllOrNothing.Reward({ + // Initialize the reward arrays + setupRewardData(); + } + + // Setup the reward data that can be accessed by tests + function setupRewardData() internal { + // Create arrays for 3 rewards + REWARD_NAMES = new bytes32[](3); + REWARDS = new Reward[](3); + + // First reward + REWARD_NAMES[0] = REWARD_NAME_1_HASH; + + bytes32[] memory itemIds1 = new bytes32[](1); + uint256[] memory itemValues1 = new uint256[](1); + uint256[] memory itemQuantities1 = new uint256[](1); + itemIds1[0] = keccak256(abi.encodePacked("sampleItem")); + itemValues1[0] = 1_000e18; + itemQuantities1[0] = 10; + + REWARDS[0] = Reward({ rewardValue: 1_000e18, isRewardTier: true, - itemId: itemIds, - itemValue: itemValue, - itemQuantity: itemQuantity + itemId: itemIds1, + itemValue: itemValues1, + itemQuantity: itemQuantities1 }); - } -} \ No newline at end of file + // Second reward (example with 2 items) + REWARD_NAMES[1] = keccak256(abi.encodePacked("premiumReward")); + + bytes32[] memory itemIds2 = new bytes32[](2); + uint256[] memory itemValues2 = new uint256[](2); + uint256[] memory itemQuantities2 = new uint256[](2); + itemIds2[0] = keccak256(abi.encodePacked("premiumItem1")); + itemValues2[0] = 2_000e18; + itemQuantities2[0] = 5; + itemIds2[1] = keccak256(abi.encodePacked("premiumItem2")); + itemValues2[1] = 500e18; + itemQuantities2[1] = 2; + + REWARDS[1] = Reward({ + rewardValue: 2_500e18, + isRewardTier: true, + itemId: itemIds2, + itemValue: itemValues2, + itemQuantity: itemQuantities2 + }); + + // Third reward (example with no items, just a value) + REWARD_NAMES[2] = keccak256(abi.encodePacked("basicReward")); + + bytes32[] memory emptyIds = new bytes32[](0); + uint256[] memory emptyValues = new uint256[](0); + uint256[] memory emptyQuantities = new uint256[](0); + + REWARDS[2] = Reward({ + rewardValue: 500e18, + isRewardTier: false, + itemId: emptyIds, + itemValue: emptyValues, + itemQuantity: emptyQuantities + }); + } +} From c64daa2c934a4526c097d35ed4b46d4fa455b71c Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:42:15 +0800 Subject: [PATCH 31/61] Add unit test for TreasuryFactory --- test/foundry/unit/TreasuryFactory.t.sol | 134 ++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 test/foundry/unit/TreasuryFactory.t.sol diff --git a/test/foundry/unit/TreasuryFactory.t.sol b/test/foundry/unit/TreasuryFactory.t.sol new file mode 100644 index 00000000..41187800 --- /dev/null +++ b/test/foundry/unit/TreasuryFactory.t.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import {TreasuryFactory} from "src/TreasuryFactory.sol"; +import {GlobalParams} from "src/GlobalParams.sol"; +import {TestUSD} from "src/TestUSD.sol"; +import {AdminAccessChecker} from "src/utils/AdminAccessChecker.sol"; + +contract TreasuryFactory_UpdatedUnitTest is Test { + TreasuryFactory internal factory; + GlobalParams internal globalParams; + TestUSD internal testUSD; + + address internal protocolAdmin = address(0xA11CE); + address internal platformAdmin = address(0xBEEF); + address internal other = address(0xDEAD); + + bytes32 internal platformHash = keccak256(abi.encodePacked("TEST")); + uint256 internal implementationId = 1; + address internal implementation = address(0xC0DE); + + uint256 internal platformFee = 300; // 3% + + function setUp() public { + testUSD = new TestUSD(); + globalParams = new GlobalParams(protocolAdmin, address(testUSD), 300); + factory = new TreasuryFactory(globalParams); + + // Label addresses for clarity + vm.label(protocolAdmin, "ProtocolAdmin"); + vm.label(platformAdmin, "PlatformAdmin"); + vm.label(implementation, "Implementation"); + vm.startPrank(protocolAdmin); + globalParams.enlistPlatform(platformHash, platformAdmin, platformFee); + vm.stopPrank(); + } + + function testRegisterTreasuryImplementation() public { + vm.startPrank(platformAdmin); + vm.mockCall( + address(globalParams), + abi.encodeWithSignature( + "isPlatformAdmin(bytes32,address)", + platformHash, + platformAdmin + ), + abi.encode(true) + ); + factory.registerTreasuryImplementation( + platformHash, + implementationId, + implementation + ); + vm.stopPrank(); + } + + function testRegisterWithZeroAddressReverts() public { + vm.startPrank(platformAdmin); + vm.mockCall( + address(globalParams), + abi.encodeWithSignature( + "isPlatformAdmin(bytes32,address)", + platformHash, + platformAdmin + ), + abi.encode(true) + ); + vm.expectRevert(TreasuryFactory.TreasuryFactoryInvalidAddress.selector); + factory.registerTreasuryImplementation( + platformHash, + implementationId, + address(0) + ); + vm.stopPrank(); + } + + function testApproveTreasuryImplementation() public { + // First register with platform admin + vm.startPrank(platformAdmin); + vm.mockCall( + address(globalParams), + abi.encodeWithSignature( + "isPlatformAdmin(bytes32,address)", + platformHash, + platformAdmin + ), + abi.encode(true) + ); + factory.registerTreasuryImplementation( + platformHash, + implementationId, + implementation + ); + vm.stopPrank(); + + // Then approve as protocol admin + vm.startPrank(protocolAdmin); + factory.approveTreasuryImplementation(platformHash, implementationId); + vm.stopPrank(); + } + + function testDeployFailsIfNotApproved() public { + vm.startPrank(platformAdmin); + vm.mockCall( + address(globalParams), + abi.encodeWithSignature( + "isPlatformAdmin(bytes32,address)", + platformHash, + platformAdmin + ), + abi.encode(true) + ); + factory.registerTreasuryImplementation( + platformHash, + implementationId, + implementation + ); + + vm.expectRevert( + TreasuryFactory + .TreasuryFactoryImplementationNotSetOrApproved + .selector + ); + factory.deploy( + platformHash, + address(0x1234), + implementationId, + "Test", + "TST" + ); + vm.stopPrank(); + } +} From 9ff397e999deac3f56031ff28c4b37fea3935f16 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:42:34 +0800 Subject: [PATCH 32/61] Update test for mock token --- test/foundry/unit/TestUSD.t.sol | 48 +++++++++++++++------------------ 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/test/foundry/unit/TestUSD.t.sol b/test/foundry/unit/TestUSD.t.sol index fe3ba8f8..cd1a2480 100644 --- a/test/foundry/unit/TestUSD.t.sol +++ b/test/foundry/unit/TestUSD.t.sol @@ -1,33 +1,29 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; -import {Base_Test} from "../Base.t.sol"; +import "forge-std/Test.sol"; +import {TestUSD} from "src/TestUSD.sol"; -/// @notice Test contract for TestUSD contract. -contract TestUSD_Test is Base_Test { - - function setUp() public override { - super.setUp(); - vm.startPrank(users.contractOwner); - testUSD.mint(users.creator1Address, 10e18); - vm.stopPrank(); - } - - /// @dev Test mint function. - function test_Mint() external { - assertEq(testUSD.balanceOf(users.creator1Address), 10e18); - } +contract TestUSD_UnitTest is Test { + TestUSD internal token; - /// @dev Test TransferFrom function. - function test_TransferFrom() external { - vm.startPrank(users.creator1Address); - testUSD.approve(address(this), 1e18); - vm.stopPrank(); + address internal user = address(0x1234); + uint256 internal mintAmount = 1_000 * 1e18; - bool isSuccess = testUSD.transferFrom(users.creator1Address, users.creator2Address, 1e18); - assert(isSuccess); - assertEq(testUSD.balanceOf(users.creator1Address), 9e18); - assertEq(testUSD.balanceOf(users.creator2Address), 1e18); + function setUp() public { + token = new TestUSD(); } -} + function testMintIncreasesBalance() public { + token.mint(user, mintAmount); + assertEq(token.balanceOf(user), mintAmount); + } + + function testTransferWorks() public { + address recipient = address(0x5678); + token.mint(user, mintAmount); + vm.prank(user); + token.transfer(recipient, 200 * 1e18); + assertEq(token.balanceOf(recipient), 200 * 1e18); + } +} \ No newline at end of file From b467ac0b2da8cba5082a28ba699a07449f04d37e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:43:04 +0800 Subject: [PATCH 33/61] Add unit test for GlobalParams --- test/foundry/unit/GlobalParams.t.sol | 62 ++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/test/foundry/unit/GlobalParams.t.sol b/test/foundry/unit/GlobalParams.t.sol index 3d028e0f..ca4f0608 100644 --- a/test/foundry/unit/GlobalParams.t.sol +++ b/test/foundry/unit/GlobalParams.t.sol @@ -1,27 +1,53 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; -import {Base_Test} from "../Base.t.sol"; +import "forge-std/Test.sol"; +import {GlobalParams} from "src/GlobalParams.sol"; +import {TestUSD} from "src/TestUSD.sol"; -/// @notice Test contract for GlobalParams contract. -contract GlobalParams_Test is Base_Test { +contract GlobalParams_UnitTest is Test { + GlobalParams internal globalParams; + TestUSD internal token; - /// @dev Test GetProtocolAdminAddress function. - function test_GetProtocolAdminAddress() external { - address returnProtocolAdminAddress = globalParams - .getProtocolAdminAddress(); - assertEq(users.protocolAdminAddress, returnProtocolAdminAddress); + address internal admin = address(0xA11CE); + uint256 internal protocolFee = 300; // 3% + + function setUp() public { + token = new TestUSD(); + globalParams = new GlobalParams(admin, address(token), protocolFee); + } + + function testInitialValues() public { + assertEq(globalParams.getProtocolAdminAddress(), admin); + assertEq(globalParams.getTokenAddress(), address(token)); + assertEq(globalParams.getProtocolFeePercent(), protocolFee); + } + + function testSetProtocolAdmin() public { + address newAdmin = address(0xBEEF); + vm.prank(admin); + globalParams.updateProtocolAdminAddress(newAdmin); + assertEq(globalParams.getProtocolAdminAddress(), newAdmin); + } + + function testSetAcceptedToken() public { + address newToken = address(0xDEAD); + vm.prank(admin); + globalParams.updateTokenAddress(newToken); + assertEq(globalParams.getTokenAddress(), newToken); } - /// @dev Test GetTokenAddress function. - function test_GetTokenAddress() external { - address tokenAddress = globalParams.getTokenAddress(); - assertEq(address(testUSD), tokenAddress); + function testSetProtocolFeePercent() public { + vm.prank(admin); + globalParams.updateProtocolFeePercent(500); // 5% + assertEq(globalParams.getProtocolFeePercent(), 500); } - /// @dev Test GetProtocolFeePercent function. - function test_GetProtocolFeePercent() external { - uint256 returnProtocolFeePercent = globalParams.getProtocolFeePercent(); - assertEq(PROTOCOL_FEE_PERCENT, returnProtocolFeePercent); + function testUnauthorizedSettersRevert() public { + vm.expectRevert(); + globalParams.updateProtocolFeePercent(1000); + + vm.expectRevert(); + globalParams.updateTokenAddress(address(0xBEEF)); } -} +} \ No newline at end of file From 153da0e90e789db06f9c2552a38ac49bad687b8c Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:43:28 +0800 Subject: [PATCH 34/61] Add unit tests for CampaignInfoFactory --- test/foundry/unit/CampaignInfoFactory.t.sol | 111 ++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 test/foundry/unit/CampaignInfoFactory.t.sol diff --git a/test/foundry/unit/CampaignInfoFactory.t.sol b/test/foundry/unit/CampaignInfoFactory.t.sol new file mode 100644 index 00000000..32a6d313 --- /dev/null +++ b/test/foundry/unit/CampaignInfoFactory.t.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import {CampaignInfoFactory} from "src/CampaignInfoFactory.sol"; +import {GlobalParams} from "src/GlobalParams.sol"; +import {TreasuryFactory} from "src/TreasuryFactory.sol"; +import {TestUSD} from "src/TestUSD.sol"; +import {Defaults} from "../Base.t.sol"; +import {ICampaignData} from "src/interfaces/ICampaignData.sol"; +import {CampaignInfo} from "src/CampaignInfo.sol"; + +contract CampaignInfoFactory_UnitTest is Test, Defaults { + CampaignInfoFactory internal factory; + TreasuryFactory internal treasuryFactory; + GlobalParams internal globalParams; + TestUSD internal testUSD; + CampaignInfo internal campaignInfoImplementation; + + address internal admin = address(0xA11CE); + + function setUp() public { + + testUSD = new TestUSD(); + globalParams = new GlobalParams( + admin, + address(testUSD), + PROTOCOL_FEE_PERCENT + ); + campaignInfoImplementation = new CampaignInfo(address(this)); + treasuryFactory = new TreasuryFactory(globalParams); + factory = new CampaignInfoFactory(globalParams, address(campaignInfoImplementation)); + vm.startPrank(admin); + globalParams.enlistPlatform( + PLATFORM_1_HASH, + admin, + PLATFORM_FEE_PERCENT + ); + vm.stopPrank(); + } + + function testInitializeSetsTreasuryAndGlobalParams() public { + // vm.startPrank(address(this)); // this is owner + + factory._initialize(address(treasuryFactory), address(globalParams)); + // Success assumed if no revert + // vm.stopPrank(); + } + + + function testCreateCampaignDeploysSuccessfully() public { + factory._initialize(address(treasuryFactory), address(globalParams)); + + bytes32[] memory platforms = new bytes32[](1); + platforms[0] = PLATFORM_1_HASH; + + bytes32[] memory keys = new bytes32[](0); + bytes32[] memory values = new bytes32[](0); + + address creator = address(0xBEEF); + + vm.startPrank(admin); + vm.recordLogs(); + + factory.createCampaign( + creator, + CAMPAIGN_1_IDENTIFIER_HASH, + platforms, + keys, + values, + CAMPAIGN_DATA + ); + + Vm.Log[] memory logs = vm.getRecordedLogs(); + vm.stopPrank(); + + // Check logs emitted + assertGt(logs.length, 0, "Expected at least one log"); + + // Decode expected event + bytes32 eventSig = keccak256( + "CampaignInfoFactoryCampaignCreated(bytes32,address)" + ); + bool found = false; + address campaignAddr; + + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == eventSig) { + // topics[2] is the address (indexed), cast from bytes32 + campaignAddr = address(uint160(uint256(logs[i].topics[2]))); + found = true; + break; + } + } + + require(found, "CampaignCreated event not found"); + assertTrue(campaignAddr != address(0), "Invalid campaign address"); + + // Check that campaign was stored in mapping + address storedCampaign = factory.identifierToCampaignInfo( + CAMPAIGN_1_IDENTIFIER_HASH + ); + assertEq(storedCampaign, campaignAddr, "Stored campaign doesn't match"); + + // Check that it's valid + assertTrue( + factory.isValidCampaignInfo(campaignAddr), + "Campaign not marked valid" + ); + } +} From b221ccb9768f4eda622ff101e0c349b54529ad36 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:44:11 +0800 Subject: [PATCH 35/61] Update Base test configurations --- test/foundry/Base.t.sol | 53 ++++++++++++++++++++++---------- test/foundry/utils/Constants.sol | 4 +-- test/foundry/utils/Types.sol | 4 +-- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/test/foundry/Base.t.sol b/test/foundry/Base.t.sol index 8fc29961..a1c21181 100644 --- a/test/foundry/Base.t.sol +++ b/test/foundry/Base.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; import "forge-std/Test.sol"; import {Users} from "./utils/Types.sol"; @@ -9,10 +9,10 @@ import {GlobalParams} from "src/GlobalParams.sol"; import {CampaignInfoFactory} from "src/CampaignInfoFactory.sol"; import {CampaignInfo} from "src/CampaignInfo.sol"; import {TreasuryFactory} from "src/TreasuryFactory.sol"; +import {AllOrNothing} from "src/treasuries/AllOrNothing.sol"; /// @notice Base test contract with common logic needed by all tests. abstract contract Base_Test is Test, Defaults { - //Variables Users internal users; @@ -21,9 +21,10 @@ abstract contract Base_Test is Test, Defaults { GlobalParams internal globalParams; CampaignInfoFactory internal campaignInfoFactory; TreasuryFactory internal treasuryFactory; + AllOrNothing internal allOrNothingImplementation; + CampaignInfo internal campaignInfo; - function setUp() public virtual { - + function setUp() public virtual { // Create users for testing. users = Users({ contractOwner: createUser("ContractOwner"), @@ -36,30 +37,48 @@ abstract contract Base_Test is Test, Defaults { backer2Address: createUser("Backer2Address") }); - vm.startPrank(users.contractOwner); // Deploy the base test contracts. testUSD = new TestUSD(); - globalParams = new GlobalParams(users.protocolAdminAddress, address(testUSD), PROTOCOL_FEE_PERCENT); - campaignInfoFactory = new CampaignInfoFactory(globalParams); - bytes32 bytecodeHash = keccak256(type(CampaignInfo).creationCode); - treasuryFactory = new TreasuryFactory(globalParams, address(campaignInfoFactory), bytecodeHash); + globalParams = new GlobalParams( + users.protocolAdminAddress, + address(testUSD), + PROTOCOL_FEE_PERCENT + ); + + campaignInfo = new CampaignInfo(address(this)); + console.log("CampaignInfo address: ", address(campaignInfo)); + campaignInfoFactory = new CampaignInfoFactory(globalParams, address(campaignInfo)); + treasuryFactory = new TreasuryFactory(globalParams); //Initialize campaignInfoFactory - campaignInfoFactory._initialize(address(treasuryFactory), address(globalParams)); + campaignInfoFactory._initialize( + address(treasuryFactory), + address(globalParams) + ); + allOrNothingImplementation = new AllOrNothing(); //Mint token to the backer testUSD.mint(users.backer1Address, TOKEN_MINT_AMOUNT); testUSD.mint(users.backer2Address, TOKEN_MINT_AMOUNT); vm.stopPrank(); - // Label the base test contracts. - vm.label({ account: address(testUSD), newLabel: "TestUSD" }); - vm.label({ account: address(globalParams), newLabel: "Global Parameter" }); - vm.label({ account: address(campaignInfoFactory), newLabel: "Campaign Info Factory" }); - vm.label({ account: address(treasuryFactory), newLabel: "Treasury Factory" }); + // Label the base test contracts. + vm.label({account: address(testUSD), newLabel: "TestUSD"}); + vm.label({ + account: address(globalParams), + newLabel: "Global Parameter" + }); + vm.label({ + account: address(campaignInfoFactory), + newLabel: "Campaign Info Factory" + }); + vm.label({ + account: address(treasuryFactory), + newLabel: "Treasury Factory" + }); // Warp to October 1, 2023 at 00:00 GMT to provide a more realistic testing environment. vm.warp(OCTOBER_1_2023); @@ -68,7 +87,7 @@ abstract contract Base_Test is Test, Defaults { /// @dev Generates a user, labels its address, and funds it with test assets. function createUser(string memory name) internal returns (address payable) { address payable user = payable(makeAddr(name)); - vm.deal({ account: user, newBalance: 100 ether }); + vm.deal({account: user, newBalance: 100 ether}); return user; } -} \ No newline at end of file +} diff --git a/test/foundry/utils/Constants.sol b/test/foundry/utils/Constants.sol index 34cf077b..bf7e111e 100644 --- a/test/foundry/utils/Constants.sol +++ b/test/foundry/utils/Constants.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; abstract contract Constants { uint40 internal constant OCTOBER_1_2023 = 1_696_118_400; uint40 internal constant MAX_UNIX_TIMESTAMP = 2_147_483_647; // 2^31 - 1 -} \ No newline at end of file +} diff --git a/test/foundry/utils/Types.sol b/test/foundry/utils/Types.sol index 3d5f463b..df4b5ffc 100644 --- a/test/foundry/utils/Types.sol +++ b/test/foundry/utils/Types.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; struct Users { // Default owner for all contracts. @@ -18,4 +18,4 @@ struct Users { address payable backer1Address; // Backer-2 Address. address payable backer2Address; -} \ No newline at end of file +} From 56c0420a9170a9bae82585ac2a2b48f17201e64d Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:45:44 +0800 Subject: [PATCH 36/61] Upgrade test helper for reusing in all tests --- .../AllOrNothing/AllOrNothing.t.sol | 350 +++++++++++------- 1 file changed, 206 insertions(+), 144 deletions(-) diff --git a/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol b/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol index 707fc0e1..e10ef774 100644 --- a/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol +++ b/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol @@ -2,19 +2,22 @@ pragma solidity ^0.8.13; import {Base_Test} from "../../Base.t.sol"; -import {BytesSplitter} from "../../utils/BytesSplitter.sol"; import "forge-std/Vm.sol"; import "forge-std/console.sol"; +import "src/CampaignInfo.sol"; import {AllOrNothing} from "src/treasuries/AllOrNothing.sol"; +import {CampaignInfo} from "src/CampaignInfo.sol"; +import {IReward} from "src/interfaces/IReward.sol"; +import {LogDecoder} from "../../utils/LogDecoder.sol"; /// @notice Common testing logic needed by all AllOrNothing integration tests. abstract contract AllOrNothing_Integration_Shared_Test is - Base_Test, - BytesSplitter + IReward, + LogDecoder, + Base_Test { address campaignAddress; address treasuryAddress; - AllOrNothing internal allOrNothing; uint256 pledgeForARewardTokenId; @@ -22,94 +25,67 @@ abstract contract AllOrNothing_Integration_Shared_Test is /// @dev Initial dependent functions setup included for AllOrNothing Integration Tests. function setUp() public virtual override { super.setUp(); + console.log("setUp: enlistPlatform"); //Enlist Platform - enlistPlatform(PLATFORM_1_BYTES); + enlistPlatform(PLATFORM_1_HASH); + console.log("enlisted platform"); - //Add Byte code chunks - addBytecode(PLATFORM_1_BYTES, TREASURY_BYTE_CODE_INDEX); + registerTreasuryImplementation(PLATFORM_1_HASH); + console.log("registered treasury"); - //Enlist Bytecode - enlistBytecode(PLATFORM_1_BYTES, TREASURY_BYTE_CODE_INDEX); + approveTreasuryImplementation(PLATFORM_1_HASH); + console.log("approved treasury"); //Create Campaign - createCampaign(PLATFORM_1_BYTES); + createCampaign(PLATFORM_1_HASH); + console.log("created campaign"); //Deploy Treasury Contract - deploy(PLATFORM_1_BYTES, TREASURY_BYTE_CODE_INDEX); - - allOrNothing = AllOrNothing(treasuryAddress); + deploy(PLATFORM_1_HASH); + console.log("deployed treasury"); } /** * @notice Implements enlistPlatform helper function. - * @param platformBytes The platform bytes. + * @param platformHash The platform bytes. */ - function enlistPlatform(bytes32 platformBytes) internal { - vm.startPrank(users.contractOwner); + function enlistPlatform(bytes32 platformHash) internal { + vm.startPrank(users.protocolAdminAddress); globalParams.enlistPlatform( - platformBytes, + platformHash, users.platform1AdminAddress, PLATFORM_FEE_PERCENT ); vm.stopPrank(); } - /** - * @notice Implements addBytecode helper function. - * @param platformBytes The platform bytes. - * @param bytecodeIndex The bytecode index. - */ - function addBytecode(bytes32 platformBytes, uint256 bytecodeIndex) internal { - //Splitting Treasury Bytecode into 2 chunks - bytes memory bytesCode = vm.getCode("AllOrNothing.sol:AllOrNothing"); - (bytes memory chunk1, bytes memory chunk2) = splitBytesIntoTwo( - bytesCode - ); - + function registerTreasuryImplementation(bytes32 platformHash) internal { vm.startPrank(users.platform1AdminAddress); - treasuryFactory.addBytecodeChunk( - platformBytes, - bytecodeIndex, + treasuryFactory.registerTreasuryImplementation( + platformHash, 0, - false, - chunk1 - ); - treasuryFactory.addBytecodeChunk( - platformBytes, - bytecodeIndex, - 1, - true, - chunk2 + address(allOrNothingImplementation) ); vm.stopPrank(); } - /** - * @notice Implements enlistBytecode helper function. - * @param platformBytes The platform bytes. - * @param bytecodeIndex The bytecode index. - */ - function enlistBytecode( - bytes32 platformBytes, - uint256 bytecodeIndex - ) internal { + function approveTreasuryImplementation(bytes32 platformHash) internal { vm.startPrank(users.protocolAdminAddress); - treasuryFactory.enlistBytecode(platformBytes, bytecodeIndex); + treasuryFactory.approveTreasuryImplementation(platformHash, 0); vm.stopPrank(); } /** * @notice Implements createCampaign helper function. It creates new campaign info contract - * @param platformBytes The platform bytes. + * @param platformHash The platform bytes. */ - function createCampaign(bytes32 platformBytes) internal { - - bytes32 identifierHash = keccak256(abi.encodePacked(platformBytes)); - bytes32[] memory selectedPlatformBytes = new bytes32[](1); + function createCampaign(bytes32 platformHash) internal { + bytes32 identifierHash = keccak256(abi.encodePacked(platformHash)); + bytes32[] memory selectedPlatformHash = new bytes32[](1); bytes32[] memory platformDataKey; bytes32[] memory platformDataValue; - selectedPlatformBytes[0] = platformBytes; + selectedPlatformHash[0] = platformHash; vm.startPrank(users.creator1Address); vm.recordLogs(); @@ -117,172 +93,258 @@ abstract contract AllOrNothing_Integration_Shared_Test is campaignInfoFactory.createCampaign( users.creator1Address, identifierHash, - selectedPlatformBytes, + selectedPlatformHash, platformDataKey, platformDataValue, CAMPAIGN_DATA ); Vm.Log[] memory entries = vm.getRecordedLogs(); - - campaignAddress = address(uint160(uint(entries[2].topics[2]))); vm.stopPrank(); - } - /** - * @notice Implements deploy helper function. It deploys treasury contract. - * @param platformBytes The platform bytes. - * @param bytecodeIndex The bytecode index. - */ - function deploy( - bytes32 platformBytes, - uint256 bytecodeIndex - ) internal { - vm.startPrank(users.platform1AdminAddress); - vm.recordLogs(); - treasuryFactory.deploy(platformBytes, bytecodeIndex, campaignAddress); + (bytes32[] memory topics, ) = decodeTopicsAndData( + entries, + "CampaignInfoFactoryCampaignCreated(bytes32,address)", + address(campaignInfoFactory) + ); - Vm.Log[] memory entries = vm.getRecordedLogs(); + require(topics.length == 3, "Unexpected topic length for event"); - treasuryAddress = address(uint160(uint(abi.decode(entries[1].data, (bytes32))))); - vm.stopPrank(); - } + campaignAddress = address(uint160(uint256(topics[2]))); + } /** - * @notice Implements addReward helper function. + * @notice Implements deploy helper function. It deploys treasury contract. */ - function addReward() internal returns(Vm.Log[] memory) { - - vm.startPrank(users.creator1Address); + function deploy(bytes32 platformHash) internal { + vm.startPrank(users.platform1AdminAddress); vm.recordLogs(); - allOrNothing.addReward(REWARD_NAME_1_BYTES, REWARD1); + // Deploy the treasury contract + treasuryFactory.deploy(platformHash, campaignAddress, 0, NAME, SYMBOL); Vm.Log[] memory entries = vm.getRecordedLogs(); - vm.stopPrank(); - return entries; - } - - /** - * @notice Implements pledgeOnPreLaunch helper function. - */ - function pledgeOnPreLaunch() internal returns(Vm.Log[] memory) { - vm.startPrank(users.backer1Address); - vm.recordLogs(); + // Decode the TreasuryDeployed event + (bytes32[] memory topics, bytes memory data) = decodeTopicsAndData( + entries, + "TreasuryFactoryTreasuryDeployed(bytes32,uint256,address,address)", + address(treasuryFactory) + ); - //Increase Allowance to the AllOrNothing Contract - testUSD.increaseAllowance(treasuryAddress, PRE_LAUNCH_PLEDGE_AMOUNT); + require(topics.length >= 3, "Expected indexed params missing"); - allOrNothing.pledgeOnPreLaunch(users.backer1Address); + // treasuryAddress is in data, campaignAddress is in topics[2] (but we already know it) + treasuryAddress = abi.decode(data, (address)); - Vm.Log[] memory entries = vm.getRecordedLogs(); + allOrNothing = AllOrNothing(treasuryAddress); + } + function addReward( + address caller, + address treasury, + bytes32 rewardName, + Reward memory reward + ) internal { + vm.startPrank(caller); + allOrNothing.addReward(rewardName, reward); vm.stopPrank(); + } - return entries; + function addRewardsBatch( + address caller, + address treasury, + bytes32[] memory rewardNames, + Reward[] memory rewards + ) internal { + vm.startPrank(caller); + AllOrNothing(treasury).addRewardsBatch(rewardNames, rewards); + vm.stopPrank(); } /** * @notice Implements pledgeForAReward helper function. */ - function pledgeForAReward() internal returns (Vm.Log[] memory) { - - vm.startPrank(users.backer1Address); + function pledgeForAReward( + address caller, + address token, + address allOrNothingAddress, + uint256 pledgeAmount, + uint256 shippingFee, + uint256 launchTime, + bytes32 rewardName + ) + internal + returns ( + Vm.Log[] memory logs, + uint256 tokenId, + bytes32[] memory rewards + ) + { + vm.startPrank(caller); vm.recordLogs(); - //Increase Allowance to the AllOrNothing Contract - testUSD.increaseAllowance(treasuryAddress, PLEDGE_AMOUNT); - - vm.warp(LAUNCH_TIME); + testUSD.approve(allOrNothingAddress, pledgeAmount + shippingFee); + vm.warp(launchTime); bytes32[] memory reward = new bytes32[](1); - reward[0] = REWARD_NAME_1_BYTES; - allOrNothing.pledgeForAReward(users.backer1Address, reward); + reward[0] = rewardName; - Vm.Log[] memory entries = vm.getRecordedLogs(); + AllOrNothing(allOrNothingAddress).pledgeForAReward( + caller, + shippingFee, + reward + ); - uint256 pledgeAmount; - uint256 tokenId; - bool isPreLaunchPledge; - bytes32[] memory rewards; + logs = vm.getRecordedLogs(); - (pledgeAmount, tokenId, isPreLaunchPledge, rewards) = abi.decode(entries[4].data, (uint256,uint256,bool,bytes32[])); + bytes memory data = decodeEventFromLogs( + logs, + "Receipt(address,bytes32,uint256,uint256,uint256,bytes32[])", + allOrNothingAddress + ); - pledgeForARewardTokenId = tokenId; + // (, tokenId, rewards) = abi.decode(data, (uint256, uint256, bytes32[])); + (, , tokenId, rewards) = abi.decode( + data, + (uint256, uint256, uint256, bytes32[]) + ); vm.stopPrank(); - - return entries; } /** * @notice Implements pledgeWithoutAReward helper function. */ - function pledgeWithoutAReward() internal returns(Vm.Log[] memory) { - - vm.startPrank(users.backer1Address); + function pledgeWithoutAReward( + address caller, + address token, + address allOrNothingAddress, + uint256 pledgeAmount, + uint256 launchTime + ) internal returns (Vm.Log[] memory logs, uint256 tokenId) { + vm.startPrank(caller); vm.recordLogs(); - //Increase Allowance to the AllOrNothing Contract - testUSD.increaseAllowance(treasuryAddress, PLEDGE_AMOUNT); + testUSD.approve(allOrNothingAddress, pledgeAmount); + vm.warp(launchTime); - allOrNothing.pledgeWithoutAReward(users.backer1Address, PLEDGE_AMOUNT); + AllOrNothing(allOrNothingAddress).pledgeWithoutAReward( + caller, + pledgeAmount + ); - Vm.Log[] memory entries = vm.getRecordedLogs(); + logs = vm.getRecordedLogs(); - vm.stopPrank(); + // Decode receipt event if available + bytes memory data = decodeEventFromLogs( + logs, + "Receipt(address,bytes32,uint256,uint256,uint256,bytes32[])", + allOrNothingAddress + ); - return entries; + (, , tokenId, ) = abi.decode( + data, + (uint256, uint256, uint256, bytes32[]) + ); + vm.stopPrank(); } /** * @notice Implements claimRefund helper function. */ - function claimRefund() internal returns(Vm.Log[] memory) { - - vm.startPrank(users.backer1Address); + function claimRefund( + address caller, + address allOrNothingAddress, + uint256 tokenId + ) + internal + returns ( + Vm.Log[] memory logs, + uint256 refundedTokenId, + uint256 refundAmount, + address claimer + ) + { + vm.startPrank(caller); vm.recordLogs(); - //Approve NFT Burn to the AllOrNothing Contract - allOrNothing.approve(address(allOrNothing), pledgeForARewardTokenId); + AllOrNothing(allOrNothingAddress).claimRefund(tokenId); - allOrNothing.claimRefund(pledgeForARewardTokenId); + logs = vm.getRecordedLogs(); - Vm.Log[] memory entries = vm.getRecordedLogs(); + bytes memory data = decodeEventFromLogs( + logs, + "RefundClaimed(uint256,uint256,address)", + allOrNothingAddress + ); - vm.stopPrank(); + (refundedTokenId, refundAmount, claimer) = abi.decode( + data, + (uint256, uint256, address) + ); - return entries; + vm.stopPrank(); } /** * @notice Implements disburseFees helper function. */ - function disburseFees() internal returns(Vm.Log[] memory) { - + function disburseFees( + address allOrNothingAddress, + uint256 warpTime + ) + internal + returns ( + Vm.Log[] memory logs, + uint256 protocolShare, + uint256 platformShare + ) + { + vm.warp(warpTime); vm.recordLogs(); - allOrNothing.disburseFees(); + AllOrNothing(allOrNothingAddress).disburseFees(); - Vm.Log[] memory entries = vm.getRecordedLogs(); + logs = vm.getRecordedLogs(); + + bytes memory data = decodeEventFromLogs( + logs, + "FeesDisbursed(uint256,uint256)", + allOrNothingAddress + ); - return entries; + (protocolShare, platformShare) = abi.decode(data, (uint256, uint256)); } /** * @notice Implements withdraw helper function. */ - function withdraw() internal returns(Vm.Log[] memory) { - + function withdraw( + address allOrNothingAddress, + uint256 warpTime + ) internal returns (Vm.Log[] memory logs, address to, uint256 amount) { + vm.warp(warpTime); + // Start recording logs and simulate the withdrawal process vm.recordLogs(); - allOrNothing.withdraw(); + // Execute withdraw function in the contract + AllOrNothing(allOrNothingAddress).withdraw(); - Vm.Log[] memory entries = vm.getRecordedLogs(); + // Capture the logs from the transaction + logs = vm.getRecordedLogs(); - return entries; - } + // Decode the data from the logs + bytes memory data = decodeEventFromLogs( + logs, + "WithdrawalSuccessful(address,uint256)", + allOrNothingAddress + ); + // Decode the amount and the address of the receiver + (to, amount) = abi.decode(data, (address, uint256)); + + return (logs, to, amount); + } } From 90294af96bbe452ecc01a93d8ad9e57ec2d86b90 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:46:09 +0800 Subject: [PATCH 37/61] Add integration test for AllOrNothing --- .../AllOrNothing/AllOrNothingFunction.t.sol | 318 +++++++++++------- 1 file changed, 198 insertions(+), 120 deletions(-) diff --git a/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol b/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol index 09793330..c19d46b6 100644 --- a/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol +++ b/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol @@ -1,143 +1,221 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity ^0.8.20; -import {AllOrNothing_Integration_Shared_Test} from "./AllOrNothing.t.sol"; +import "./AllOrNothing.t.sol"; import "forge-std/console.sol"; import "forge-std/Vm.sol"; -import {AllOrNothing} from "src/treasuries/AllOrNothing.sol"; - -/// @notice Integration Test contract for AllOrNothing contract. -contract AllOrNothingFunction_Integration_Shared_Test is AllOrNothing_Integration_Shared_Test { - - /// @dev Test addReward function. - function test_addReward() external { - - addReward(); - - AllOrNothing.Reward memory resultReward = allOrNothing.getReward(REWARD_NAME_1_BYTES); - - assertEq(REWARD1.rewardValue, resultReward.rewardValue); - assertEq(REWARD1.isRewardTier, resultReward.isRewardTier); - assertEq(REWARD1.itemId[0], resultReward.itemId[0]); - assertEq(REWARD1.itemValue, resultReward.itemValue); - assertEq(REWARD1.itemQuantity, resultReward.itemQuantity); +import "forge-std/Test.sol"; +import {Defaults} from "../../utils/Defaults.sol"; +import {Constants} from "../../utils/Constants.sol"; +import {Users} from "../../utils/Types.sol"; +import {IReward} from "src/interfaces/IReward.sol"; + +contract AllOrNothingFunction_Integration_Shared_Test is + AllOrNothing_Integration_Shared_Test +{ + function test_addRewardsBatch() external { + addRewardsBatch( + users.creator1Address, + address(allOrNothing), + REWARD_NAMES, + REWARDS + ); + + // Verify all rewards were added correctly + // First reward + Reward memory resultReward1 = allOrNothing.getReward(REWARD_NAMES[0]); + assertEq(REWARDS[0].rewardValue, resultReward1.rewardValue); + assertEq(REWARDS[0].isRewardTier, resultReward1.isRewardTier); + assertEq(REWARDS[0].itemId[0], resultReward1.itemId[0]); + assertEq(REWARDS[0].itemValue[0], resultReward1.itemValue[0]); + assertEq(REWARDS[0].itemQuantity[0], resultReward1.itemQuantity[0]); + + // Second reward + Reward memory resultReward2 = allOrNothing.getReward(REWARD_NAMES[1]); + assertEq(REWARDS[1].rewardValue, resultReward2.rewardValue); + assertEq(REWARDS[1].isRewardTier, resultReward2.isRewardTier); + assertEq(REWARDS[1].itemId.length, resultReward2.itemId.length); + assertEq(REWARDS[1].itemId[0], resultReward2.itemId[0]); + assertEq(REWARDS[1].itemId[1], resultReward2.itemId[1]); + assertEq(REWARDS[1].itemValue[0], resultReward2.itemValue[0]); + assertEq(REWARDS[1].itemValue[1], resultReward2.itemValue[1]); + assertEq(REWARDS[1].itemQuantity[0], resultReward2.itemQuantity[0]); + assertEq(REWARDS[1].itemQuantity[1], resultReward2.itemQuantity[1]); + + // Third reward + Reward memory resultReward3 = allOrNothing.getReward(REWARD_NAMES[2]); + assertEq(REWARDS[2].rewardValue, resultReward3.rewardValue); + assertEq(REWARDS[2].isRewardTier, resultReward3.isRewardTier); + assertEq(REWARDS[2].itemId.length, resultReward3.itemId.length); } - /// @dev Test pledgeOnPreLaunch function. - function test_pledgeOnPreLaunch() external { - - addReward(); - pledgeOnPreLaunch(); - - uint256 backerBalance = testUSD.balanceOf(users.backer1Address); - uint256 treasuryBalance = testUSD.balanceOf(address(allOrNothing)); - uint256 backerNftBalance = allOrNothing.balanceOf(users.backer1Address); - address nftOwnerAddress = allOrNothing.ownerOf(1); - - assertEq(users.backer1Address, nftOwnerAddress); - assertEq(PRE_LAUNCH_PLEDGE_AMOUNT, TOKEN_MINT_AMOUNT-backerBalance); - assertEq(PRE_LAUNCH_PLEDGE_AMOUNT, treasuryBalance); - assertEq(1, backerNftBalance); - } - - /// @dev Test pledgeForAReward function. function test_pledgeForAReward() external { - - addReward(); - pledgeOnPreLaunch(); - pledgeForAReward(); + addRewardsBatch( + users.creator1Address, + address(allOrNothing), + REWARD_NAMES, + REWARDS + ); + + ( + Vm.Log[] memory logs, + uint256 tokenId, + bytes32[] memory rewards + ) = pledgeForAReward( + users.backer1Address, + address(testUSD), + address(allOrNothing), + PLEDGE_AMOUNT, + SHIPPING_FEE, + LAUNCH_TIME, + REWARD_NAME_1_HASH + ); uint256 backerBalance = testUSD.balanceOf(users.backer1Address); uint256 treasuryBalance = testUSD.balanceOf(address(allOrNothing)); uint256 backerNftBalance = allOrNothing.balanceOf(users.backer1Address); - - address nftOwnerAddress = allOrNothing.ownerOf(2); + address nftOwnerAddress = allOrNothing.ownerOf(pledgeForARewardTokenId); assertEq(users.backer1Address, nftOwnerAddress); - assertEq(PLEDGE_AMOUNT, TOKEN_MINT_AMOUNT - backerBalance - PRE_LAUNCH_PLEDGE_AMOUNT); - assertEq(PLEDGE_AMOUNT, treasuryBalance - PRE_LAUNCH_PLEDGE_AMOUNT); - assertEq(2, backerNftBalance); - - } - - /// @dev Test pledgeWithoutAReward function. - function test_pledgeWithoutAReward() external { - - addReward(); - pledgeOnPreLaunch(); - pledgeForAReward(); - Vm.Log[] memory entries = pledgeWithoutAReward(); - - address resultBacker = address(uint160(uint(entries[3].topics[1]))); - - uint256 pledgeAmount; - uint256 tokenId; - bool isPreLaunchPledge; - bytes32[] memory rewards; - - (pledgeAmount, tokenId, isPreLaunchPledge, rewards) = abi.decode(entries[3].data, (uint256,uint256,bool,bytes32[])); - - assertEq(users.backer1Address, resultBacker); - assertEq(PLEDGE_AMOUNT, pledgeAmount); - assertEq(false, isPreLaunchPledge); + assertEq(PLEDGE_AMOUNT + SHIPPING_FEE, treasuryBalance); + assertEq(1, backerNftBalance); } - /// @dev Test claimRefund function. function test_claimRefund() external { - - addReward(); - pledgeOnPreLaunch(); - pledgeForAReward(); - pledgeWithoutAReward(); - Vm.Log[] memory entries = claimRefund(); - - uint256 refundAmount; - uint256 tokenId; - address claimer; - - (tokenId, refundAmount, claimer) = abi.decode(entries[4].data, (uint256,uint256,address)); - - assertEq(pledgeForARewardTokenId, tokenId); - assertEq(PLEDGE_AMOUNT, refundAmount); - assertEq(users.backer1Address, claimer); + addRewardsBatch( + users.creator1Address, + address(allOrNothing), + REWARD_NAMES, + REWARDS + ); + + (, uint256 rewardTokenId, ) = pledgeForAReward( + users.backer1Address, + address(testUSD), + address(allOrNothing), + PLEDGE_AMOUNT, + SHIPPING_FEE, + LAUNCH_TIME, + REWARD_NAME_1_HASH + ); + + (, uint256 tokenId) = pledgeWithoutAReward( + users.backer1Address, + address(testUSD), + address(allOrNothing), + PLEDGE_AMOUNT, + LAUNCH_TIME + ); + + ( + Vm.Log[] memory refundLogs, + uint256 refundedTokenId, + uint256 refundAmount, + address claimer + ) = claimRefund(users.backer1Address, address(allOrNothing), tokenId); + + assertEq(refundedTokenId, tokenId); + assertEq(refundAmount, PLEDGE_AMOUNT); + assertEq(claimer, users.backer1Address); } - /// @dev Test disburseFees function. function test_disburseFees() external { - - addReward(); - pledgeOnPreLaunch(); - pledgeForAReward(); - pledgeWithoutAReward(); - claimRefund(); - Vm.Log[] memory entries = disburseFees(); - - uint256 protocolShare; - uint256 platformShare; - - (protocolShare, platformShare) = abi.decode(entries[2].data, (uint256,uint256)); - - assertEq(2_002e17, protocolShare); - assertEq(1_001e17, platformShare); + addRewardsBatch( + users.creator1Address, + address(allOrNothing), + REWARD_NAMES, + REWARDS + ); + + pledgeForAReward( + users.backer1Address, + address(testUSD), + address(allOrNothing), + PLEDGE_AMOUNT, + SHIPPING_FEE, + LAUNCH_TIME, + REWARD_NAME_1_HASH + ); + pledgeWithoutAReward( + users.backer2Address, + address(testUSD), + address(allOrNothing), + GOAL_AMOUNT, + LAUNCH_TIME + ); + + uint256 totalPledged = GOAL_AMOUNT + PLEDGE_AMOUNT; + + ( + Vm.Log[] memory logs, + uint256 protocolShare, + uint256 platformShare + ) = disburseFees(address(allOrNothing), DEADLINE); + + uint256 expectedProtocolShare = (totalPledged * PROTOCOL_FEE_PERCENT) / + PERCENT_DIVIDER; + uint256 expectedPlatformShare = (totalPledged * PLATFORM_FEE_PERCENT) / + PERCENT_DIVIDER; + + assertEq( + protocolShare, + expectedProtocolShare, + "Incorrect protocol fee" + ); + assertEq( + platformShare, + expectedPlatformShare, + "Incorrect platform fee" + ); } - /// @dev Test withdraw function. function test_withdraw() external { - - addReward(); - pledgeOnPreLaunch(); - pledgeForAReward(); - pledgeWithoutAReward(); - claimRefund(); - disburseFees(); - Vm.Log[] memory entries = withdraw(); - - address to = address(uint160(uint(entries[1].topics[1]))); - uint256 amount; - - (amount) = abi.decode(entries[1].data, (uint256)); - - assertEq(users.creator1Address, to); - assertEq(7_007e17, amount); + addRewardsBatch( + users.creator1Address, + address(allOrNothing), + REWARD_NAMES, + REWARDS + ); + + pledgeForAReward( + users.backer1Address, + address(testUSD), + address(allOrNothing), + PLEDGE_AMOUNT, + SHIPPING_FEE, + LAUNCH_TIME, + REWARD_NAME_1_HASH + ); + pledgeWithoutAReward( + users.backer2Address, + address(testUSD), + address(allOrNothing), + GOAL_AMOUNT, + LAUNCH_TIME + ); + + uint256 totalPledged = GOAL_AMOUNT + PLEDGE_AMOUNT; + disburseFees(address(allOrNothing), DEADLINE); + + (Vm.Log[] memory logs, address to, uint256 amount) = withdraw( + address(allOrNothing), + DEADLINE + ); + + uint256 protocolShare = (totalPledged * PROTOCOL_FEE_PERCENT) / + PERCENT_DIVIDER; + uint256 platformShare = (totalPledged * PLATFORM_FEE_PERCENT) / + PERCENT_DIVIDER; + uint256 expectedAmount = totalPledged + + SHIPPING_FEE - + protocolShare - + platformShare; + + assertEq( + to, + users.creator1Address, + "Incorrect address receiving the funds" + ); + assertEq(amount, expectedAmount, "Incorrect withdrawal amount"); } -} \ No newline at end of file +} From 546f816b7b3a3e61c23f1cf2a0004d3692714e6d Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:47:00 +0800 Subject: [PATCH 38/61] Add base deployment functions --- script/lib/DeployBase.s.sol | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 script/lib/DeployBase.s.sol diff --git a/script/lib/DeployBase.s.sol b/script/lib/DeployBase.s.sol new file mode 100644 index 00000000..14ed974b --- /dev/null +++ b/script/lib/DeployBase.s.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import "forge-std/Script.sol"; + +contract DeployBase is Script { + function deployOrUse( + string memory envVar, + function() internal returns (address) deployFn + ) internal returns (address deployedOrExisting) { + address existing = vm.envOr(envVar, address(0)); + if (existing != address(0)) { + console2.log(envVar, "Using existing contract at:", existing); + return existing; + } + + deployedOrExisting = deployFn(); + console2.log(envVar, "Deployed new contract at:", deployedOrExisting); + } +} From f576381f76d0084f5363df109baa7922bc23bd34 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:47:32 +0800 Subject: [PATCH 39/61] Add deployment script for TreasuryFactory --- script/DeployTreasuryFactory.s.sol | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 script/DeployTreasuryFactory.s.sol diff --git a/script/DeployTreasuryFactory.s.sol b/script/DeployTreasuryFactory.s.sol new file mode 100644 index 00000000..068cb9ac --- /dev/null +++ b/script/DeployTreasuryFactory.s.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import {TreasuryFactory} from "../src/TreasuryFactory.sol"; +import {GlobalParams} from "../src/GlobalParams.sol"; +import {DeployBase} from "./lib/DeployBase.s.sol"; + +contract DeployTreasuryFactory is DeployBase { + function deploy(address _globalParams) public returns (address) { + require(_globalParams != address(0), "GlobalParams not set"); + return address(new TreasuryFactory(GlobalParams(_globalParams))); + } + + function run() external { + address globalParams = vm.envOr("GLOBAL_PARAMS_ADDRESS", address(0)); + require(globalParams != address(0), "GlobalParams must be set"); + + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); + deploy(globalParams); + vm.stopBroadcast(); + } +} \ No newline at end of file From eec1f4afd1b7284d4c8936394975bb01be62d437 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:47:46 +0800 Subject: [PATCH 40/61] Add deployment script for CampaignInfoFactory --- script/DeployCampaignInfoFactory.s.sol | 47 ++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 script/DeployCampaignInfoFactory.s.sol diff --git a/script/DeployCampaignInfoFactory.s.sol b/script/DeployCampaignInfoFactory.s.sol new file mode 100644 index 00000000..6fc116d0 --- /dev/null +++ b/script/DeployCampaignInfoFactory.s.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import {CampaignInfo} from "../src/CampaignInfo.sol"; +import {CampaignInfoFactory} from "../src/CampaignInfoFactory.sol"; +import {GlobalParams} from "../src/GlobalParams.sol"; +import {TreasuryFactory} from "../src/TreasuryFactory.sol"; +import {DeployBase} from "./lib/DeployBase.s.sol"; + +contract DeployCampaignInfoFactory is DeployBase { + function deploy( + address _globalParams, + address _treasuryFactory + ) public returns (address) { + require(_globalParams != address(0), "GlobalParams not set"); + require(_treasuryFactory != address(0), "TreasuryFactory not set"); + + // Deploy CampaignInfo implementation + CampaignInfo campaignInfo = new CampaignInfo(msg.sender); + + // Deploy CampaignInfoFactory + CampaignInfoFactory factory = new CampaignInfoFactory( + GlobalParams(_globalParams), + address(campaignInfo) + ); + + // Initialize the factory + factory._initialize(_treasuryFactory, _globalParams); + + return address(factory); + } + + function run() external { + address globalParams = vm.envOr("GLOBAL_PARAMS_ADDRESS", address(0)); + address treasuryFactory = vm.envOr( + "TREASURY_FACTORY_ADDRESS", + address(0) + ); + + require(globalParams != address(0), "GlobalParams must be set"); + require(treasuryFactory != address(0), "TreasuryFactory must be set"); + + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); + deploy(globalParams, treasuryFactory); + vm.stopBroadcast(); + } +} \ No newline at end of file From 2b60511b16c4149f65715da0ecb63856be83b8b9 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:47:59 +0800 Subject: [PATCH 41/61] Add deployment script for GlobalParams --- script/DeployGlobalParams.s.sol | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 script/DeployGlobalParams.s.sol diff --git a/script/DeployGlobalParams.s.sol b/script/DeployGlobalParams.s.sol new file mode 100644 index 00000000..22e51ca3 --- /dev/null +++ b/script/DeployGlobalParams.s.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import {GlobalParams} from "../src/GlobalParams.sol"; +import {DeployBase} from "./lib/DeployBase.s.sol"; + +contract DeployGlobalParams is DeployBase { + function deployWithToken(address token) public returns (address) { + address deployer = vm.addr(vm.envUint("PRIVATE_KEY")); + return address(new GlobalParams(deployer, token, 200)); + } + + function deploy() public returns (address) { + return deployOrUse("GLOBAL_PARAMS_ADDRESS", _deploy); + } + + function _deploy() internal returns (address) { + address deployer = vm.addr(vm.envUint("PRIVATE_KEY")); + address token = vm.envOr("TEST_USD_ADDRESS", address(0)); + require(token != address(0), "TestUSD address must be set"); + return address(new GlobalParams(deployer, token, 200)); + } + + function run() external { + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); + deploy(); + vm.stopBroadcast(); + } +} From 386fbb103d88137e2cff84c0add0b3daf7bd198d Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:48:19 +0800 Subject: [PATCH 42/61] Add deployment script for mock token --- script/DeployTestUSD.s.sol | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 script/DeployTestUSD.s.sol diff --git a/script/DeployTestUSD.s.sol b/script/DeployTestUSD.s.sol new file mode 100644 index 00000000..3a955e91 --- /dev/null +++ b/script/DeployTestUSD.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import {TestUSD} from "../src/TestUSD.sol"; +import {DeployBase} from "./lib/DeployBase.s.sol"; + +contract DeployTestUSD is DeployBase { + function deploy() public returns (address) { + return deployOrUse("TEST_USD_ADDRESS", _deploy); + } + + function _deploy() internal returns (address) { + return address(new TestUSD()); + } + + function run() external { + vm.startBroadcast(vm.envUint("PRIVATE_KEY")); + deploy(); + vm.stopBroadcast(); + } +} From b3b1ed28bd3c077ee69c505f65b67247d936a826 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:48:44 +0800 Subject: [PATCH 43/61] Add full deployment script --- script/DeployAll.s.sol | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 script/DeployAll.s.sol diff --git a/script/DeployAll.s.sol b/script/DeployAll.s.sol new file mode 100644 index 00000000..741a3208 --- /dev/null +++ b/script/DeployAll.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import "forge-std/Script.sol"; +import "./DeployGlobalParams.s.sol"; +import "./DeployTestUSD.s.sol"; +import "./DeployCampaignInfoFactory.s.sol"; +import "./DeployTreasuryFactory.s.sol"; + +contract DeployAll is Script { + function deployTestUSD() internal returns (address) { + DeployTestUSD script = new DeployTestUSD(); + return script.deploy(); + } + + function deployGlobalParams(address testUSD) internal returns (address) { + DeployGlobalParams script = new DeployGlobalParams(); + return script.deployWithToken(testUSD); + } + + function deployTreasuryFactory( + address globalParams + ) internal returns (address) { + DeployTreasuryFactory script = new DeployTreasuryFactory(); + return script.deploy(globalParams); + } + + function deployCampaignFactory( + address globalParams, + address treasuryFactory + ) internal returns (address) { + DeployCampaignInfoFactory script = new DeployCampaignInfoFactory(); + return script.deploy(globalParams, treasuryFactory); + } + + function run() external { + bool simulate = vm.envOr("SIMULATE", false); + uint256 deployerKey = vm.envUint("PRIVATE_KEY"); + + if (!simulate) { + vm.startBroadcast(deployerKey); + } + + address testUSD = deployTestUSD(); + address globalParams = deployGlobalParams(testUSD); + address treasuryFactory = deployTreasuryFactory(globalParams); + address campaignFactory = deployCampaignFactory( + globalParams, + treasuryFactory + ); + + if (!simulate) { + vm.stopBroadcast(); + } + + console2.log("TEST_USD_ADDRESS", testUSD); + console2.log("GLOBAL_PARAMS_ADDRESS", globalParams); + console2.log("TREASURY_FACTORY_ADDRESS", treasuryFactory); + console2.log("CAMPAIGN_INFO_FACTORY_ADDRESS", campaignFactory); + } +} From 2e6be44e130dcd3f9e36c1c781a5743a89ed1c7d Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 05:49:50 +0800 Subject: [PATCH 44/61] Update docs --- docs/.gitignore | 1 + docs/book.css | 13 + docs/book.toml | 13 + docs/solidity.min.js | 74 ++++++ docs/src/README.md | 67 +++++ docs/src/SUMMARY.md | 13 +- .../CampaignInfo.sol/contract.CampaignInfo.md | 242 ++++++++++++------ .../contract.CampaignInfoFactory.md | 60 +++-- .../GlobalParams.sol/contract.GlobalParams.md | 177 ++++++++++--- docs/src/src/TestUSD.sol/contract.TestUSD.md | 6 +- .../contract.TreasuryFactory.md | 241 +++++------------ .../interface.ICampaignData.md | 2 +- .../interface.ICampaignInfo.md | 29 ++- .../interface.ICampaignInfoFactory.md | 13 +- .../interface.ICampaignTreasury.md | 6 +- .../interface.IGlobalParams.md | 24 +- .../interfaces/IItem.sol/interface.IItem.md | 2 +- .../IReward.sol/interface.IReward.md | 19 ++ .../interface.ITreasuryFactory.md | 113 +++++--- docs/src/src/interfaces/README.md | 1 + .../AllOrNothing.sol/contract.AllOrNothing.md | 228 ++++++++++------- .../contract.KeepWhatsRaised.md | 34 ++- .../MinimumOrder.sol/contract.MinimumOrder.md | 143 +++++------ .../OutOfStock.sol/contract.OutOfStock.md | 33 ++- docs/src/src/treasuries/README.md | 3 - .../library.AddressCalculator.md | 2 +- .../abstract.AdminAccessChecker.md | 30 +-- .../BaseTreasury.sol/abstract.BaseTreasury.md | 94 ++++--- .../abstract.CampaignAccessChecker.md | 26 +- .../utils/Counters.sol/library.Counters.md | 49 ++++ .../FiatEnabled.sol/abstract.FiatEnabled.md | 17 +- .../ItemRegistry.sol/contract.ItemRegistry.md | 26 +- .../abstract.PausableCancellable.md | 193 ++++++++++++++ docs/src/src/utils/README.md | 3 +- .../abstract.TimestampChecker.md | 35 ++- 35 files changed, 1352 insertions(+), 680 deletions(-) create mode 100644 docs/.gitignore create mode 100644 docs/book.css create mode 100644 docs/book.toml create mode 100644 docs/solidity.min.js create mode 100644 docs/src/README.md create mode 100644 docs/src/src/interfaces/IReward.sol/interface.IReward.md create mode 100644 docs/src/src/utils/Counters.sol/library.Counters.md create mode 100644 docs/src/src/utils/PausableCancellable.sol/abstract.PausableCancellable.md diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..4e42a1bc --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +book/ \ No newline at end of file diff --git a/docs/book.css b/docs/book.css new file mode 100644 index 00000000..b5ce903f --- /dev/null +++ b/docs/book.css @@ -0,0 +1,13 @@ +table { + margin: 0 auto; + border-collapse: collapse; + width: 100%; +} + +table td:first-child { + width: 15%; +} + +table td:nth-child(2) { + width: 25%; +} \ No newline at end of file diff --git a/docs/book.toml b/docs/book.toml new file mode 100644 index 00000000..b93f4313 --- /dev/null +++ b/docs/book.toml @@ -0,0 +1,13 @@ +[book] +src = "src" +title = "" + +[output.html] +no-section-label = true +additional-js = ["solidity.min.js"] +additional-css = ["book.css"] +mathjax-support = true +git-repository-url = "https://github.com/ccprotocol/reference-client-sc" + +[output.html.fold] +enable = true diff --git a/docs/solidity.min.js b/docs/solidity.min.js new file mode 100644 index 00000000..19249329 --- /dev/null +++ b/docs/solidity.min.js @@ -0,0 +1,74 @@ +hljs.registerLanguage("solidity",(()=>{"use strict";function e(){try{return!0 +}catch(e){return!1}} +var a=/-?(\b0[xX]([a-fA-F0-9]_?)*[a-fA-F0-9]|(\b[1-9](_?\d)*(\.((\d_?)*\d)?)?|\.\d(_?\d)*)([eE][-+]?\d(_?\d)*)?|\b0)(?!\w|\$)/ +;e()&&(a=a.source.replace(/\\b/g,"(?{ +var a=r(e),o=l(e),c=/[A-Za-z_$][A-Za-z_$0-9.]*/,d=e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][0-9A-Za-z$_]*/,lexemes:c,keywords:n}),u={className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,lexemes:c,keywords:n, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,o,s]},_={ +className:"operator",begin:/:=|->/};return{keywords:n,lexemes:c, +contains:[a,o,i,t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,_,{ +className:"function",lexemes:c,beginKeywords:"function",end:"{",excludeEnd:!0, +contains:[d,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,_]}]}}, +solAposStringMode:r,solQuoteStringMode:l,HEX_APOS_STRING_MODE:i, +HEX_QUOTE_STRING_MODE:t,SOL_NUMBER:s,isNegativeLookbehindAvailable:e} +;const{baseAssembly:c,solAposStringMode:d,solQuoteStringMode:u,HEX_APOS_STRING_MODE:_,HEX_QUOTE_STRING_MODE:m,SOL_NUMBER:b,isNegativeLookbehindAvailable:E}=o +;return e=>{for(var a=d(e),s=u(e),n=[],i=0;i<32;i++)n[i]=i+1 +;var t=n.map((e=>8*e)),r=[];for(i=0;i<=80;i++)r[i]=i +;var l=n.map((e=>"bytes"+e)).join(" ")+" ",o=t.map((e=>"uint"+e)).join(" ")+" ",g=t.map((e=>"int"+e)).join(" ")+" ",M=[].concat.apply([],t.map((e=>r.map((a=>e+"x"+a))))),p={ +keyword:"var bool string int uint "+g+o+"byte bytes "+l+"fixed ufixed "+M.map((e=>"fixed"+e)).join(" ")+" "+M.map((e=>"ufixed"+e)).join(" ")+" enum struct mapping address new delete if else for while continue break return throw emit try catch revert unchecked _ function modifier event constructor fallback receive error virtual override constant immutable anonymous indexed storage memory calldata external public internal payable pure view private returns import from as using pragma contract interface library is abstract type assembly", +literal:"true false wei gwei szabo finney ether seconds minutes hours days weeks years", +built_in:"self this super selfdestruct suicide now msg block tx abi blockhash gasleft assert require Error Panic sha3 sha256 keccak256 ripemd160 ecrecover addmod mulmod log0 log1 log2 log3 log4" +},O={className:"operator",begin:/[+\-!~*\/%<>&^|=]/ +},C=/[A-Za-z_$][A-Za-z_$0-9]*/,N={className:"params",begin:/\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,lexemes:C,keywords:p, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,s,b,"self"]},f={ +begin:/\.\s*/,end:/[^A-Za-z0-9$_\.]/,excludeBegin:!0,excludeEnd:!0,keywords:{ +built_in:"gas value selector address length push pop send transfer call callcode delegatecall staticcall balance code codehash wrap unwrap name creationCode runtimeCode interfaceId min max" +},relevance:2},y=e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/, +lexemes:C,keywords:p}),w={className:"built_in", +begin:(E()?"(? bool) private s_selectedPlatformHash; ``` -### PROTOCOL_FEE_PERCENT +### s_platformTreasuryAddress ```solidity -uint256 private immutable PROTOCOL_FEE_PERCENT; +mapping(bytes32 => address) private s_platformTreasuryAddress; ``` -### IDENTIFIER_HASH +### s_platformFeePercent ```solidity -bytes32 private immutable IDENTIFIER_HASH; +mapping(bytes32 => uint256) private s_platformFeePercent; ``` -### s_campaignData +### s_platformData ```solidity -CampaignData private s_campaignData; +mapping(bytes32 => bytes32) private s_platformData; ``` -### s_selectedPlatformBytes +### s_approvedplatformHash ```solidity -mapping(bytes32 => bool) private s_selectedPlatformBytes; +bytes32[] private s_approvedplatformHash; ``` -### s_platformTreasuryAddress - -```solidity -mapping(bytes32 => address) private s_platformTreasuryAddress; -``` - +## Functions +### getApprovedPlatformHashes -### s_platformFeePercent ```solidity -mapping(bytes32 => uint256) private s_platformFeePercent; +function getApprovedPlatformHashes() external view returns (bytes32[] memory); ``` +### constructor -### s_platformData ```solidity -mapping(bytes32 => bytes32) private s_platformData; +constructor(address creator) Ownable(creator); ``` +### initialize -### s_approvedPlatformBytes ```solidity -bytes32[] private s_approvedPlatformBytes; +function initialize( + address creator, + IGlobalParams globalParams, + bytes32[] calldata selectedPlatformHash, + bytes32[] calldata platformDataKey, + bytes32[] calldata platformDataValue +) external initializer; ``` - -## Functions -### constructor +### getCampaignConfig ```solidity -constructor( - IGlobalParams globalParams, - address treasuryFactory, - address token, - address creator, - uint256 protocolFeePercent, - bytes32 identifierHash, - bytes32[] memory selectedPlatformBytes, - bytes32[] memory platformDataKey, - bytes32[] memory platformDataValue, - CampaignData memory campaignData -) AdminAccessChecker(globalParams); +function getCampaignConfig() public view returns (Config memory config); ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`globalParams`|`IGlobalParams`|The address of the global parameters contract.| -|`treasuryFactory`|`address`|The address of the treasury factory contract.| -|`token`|`address`|The address of the campaign token contract.| -|`creator`|`address`|The address of the campaign creator.| -|`protocolFeePercent`|`uint256`|The protocol fee percentage.| -|`identifierHash`|`bytes32`|The hash identifier for the campaign.| -|`selectedPlatformBytes`|`bytes32[]`|The list of selected platform identifiers.| -|`platformDataKey`|`bytes32[]`|The list of platform data keys.| -|`platformDataValue`|`bytes32[]`|The list of platform data values.| -|`campaignData`|`CampaignData`|The initial campaign data.| - ### checkIfPlatformSelected @@ -118,13 +91,13 @@ Checks if a platform has been selected for the campaign. ```solidity -function checkIfPlatformSelected(bytes32 platformBytes) public view override returns (bool); +function checkIfPlatformSelected(bytes32 platformHash) public view override returns (bool); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform to check.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform to check.| **Returns** @@ -184,13 +157,13 @@ Retrieves the address of the platform administrator for a specific platform. ```solidity -function getPlatformAdminAddress(bytes32 platformBytes) external view override returns (address); +function getPlatformAdminAddress(bytes32 platformHash) external view override returns (address); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| **Returns** @@ -205,7 +178,7 @@ Retrieves the campaign's launch time. ```solidity -function getLaunchTime() external view override returns (uint256); +function getLaunchTime() public view override returns (uint256); ``` **Returns** @@ -276,11 +249,20 @@ function getProtocolFeePercent() external view override returns (uint256); ### paused -*Returns true if the contract is paused, and false otherwise.* +*Returns true if the campaign is paused, and false otherwise.* ```solidity -function paused() public view override(ICampaignInfo, PausableWithMsg) returns (bool); +function paused() public view override(ICampaignInfo, PausableCancellable) returns (bool); +``` + +### cancelled + +*Returns true if the campaign is cancelled, and false otherwise.* + + +```solidity +function cancelled() public view override(ICampaignInfo, PausableCancellable) returns (bool); ``` ### getPlatformFeePercent @@ -289,13 +271,13 @@ Retrieves the platform fee percentage for a specific platform. ```solidity -function getPlatformFeePercent(bytes32 platformBytes) external view override returns (uint256); +function getPlatformFeePercent(bytes32 platformHash) external view override returns (uint256); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| **Returns** @@ -342,6 +324,9 @@ function getIdentifierHash() external view override returns (bytes32); ### transferOwnership +*Transfers ownership of the contract to a new account (`newOwner`). +Can only be called by the current owner.* + ```solidity function transferOwnership(address newOwner) public override(ICampaignInfo, Ownable) onlyOwner whenNotPaused; @@ -372,7 +357,7 @@ function updateDeadline(uint256 deadline) external override onlyOwner - currentTimeIsLess(s_campaignData.launchTime) + currentTimeIsLess(getLaunchTime()) whenNotPaused; ``` **Parameters** @@ -408,7 +393,7 @@ Updates the selection status of a platform for the campaign. ```solidity -function updateSelectedPlatform(bytes32 platformBytes, bool selection) +function updateSelectedPlatform(bytes32 platformHash, bool selection) external override onlyOwner @@ -419,39 +404,52 @@ function updateSelectedPlatform(bytes32 platformBytes, bool selection) |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| |`selection`|`bool`|The new selection status (true or false).| -### _setPlatformInfo +### _pauseCampaign -*Sets platform information for the campaign.* +*External function to pause the campaign.* ```solidity -function _setPlatformInfo(bytes32 platformBytes, address platformTreasuryAddress) external whenNotPaused; +function _pauseCampaign(bytes32 message) external onlyProtocolAdmin; ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| -|`platformTreasuryAddress`|`address`|The address of the platform's treasury.| +### _unpauseCampaign +*External function to unpause the campaign.* -### _pauseCampaign + +```solidity +function _unpauseCampaign(bytes32 message) external onlyProtocolAdmin; +``` + +### _cancelCampaign + +*External function to cancel the campaign.* ```solidity -function _pauseCampaign(bytes32 message) external onlyProtocolAdmin; +function _cancelCampaign(bytes32 message) external onlyProtocolAdmin; ``` -### _unpauseCampaign +### _setPlatformInfo + +*Sets platform information for the campaign.* ```solidity -function _unpauseCampaign(bytes32 message) external onlyProtocolAdmin; +function _setPlatformInfo(bytes32 platformHash, address platformTreasuryAddress) external whenNotPaused; ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| +|`platformTreasuryAddress`|`address`|The address of the platform's treasury.| + ## Events ### CampaignInfoPlatformSelected @@ -459,9 +457,16 @@ function _unpauseCampaign(bytes32 message) external onlyProtocolAdmin; ```solidity -event CampaignInfoPlatformSelected(bytes32 indexed platformBytes, address indexed platformTreasury); +event CampaignInfoPlatformSelected(bytes32 indexed platformHash, address indexed platformTreasury); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| +|`platformTreasury`|`address`|The address of the platform's treasury.| + ### CampaignInfoLaunchTimeUpdated *Emitted when the launch time of the campaign is updated.* @@ -470,6 +475,12 @@ event CampaignInfoPlatformSelected(bytes32 indexed platformBytes, address indexe event CampaignInfoLaunchTimeUpdated(uint256 newLaunchTime); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newLaunchTime`|`uint256`|The new launch time.| + ### CampaignInfoDeadlineUpdated *Emitted when the deadline of the campaign is updated.* @@ -478,6 +489,12 @@ event CampaignInfoLaunchTimeUpdated(uint256 newLaunchTime); event CampaignInfoDeadlineUpdated(uint256 newDeadline); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newDeadline`|`uint256`|The new deadline.| + ### CampaignInfoGoalAmountUpdated *Emitted when the goal amount of the campaign is updated.* @@ -486,22 +503,42 @@ event CampaignInfoDeadlineUpdated(uint256 newDeadline); event CampaignInfoGoalAmountUpdated(uint256 newGoalAmount); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newGoalAmount`|`uint256`|The new goal amount.| + ### CampaignInfoSelectedPlatformUpdated *Emitted when the selection state of a platform is updated.* ```solidity -event CampaignInfoSelectedPlatformUpdated(bytes32 indexed platformBytes, bool selection); +event CampaignInfoSelectedPlatformUpdated(bytes32 indexed platformHash, bool selection); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| +|`selection`|`bool`|The new selection state.| + ### CampaignInfoPlatformInfoUpdated *Emitted when platform information is updated for the campaign.* ```solidity -event CampaignInfoPlatformInfoUpdated(bytes32 indexed platformBytes, address indexed platformTreasury); +event CampaignInfoPlatformInfoUpdated(bytes32 indexed platformHash, address indexed platformTreasury); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| +|`platformTreasury`|`address`|The address of the platform's treasury.| + ### CampaignInfoOwnershipTransferred *Emitted when ownership of the contract is transferred.* @@ -510,15 +547,29 @@ event CampaignInfoPlatformInfoUpdated(bytes32 indexed platformBytes, address ind event CampaignInfoOwnershipTransferred(address indexed previousOwner, address indexed newOwner); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`previousOwner`|`address`|The address of the previous owner.| +|`newOwner`|`address`|The address of the new owner.| + ## Errors ### CampaignInfoInvalidPlatformUpdate *Emitted when an invalid platform update is attempted.* ```solidity -error CampaignInfoInvalidPlatformUpdate(bytes32 platformBytes, bool selection); +error CampaignInfoInvalidPlatformUpdate(bytes32 platformHash, bool selection); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| +|`selection`|`bool`|The selection state (true/false).| + ### CampaignInfoUnauthorized *Emitted when an unauthorized action is attempted.* @@ -540,6 +591,27 @@ error CampaignInfoInvalidInput(); ```solidity -error CampaignInfoPlatformNotSelected(bytes32 platformBytes); +error CampaignInfoPlatformNotSelected(bytes32 platformHash); +``` + +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| + +## Structs +### Config + +```solidity +struct Config { + address treasuryFactory; + address token; + uint256 protocolFeePercent; + bytes32 identifierHash; + uint256 launchTime; + uint256 deadline; + uint256 goalAmount; +} ``` diff --git a/docs/src/src/CampaignInfoFactory.sol/contract.CampaignInfoFactory.md b/docs/src/src/CampaignInfoFactory.sol/contract.CampaignInfoFactory.md index 4ba12b98..e987f012 100644 --- a/docs/src/src/CampaignInfoFactory.sol/contract.CampaignInfoFactory.md +++ b/docs/src/src/CampaignInfoFactory.sol/contract.CampaignInfoFactory.md @@ -1,5 +1,5 @@ # CampaignInfoFactory -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/CampaignInfoFactory.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/CampaignInfoFactory.sol) **Inherits:** [ICampaignInfoFactory](/src/interfaces/ICampaignInfoFactory.sol/interface.ICampaignInfoFactory.md), Ownable @@ -8,13 +8,6 @@ Factory contract for creating campaign information contracts. ## State Variables -### bytecode - -```solidity -bytes private constant bytecode = type(CampaignInfo).creationCode; -``` - - ### GLOBAL_PARAMS ```solidity @@ -36,18 +29,40 @@ bool private s_initialized; ``` +### s_implementation + +```solidity +address private s_implementation; +``` + + +### isValidCampaignInfo + +```solidity +mapping(address => bool) public isValidCampaignInfo; +``` + + +### identifierToCampaignInfo + +```solidity +mapping(bytes32 => address) public identifierToCampaignInfo; +``` + + ## Functions ### constructor ```solidity -constructor(IGlobalParams globalParams); +constructor(IGlobalParams globalParams, address campaignImplementation) Ownable(msg.sender); ``` **Parameters** |Name|Type|Description| |----|----|-----------| |`globalParams`|`IGlobalParams`|The address of the global parameters contract.| +|`campaignImplementation`|`address`|| ### _initialize @@ -68,30 +83,17 @@ function _initialize(address treasuryFactoryAddress, address globalParams) exter ### createCampaign -Creates a new campaign information contract. - ```solidity function createCampaign( address creator, bytes32 identifierHash, - bytes32[] calldata selectedPlatformBytes, + bytes32[] calldata selectedPlatformHash, bytes32[] calldata platformDataKey, bytes32[] calldata platformDataValue, CampaignData calldata campaignData ) external override; ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`creator`|`address`|The address of the creator of the campaign.| -|`identifierHash`|`bytes32`|The unique identifier hash of the campaign.| -|`selectedPlatformBytes`|`bytes32[]`|An array of platform identifiers selected for the campaign.| -|`platformDataKey`|`bytes32[]`|An array of platform-specific data keys.| -|`platformDataValue`|`bytes32[]`|An array of platform-specific data values.| -|`campaignData`|`CampaignData`|The struct containing campaign launch details.| - ## Errors ### CampaignInfoFactoryAlreadyInitialized @@ -118,3 +120,15 @@ error CampaignInfoFactoryInvalidInput(); error CampaignInfoFactoryCampaignCreationFailed(); ``` +### CampaignInfoFactoryPlatformNotListed + +```solidity +error CampaignInfoFactoryPlatformNotListed(bytes32 platformHash); +``` + +### CampaignInfoFactoryCampaignWithSameIdentifierExists + +```solidity +error CampaignInfoFactoryCampaignWithSameIdentifierExists(bytes32 identifierHash, address cloneExists); +``` + diff --git a/docs/src/src/GlobalParams.sol/contract.GlobalParams.md b/docs/src/src/GlobalParams.sol/contract.GlobalParams.md index 88cd984c..62896299 100644 --- a/docs/src/src/GlobalParams.sol/contract.GlobalParams.md +++ b/docs/src/src/GlobalParams.sol/contract.GlobalParams.md @@ -1,5 +1,5 @@ # GlobalParams -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/GlobalParams.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/GlobalParams.sol) **Inherits:** [IGlobalParams](/src/interfaces/IGlobalParams.sol/interface.IGlobalParams.md), Ownable, Pausable @@ -95,20 +95,28 @@ Users attempting to execute functions with this modifier must be the platform ad ```solidity -modifier onlyPlatformAdmin(bytes32 platformBytes); +modifier onlyPlatformAdmin(bytes32 platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| +### platformIsListed + + +```solidity +modifier platformIsListed(bytes32 platformHash); +``` + ### constructor ```solidity -constructor(address protocolAdminAddress, address tokenAddress, uint256 protocolFeePercent); +constructor(address protocolAdminAddress, address tokenAddress, uint256 protocolFeePercent) + Ownable(protocolAdminAddress); ``` **Parameters** @@ -119,19 +127,19 @@ constructor(address protocolAdminAddress, address tokenAddress, uint256 protocol |`protocolFeePercent`|`uint256`|The protocol fee percentage.| -### checkIfplatformIsListed +### checkIfPlatformIsListed Checks if a platform is listed in the protocol. ```solidity -function checkIfplatformIsListed(bytes32 platformBytes) external view override returns (bool); +function checkIfPlatformIsListed(bytes32 platformHash) public view override returns (bool); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|| +|`platformHash`|`bytes32`|| **Returns** @@ -146,13 +154,18 @@ Retrieves the admin address of a platform. ```solidity -function getPlatformAdminAddress(bytes32 platformBytes) external view override returns (address account); +function getPlatformAdminAddress(bytes32 platformHash) + external + view + override + platformIsListed(platformHash) + returns (address account); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|| +|`platformHash`|`bytes32`|| **Returns** @@ -227,13 +240,18 @@ Retrieves the platform fee percentage for a specific platform. ```solidity -function getPlatformFeePercent(bytes32 platformBytes) external view override returns (uint256 platformFeePercent); +function getPlatformFeePercent(bytes32 platformHash) + external + view + override + platformIsListed(platformHash) + returns (uint256 platformFeePercent); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| **Returns** @@ -248,7 +266,12 @@ Retrieves the owner of platform-specific data. ```solidity -function getPlatformDataOwner(bytes32 platformDataKey) external view override returns (bytes32 platformBytes); +function getPlatformDataOwner(bytes32 platformDataKey) + external + view + override + platformIsListed(platformHash) + returns (bytes32 platformHash); ``` **Parameters** @@ -260,7 +283,7 @@ function getPlatformDataOwner(bytes32 platformDataKey) external view override re |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier associated with the data.| +|`platformHash`|`bytes32`|The platform identifier associated with the data.| ### checkIfPlatformDataKeyValid @@ -290,7 +313,7 @@ Enlists a platform with its admin address and fee percentage. ```solidity -function enlistPlatform(bytes32 platformBytes, address platformAdminAddress, uint256 platformFeePercent) +function enlistPlatform(bytes32 platformHash, address platformAdminAddress, uint256 platformFeePercent) external onlyOwner; ``` @@ -298,7 +321,7 @@ function enlistPlatform(bytes32 platformBytes, address platformAdminAddress, uin |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform's identifier.| +|`platformHash`|`bytes32`|The platform's identifier.| |`platformAdminAddress`|`address`|The platform's admin address.| |`platformFeePercent`|`uint256`|The platform's fee percentage.| @@ -309,13 +332,13 @@ Delists a platform. ```solidity -function delistPlatform(bytes32 platformBytes) external onlyOwner; +function delistPlatform(bytes32 platformHash) external onlyOwner; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform's identifier.| +|`platformHash`|`bytes32`|The platform's identifier.| ### addPlatformData @@ -324,13 +347,16 @@ Adds platform-specific data key. ```solidity -function addPlatformData(bytes32 platformBytes, bytes32 platformDataKey) external onlyPlatformAdmin(platformBytes); +function addPlatformData(bytes32 platformHash, bytes32 platformDataKey) + external + platformIsListed(platformHash) + onlyPlatformAdmin(platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform's identifier.| +|`platformHash`|`bytes32`|The platform's identifier.| |`platformDataKey`|`bytes32`|The platform data key.| @@ -340,13 +366,16 @@ Removes platform-specific data key. ```solidity -function removePlatformData(bytes32 platformBytes, bytes32 platformDataKey) external onlyPlatformAdmin(platformBytes); +function removePlatformData(bytes32 platformHash, bytes32 platformDataKey) + external + platformIsListed(platformHash) + onlyPlatformAdmin(platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform's identifier.| +|`platformHash`|`bytes32`|The platform's identifier.| |`platformDataKey`|`bytes32`|The platform data key.| @@ -405,17 +434,18 @@ Updates the admin address of a platform. ```solidity -function updatePlatformAdminAddress(bytes32 platformBytes, address platformAdminAddress) +function updatePlatformAdminAddress(bytes32 platformHash, address platformAdminAddress) external override onlyOwner + platformIsListed(platformHash) notAddressZero(platformAdminAddress); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|| +|`platformHash`|`bytes32`|| |`platformAdminAddress`|`address`|| @@ -428,20 +458,20 @@ function updatePlatformAdminAddress(bytes32 platformBytes, address platformAdmin function _checkIfAddressZero(address account) internal pure; ``` -### _checkIfPlatformAdmin +### _onlyPlatformAdmin *Internal function to check if the sender is the platform administrator for a specific platform. If the sender is not the platform admin, it reverts with AdminAccessCheckerUnauthorized error.* ```solidity -function _checkIfPlatformAdmin(bytes32 platformBytes) private view; +function _onlyPlatformAdmin(bytes32 platformHash) private view; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| ## Events @@ -450,17 +480,31 @@ function _checkIfPlatformAdmin(bytes32 platformBytes) private view; ```solidity -event PlatformEnlisted(bytes32 indexed platformBytes, address indexed platformAdminAddress, uint256 platformFeePercent); +event PlatformEnlisted(bytes32 indexed platformHash, address indexed platformAdminAddress, uint256 platformFeePercent); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the enlisted platform.| +|`platformAdminAddress`|`address`|The admin address of the enlisted platform.| +|`platformFeePercent`|`uint256`|The fee percentage of the enlisted platform.| + ### PlatformDelisted *Emitted when a platform is delisted.* ```solidity -event PlatformDelisted(bytes32 indexed platformBytes); +event PlatformDelisted(bytes32 indexed platformHash); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the delisted platform.| + ### ProtocolAdminAddressUpdated *Emitted when the protocol admin address is updated.* @@ -469,6 +513,12 @@ event PlatformDelisted(bytes32 indexed platformBytes); event ProtocolAdminAddressUpdated(address indexed newAdminAddress); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newAdminAddress`|`address`|The new protocol admin address.| + ### TokenAddressUpdated *Emitted when the token address is updated.* @@ -477,6 +527,12 @@ event ProtocolAdminAddressUpdated(address indexed newAdminAddress); event TokenAddressUpdated(address indexed newTokenAddress); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newTokenAddress`|`address`|The new token address.| + ### ProtocolFeePercentUpdated *Emitted when the protocol fee percent is updated.* @@ -485,30 +541,57 @@ event TokenAddressUpdated(address indexed newTokenAddress); event ProtocolFeePercentUpdated(uint256 newFeePercent); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`newFeePercent`|`uint256`|The new protocol fee percentage.| + ### PlatformAdminAddressUpdated *Emitted when the platform admin address is updated.* ```solidity -event PlatformAdminAddressUpdated(bytes32 indexed platformBytes, address indexed newAdminAddress); +event PlatformAdminAddressUpdated(bytes32 indexed platformHash, address indexed newAdminAddress); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| +|`newAdminAddress`|`address`|The new admin address of the platform.| + ### PlatformDataAdded *Emitted when platform data is added.* ```solidity -event PlatformDataAdded(bytes32 indexed platformBytes, bytes32 indexed platformDataKey); +event PlatformDataAdded(bytes32 indexed platformHash, bytes32 indexed platformDataKey); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| +|`platformDataKey`|`bytes32`|The data key added to the platform.| + ### PlatformDataRemoved *Emitted when platform data is removed.* ```solidity -event PlatformDataRemoved(bytes32 indexed platformBytes, bytes32 platformDataKey); +event PlatformDataRemoved(bytes32 indexed platformHash, bytes32 platformDataKey); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| +|`platformDataKey`|`bytes32`|The data key removed from the platform.| + ## Errors ### GlobalParamsInvalidInput *Throws when the input address is zero.* @@ -523,33 +606,57 @@ error GlobalParamsInvalidInput(); ```solidity -error GlobalParamsPlatformNotListed(bytes32 platformBytes, address platformAdminAddress); +error GlobalParamsPlatformNotListed(bytes32 platformHash); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| + ### GlobalParamsPlatformAlreadyListed *Throws when the platform is already listed.* ```solidity -error GlobalParamsPlatformAlreadyListed(bytes32 platformBytes); +error GlobalParamsPlatformAlreadyListed(bytes32 platformHash); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| + ### GlobalParamsPlatformAdminNotSet *Throws when the platform admin is not set.* ```solidity -error GlobalParamsPlatformAdminNotSet(bytes32 platformBytes); +error GlobalParamsPlatformAdminNotSet(bytes32 platformHash); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| + ### GlobalParamsPlatformFeePercentIsZero *Throws when the platform fee percent is zero.* ```solidity -error GlobalParamsPlatformFeePercentIsZero(bytes32 platformBytes); +error GlobalParamsPlatformFeePercentIsZero(bytes32 platformHash); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The identifier of the platform.| + ### GlobalParamsPlatformDataAlreadySet *Throws when the platform data is already set.* diff --git a/docs/src/src/TestUSD.sol/contract.TestUSD.md b/docs/src/src/TestUSD.sol/contract.TestUSD.md index 934f491f..37bc06f1 100644 --- a/docs/src/src/TestUSD.sol/contract.TestUSD.md +++ b/docs/src/src/TestUSD.sol/contract.TestUSD.md @@ -1,8 +1,8 @@ # TestUSD -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/TestUSD.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/TestUSD.sol) **Inherits:** -ERC20, ERC20Permit, Ownable +ERC20, Ownable A test token `tUSD` which is used in the tests. @@ -12,7 +12,7 @@ A test token `tUSD` which is used in the tests. ```solidity -constructor() ERC20("testUSD", "tUSD") ERC20Permit("testUSD"); +constructor() ERC20("testUSD", "tUSD") Ownable(msg.sender); ``` ### mint diff --git a/docs/src/src/TreasuryFactory.sol/contract.TreasuryFactory.md b/docs/src/src/TreasuryFactory.sol/contract.TreasuryFactory.md index 0fd3a8c6..8cc25e3f 100644 --- a/docs/src/src/TreasuryFactory.sol/contract.TreasuryFactory.md +++ b/docs/src/src/TreasuryFactory.sol/contract.TreasuryFactory.md @@ -1,43 +1,22 @@ # TreasuryFactory -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/TreasuryFactory.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/TreasuryFactory.sol) **Inherits:** [ITreasuryFactory](/src/interfaces/ITreasuryFactory.sol/interface.ITreasuryFactory.md), [AdminAccessChecker](/src/utils/AdminAccessChecker.sol/abstract.AdminAccessChecker.md) ## State Variables -### s_platformBytecode +### implementationMap ```solidity -mapping(bytes32 => mapping(uint256 => bytes[])) private s_platformBytecode; +mapping(bytes32 => mapping(uint256 => address)) implementationMap; ``` -### s_platformBytecodeStatus +### approvedImplementations ```solidity -mapping(bytes32 => mapping(uint256 => bool)) private s_platformBytecodeStatus; -``` - - -### s_approvedBytecode - -```solidity -mapping(bytes32 => mapping(uint256 => bool)) private s_approvedBytecode; -``` - - -### CAMPAIGN_INFO_FACTORY - -```solidity -address private immutable CAMPAIGN_INFO_FACTORY; -``` - - -### CAMPAIGNINFO_BYTECODEHASH - -```solidity -bytes32 private immutable CAMPAIGNINFO_BYTECODEHASH; +mapping(address => bool) approvedImplementations; ``` @@ -50,201 +29,119 @@ Initializes the TreasuryFactory contract. ```solidity -constructor(IGlobalParams globalParams, address infoFactory, bytes32 bytecodeHash) AdminAccessChecker(globalParams); +constructor(IGlobalParams globalParams); ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`globalParams`|`IGlobalParams`|Address of the GlobalParams contract.| -|`infoFactory`|`address`|Address of the CampaignInfoFactory contract.| -|`bytecodeHash`|`bytes32`|Keccak256 hash of the CampaignInfo bytecode.| +### registerTreasuryImplementation +Registers a treasury implementation for a given platform. -### computeTreasuryAddress - -*Function to compute the address of a treasury based on the identifier hash, platform, and bytecode index.* +*Callable only by the platform admin.* ```solidity -function computeTreasuryAddress(bytes32 identifierHash, bytes32 platformBytes, uint256 bytecodeIndex) +function registerTreasuryImplementation(bytes32 platformHash, uint256 implementationId, address implementation) external - view override - returns (address treasuryAddress, bool isDeployed); + onlyPlatformAdmin(platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`identifierHash`|`bytes32`|The unique hash identifier of the campaign.| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| - -**Returns** - -|Name|Type|Description| -|----|----|-----------| -|`treasuryAddress`|`address`|The computed treasury address.| -|`isDeployed`|`bool`|A boolean indicating whether the treasury is already deployed.| - - -### addBytecodeChunk - -*Function to add a fragment of the full bytecode of treasury contract for a given platform.* - - -```solidity -function addBytecodeChunk( - bytes32 platformBytes, - uint256 bytecodeIndex, - uint256 chunkIndex, - bool isLastChunk, - bytes memory bytecodeChunk -) external override onlyPlatformAdmin(platformBytes); -``` -**Parameters** +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The ID to assign to the implementation.| +|`implementation`|`address`|The contract address of the implementation.| -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| -|`chunkIndex`|`uint256`|The index of the bytecode chunk.| -|`isLastChunk`|`bool`|The boolean to determine if this is the last chunk.| -|`bytecodeChunk`|`bytes`|The bytecode fragment to add.| +### approveTreasuryImplementation -### removeBytecode +Approves a previously registered implementation. -*Function to remove a bytecode template for a specific platform and index.* +*Callable only by the protocol admin.* ```solidity -function removeBytecode(bytes32 platformBytes, uint256 bytecodeIndex) +function approveTreasuryImplementation(bytes32 platformHash, uint256 implementationId) external override - onlyPlatformAdmin(platformBytes); + onlyProtocolAdmin; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The ID of the implementation to approve.| -### enlistBytecode +### disapproveTreasuryImplementation -*Function to enlist a bytecode template for deployment.* +Disapproves a previously approved treasury implementation. ```solidity -function enlistBytecode(bytes32 platformBytes, uint256 bytecodeIndex) external onlyProtocolAdmin; +function disapproveTreasuryImplementation(address implementation) external override onlyProtocolAdmin; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the enlisted bytecode template.| +|`implementation`|`address`|The address of the implementation to disapprove.| -### delistBytecode +### removeTreasuryImplementation -*Function to delist a bytecode template, making it unavailable for deployment.* +Removes a registered treasury implementation from a platform. ```solidity -function delistBytecode(bytes32 platformBytes, uint256 bytecodeIndex) external onlyProtocolAdmin; +function removeTreasuryImplementation(bytes32 platformHash, uint256 implementationId) + external + override + onlyPlatformAdmin(platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the delisted bytecode template.| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The implementation ID to remove.| ### deploy -*Function to deploy a new treasury contract with a specified bytecode template.* +Deploys a treasury clone using an approved implementation. + +*Callable only by the platform admin.* ```solidity -function deploy(bytes32 platformBytes, uint256 bytecodeIndex, address infoAddress) - external - override - onlyPlatformAdmin(platformBytes); +function deploy( + bytes32 platformHash, + address infoAddress, + uint256 implementationId, + string calldata name, + string calldata symbol +) external override onlyPlatformAdmin(platformHash) returns (address clone); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template to use for deployment.| -|`infoAddress`|`address`|The address of the associated campaign.| - - -### _concatenateBytes +|`platformHash`|`bytes32`|The platform identifier.| +|`infoAddress`|`address`|The address of the campaign info contract.| +|`implementationId`|`uint256`|The ID of the implementation to use.| +|`name`|`string`|The name of the treasury token.| +|`symbol`|`string`|The symbol of the treasury token.| -*Concatenates multiple byte arrays into one.* - - -```solidity -function _concatenateBytes(bytes[] memory chunks) private pure returns (bytes memory); -``` -**Parameters** +**Returns** |Name|Type|Description| |----|----|-----------| -|`chunks`|`bytes[]`|The byte arrays to concatenate.| - - -## Events -### TreasuryFactoryBytecodeChunkAdded -*Event emitted when a new bytecode is added for a specific platform and index.* - - -```solidity -event TreasuryFactoryBytecodeChunkAdded( - bytes32 indexed platformBytes, uint256 indexed bytecodeIndex, uint256 indexed bytecodeChunk, bytes bytecode -); -``` - -### TreasuryFactoryBytecodeRemoved -*Event emitted when a bytecode is removed for a specific platform and index.* - - -```solidity -event TreasuryFactoryBytecodeRemoved(bytes32 indexed platformBytes, uint256 indexed bytecodeIndex); -``` - -### TreasuryFactoryBytecodeEnlisted -*Event emitted when a bytecode is enlisted for deployment.* - - -```solidity -event TreasuryFactoryBytecodeEnlisted(bytes32 indexed platformBytes, uint256 indexed bytecodeIndex); -``` - -### TreasuryFactoryBytecodeDelisted -*Event emitted when a bytecode is delisted and no longer available for deployment.* - - -```solidity -event TreasuryFactoryBytecodeDelisted(bytes32 indexed platformBytes, uint256 indexed bytecodeIndex); -``` - -### TreasuryFactoryTreasuryDeployed -*Event emitted when a new treasury is deployed.* +|`clone`|`address`|The address of the deployed treasury contract.| -```solidity -event TreasuryFactoryTreasuryDeployed( - bytes32 indexed platformBytes, uint256 indexed bytecodeIndex, address indexed infoAddress, address treasuryAddress -); -``` - ## Errors ### TreasuryFactoryUnauthorized @@ -258,51 +155,33 @@ error TreasuryFactoryUnauthorized(); error TreasuryFactoryInvalidKey(); ``` -### TreasuryFactoryIncorrectChunkIndex - -```solidity -error TreasuryFactoryIncorrectChunkIndex(); -``` - -### TreasuryFactoryBytecodeExists - -```solidity -error TreasuryFactoryBytecodeExists(); -``` - -### TreasuryFactoryBytecodeIsNotAdded - -```solidity -error TreasuryFactoryBytecodeIsNotAdded(); -``` - -### TreasuryFactoryBytecodeAlreadyApproved +### TreasuryFactoryTreasuryCreationFailed ```solidity -error TreasuryFactoryBytecodeAlreadyApproved(); +error TreasuryFactoryTreasuryCreationFailed(); ``` -### TreasuryFactoryBytecodeIncomplete +### TreasuryFactoryInvalidAddress ```solidity -error TreasuryFactoryBytecodeIncomplete(); +error TreasuryFactoryInvalidAddress(); ``` -### TreasuryFactoryBytecodeNotApproved +### TreasuryFactoryImplementationNotSet ```solidity -error TreasuryFactoryBytecodeNotApproved(); +error TreasuryFactoryImplementationNotSet(); ``` -### TreasuryFactoryTreasuryCreationFailed +### TreasuryFactoryImplementationNotSetOrApproved ```solidity -error TreasuryFactoryTreasuryCreationFailed(); +error TreasuryFactoryImplementationNotSetOrApproved(); ``` -### TreasuryFactoryInvalidAddress +### TreasuryFactoryTreasuryInitializationFailed ```solidity -error TreasuryFactoryInvalidAddress(); +error TreasuryFactoryTreasuryInitializationFailed(); ``` diff --git a/docs/src/src/interfaces/ICampaignData.sol/interface.ICampaignData.md b/docs/src/src/interfaces/ICampaignData.sol/interface.ICampaignData.md index f5d5d693..b2d2439e 100644 --- a/docs/src/src/interfaces/ICampaignData.sol/interface.ICampaignData.md +++ b/docs/src/src/interfaces/ICampaignData.sol/interface.ICampaignData.md @@ -1,5 +1,5 @@ # ICampaignData -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/ICampaignData.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/ICampaignData.sol) An interface for managing campaign data in a CCP. diff --git a/docs/src/src/interfaces/ICampaignInfo.sol/interface.ICampaignInfo.md b/docs/src/src/interfaces/ICampaignInfo.sol/interface.ICampaignInfo.md index 4de37bab..8905cd40 100644 --- a/docs/src/src/interfaces/ICampaignInfo.sol/interface.ICampaignInfo.md +++ b/docs/src/src/interfaces/ICampaignInfo.sol/interface.ICampaignInfo.md @@ -1,5 +1,5 @@ # ICampaignInfo -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/ICampaignInfo.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/ICampaignInfo.sol) An interface for managing campaign information in a crowdfunding system. @@ -26,13 +26,13 @@ Checks if a platform has been selected for the campaign. ```solidity -function checkIfPlatformSelected(bytes32 platformBytes) external view returns (bool); +function checkIfPlatformSelected(bytes32 platformHash) external view returns (bool); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform to check.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform to check.| **Returns** @@ -77,13 +77,13 @@ Retrieves the address of the platform administrator for a specific platform. ```solidity -function getPlatformAdminAddress(bytes32 platformBytes) external view returns (address); +function getPlatformAdminAddress(bytes32 platformHash) external view returns (address); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| **Returns** @@ -173,13 +173,13 @@ Retrieves the platform fee percentage for a specific platform. ```solidity -function getPlatformFeePercent(bytes32 platformBytes) external view returns (uint256); +function getPlatformFeePercent(bytes32 platformHash) external view returns (uint256); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| **Returns** @@ -290,22 +290,31 @@ Updates the selection status of a platform for the campaign. ```solidity -function updateSelectedPlatform(bytes32 platformBytes, bool selection) external; +function updateSelectedPlatform(bytes32 platformHash, bool selection) external; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The bytes32 identifier of the platform.| +|`platformHash`|`bytes32`|The bytes32 identifier of the platform.| |`selection`|`bool`|The new selection status (true or false).| ### paused -*Returns true if the contract is paused, and false otherwise.* +*Returns true if the campaign is paused, and false otherwise.* ```solidity function paused() external view returns (bool); ``` +### cancelled + +*Returns true if the campaign is cancelled, and false otherwise.* + + +```solidity +function cancelled() external view returns (bool); +``` + diff --git a/docs/src/src/interfaces/ICampaignInfoFactory.sol/interface.ICampaignInfoFactory.md b/docs/src/src/interfaces/ICampaignInfoFactory.sol/interface.ICampaignInfoFactory.md index c48efce3..59a31f5e 100644 --- a/docs/src/src/interfaces/ICampaignInfoFactory.sol/interface.ICampaignInfoFactory.md +++ b/docs/src/src/interfaces/ICampaignInfoFactory.sol/interface.ICampaignInfoFactory.md @@ -1,5 +1,5 @@ # ICampaignInfoFactory -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/ICampaignInfoFactory.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/ICampaignInfoFactory.sol) **Inherits:** [ICampaignData](/src/interfaces/ICampaignData.sol/interface.ICampaignData.md) @@ -17,7 +17,7 @@ Creates a new campaign information contract. function createCampaign( address creator, bytes32 identifierHash, - bytes32[] calldata selectedPlatformBytes, + bytes32[] calldata selectedPlatformHash, bytes32[] calldata platformDataKey, bytes32[] calldata platformDataValue, CampaignData calldata campaignData @@ -29,7 +29,7 @@ function createCampaign( |----|----|-----------| |`creator`|`address`|The address of the creator of the campaign.| |`identifierHash`|`bytes32`|The unique identifier hash of the campaign.| -|`selectedPlatformBytes`|`bytes32[]`|An array of platform identifiers selected for the campaign.| +|`selectedPlatformHash`|`bytes32[]`|An array of platform identifiers selected for the campaign.| |`platformDataKey`|`bytes32[]`|An array of platform-specific data keys.| |`platformDataValue`|`bytes32[]`|An array of platform-specific data values.| |`campaignData`|`CampaignData`|The struct containing campaign launch details.| @@ -44,3 +44,10 @@ Emitted when a campaign is successfully created. event CampaignInfoFactoryCampaignCreated(bytes32 indexed identifierHash, address indexed campaignInfoAddress); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`identifierHash`|`bytes32`|The unique identifier hash of the campaign.| +|`campaignInfoAddress`|`address`|The address of the created campaign information contract.| + diff --git a/docs/src/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md b/docs/src/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md index 5cf3c5ab..bbfe9c72 100644 --- a/docs/src/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md +++ b/docs/src/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md @@ -1,5 +1,5 @@ # ICampaignTreasury -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/ICampaignTreasury.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/ICampaignTreasury.sol) An interface for managing campaign treasury contracts. @@ -38,13 +38,13 @@ function claimRefund(uint256 tokenId) external; |`tokenId`|`uint256`|The unique identifier of the refundable token.| -### getplatformBytes +### getplatformHash Retrieves the platform identifier associated with the treasury. ```solidity -function getplatformBytes() external view returns (bytes32); +function getplatformHash() external view returns (bytes32); ``` **Returns** diff --git a/docs/src/src/interfaces/IGlobalParams.sol/interface.IGlobalParams.md b/docs/src/src/interfaces/IGlobalParams.sol/interface.IGlobalParams.md index 7b9136cf..840d1619 100644 --- a/docs/src/src/interfaces/IGlobalParams.sol/interface.IGlobalParams.md +++ b/docs/src/src/interfaces/IGlobalParams.sol/interface.IGlobalParams.md @@ -1,23 +1,23 @@ # IGlobalParams -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/IGlobalParams.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/IGlobalParams.sol) An interface for accessing and managing global parameters of the protocol. ## Functions -### checkIfplatformIsListed +### checkIfPlatformIsListed Checks if a platform is listed in the protocol. ```solidity -function checkIfplatformIsListed(bytes32 _platformBytes) external view returns (bool); +function checkIfPlatformIsListed(bytes32 _platformHash) external view returns (bool); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`_platformBytes`|`bytes32`|The unique identifier of the platform.| +|`_platformHash`|`bytes32`|The unique identifier of the platform.| **Returns** @@ -32,13 +32,13 @@ Retrieves the admin address of a platform. ```solidity -function getPlatformAdminAddress(bytes32 _platformBytes) external view returns (address); +function getPlatformAdminAddress(bytes32 _platformHash) external view returns (address); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`_platformBytes`|`bytes32`|The unique identifier of the platform.| +|`_platformHash`|`bytes32`|The unique identifier of the platform.| **Returns** @@ -113,7 +113,7 @@ Retrieves the owner of platform-specific data. ```solidity -function getPlatformDataOwner(bytes32 platformDataKey) external view returns (bytes32 platformBytes); +function getPlatformDataOwner(bytes32 platformDataKey) external view returns (bytes32 platformHash); ``` **Parameters** @@ -125,7 +125,7 @@ function getPlatformDataOwner(bytes32 platformDataKey) external view returns (by |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier associated with the data.| +|`platformHash`|`bytes32`|The platform identifier associated with the data.| ### getPlatformFeePercent @@ -134,13 +134,13 @@ Retrieves the platform fee percentage for a specific platform. ```solidity -function getPlatformFeePercent(bytes32 platformBytes) external view returns (uint256); +function getPlatformFeePercent(bytes32 platformHash) external view returns (uint256); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| **Returns** @@ -221,13 +221,13 @@ Updates the admin address of a platform. ```solidity -function updatePlatformAdminAddress(bytes32 _platformBytes, address _platformAdminAddress) external; +function updatePlatformAdminAddress(bytes32 _platformHash, address _platformAdminAddress) external; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`_platformBytes`|`bytes32`|The unique identifier of the platform.| +|`_platformHash`|`bytes32`|The unique identifier of the platform.| |`_platformAdminAddress`|`address`|The new admin address of the platform.| diff --git a/docs/src/src/interfaces/IItem.sol/interface.IItem.md b/docs/src/src/interfaces/IItem.sol/interface.IItem.md index 657c5aba..e1eef137 100644 --- a/docs/src/src/interfaces/IItem.sol/interface.IItem.md +++ b/docs/src/src/interfaces/IItem.sol/interface.IItem.md @@ -1,5 +1,5 @@ # IItem -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/IItem.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/IItem.sol) An interface for managing items and their attributes. diff --git a/docs/src/src/interfaces/IReward.sol/interface.IReward.md b/docs/src/src/interfaces/IReward.sol/interface.IReward.md new file mode 100644 index 00000000..46b2cc6d --- /dev/null +++ b/docs/src/src/interfaces/IReward.sol/interface.IReward.md @@ -0,0 +1,19 @@ +# IReward +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/IReward.sol) + +An interface for managing rewards in a campaign. + + +## Structs +### Reward + +```solidity +struct Reward { + uint256 rewardValue; + bool isRewardTier; + bytes32[] itemId; + uint256[] itemValue; + uint256[] itemQuantity; +} +``` + diff --git a/docs/src/src/interfaces/ITreasuryFactory.sol/interface.ITreasuryFactory.md b/docs/src/src/interfaces/ITreasuryFactory.sol/interface.ITreasuryFactory.md index 8f9f16ff..92e54b15 100644 --- a/docs/src/src/interfaces/ITreasuryFactory.sol/interface.ITreasuryFactory.md +++ b/docs/src/src/interfaces/ITreasuryFactory.sol/interface.ITreasuryFactory.md @@ -1,92 +1,129 @@ # ITreasuryFactory -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/interfaces/ITreasuryFactory.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/interfaces/ITreasuryFactory.sol) -*Interface for the TreasuryFactory contract, which deploys campaign treasuries with specific bytecode.* +*Interface for the TreasuryFactory contract, which registers, approves, and deploys treasury clones.* ## Functions -### computeTreasuryAddress +### registerTreasuryImplementation -*Function to compute the address of a treasury based on the identifier hash, platform, and bytecode index.* +Registers a treasury implementation for a given platform. + +*Callable only by the platform admin.* ```solidity -function computeTreasuryAddress(bytes32 identifierHash, bytes32 platformBytes, uint256 bytecodeIndex) - external - view - returns (address treasuryAddress, bool isDeployed); +function registerTreasuryImplementation(bytes32 platformHash, uint256 implementationId, address implementation) + external; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`identifierHash`|`bytes32`|The unique hash identifier of the campaign.| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The ID to assign to the implementation.| +|`implementation`|`address`|The contract address of the implementation.| -**Returns** + +### approveTreasuryImplementation + +Approves a previously registered implementation. + +*Callable only by the protocol admin.* + + +```solidity +function approveTreasuryImplementation(bytes32 platformHash, uint256 implementationId) external; +``` +**Parameters** |Name|Type|Description| |----|----|-----------| -|`treasuryAddress`|`address`|The computed treasury address.| -|`isDeployed`|`bool`|A boolean indicating whether the treasury is already deployed.| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The ID of the implementation to approve.| -### addBytecodeChunk +### disapproveTreasuryImplementation -*Function to add a fragment of the full bytecode of treasury contract for a given platform.* +Disapproves a previously approved treasury implementation. ```solidity -function addBytecodeChunk( - bytes32 platformBytes, - uint256 bytecodeIndex, - uint256 chunkIndex, - bool isLastChunk, - bytes memory bytecodeChunk -) external; +function disapproveTreasuryImplementation(address implementation) external; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| -|`chunkIndex`|`uint256`|The index of the bytecode chunk.| -|`isLastChunk`|`bool`|The boolean to determine if this is the last chunk.| -|`bytecodeChunk`|`bytes`|The bytecode fragment to add.| +|`implementation`|`address`|The address of the implementation to disapprove.| -### removeBytecode +### removeTreasuryImplementation -*Function to remove a bytecode template for a specific platform and index.* +Removes a registered treasury implementation from a platform. ```solidity -function removeBytecode(bytes32 platformBytes, uint256 bytecodeIndex) external; +function removeTreasuryImplementation(bytes32 platformHash, uint256 implementationId) external; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template.| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The implementation ID to remove.| ### deploy -*Function to deploy a new treasury contract with a specified bytecode template.* +Deploys a treasury clone using an approved implementation. + +*Callable only by the platform admin.* ```solidity -function deploy(bytes32 platformBytes, uint256 bytecodeIndex, address infoAddress) external; +function deploy( + bytes32 platformHash, + address infoAddress, + uint256 implementationId, + string calldata name, + string calldata symbol +) external returns (address clone); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The platform identifier.| -|`bytecodeIndex`|`uint256`|The index of the bytecode template to use for deployment.| -|`infoAddress`|`address`|The address of the associated campaign.| +|`platformHash`|`bytes32`|The platform identifier.| +|`infoAddress`|`address`|The address of the campaign info contract.| +|`implementationId`|`uint256`|The ID of the implementation to use.| +|`name`|`string`|The name of the treasury token.| +|`symbol`|`string`|The symbol of the treasury token.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`clone`|`address`|The address of the deployed treasury contract.| + +## Events +### TreasuryFactoryTreasuryDeployed +*Emitted when a new treasury is deployed.* + + +```solidity +event TreasuryFactoryTreasuryDeployed( + bytes32 indexed platformHash, uint256 indexed implementationId, address indexed infoAddress, address treasuryAddress +); +``` + +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`platformHash`|`bytes32`|The platform identifier.| +|`implementationId`|`uint256`|The ID of the approved implementation.| +|`infoAddress`|`address`|The campaign info address linked to the treasury.| +|`treasuryAddress`|`address`|The deployed treasury address.| diff --git a/docs/src/src/interfaces/README.md b/docs/src/src/interfaces/README.md index 970b736e..e6bafb40 100644 --- a/docs/src/src/interfaces/README.md +++ b/docs/src/src/interfaces/README.md @@ -7,4 +7,5 @@ - [ICampaignTreasury](ICampaignTreasury.sol/interface.ICampaignTreasury.md) - [IGlobalParams](IGlobalParams.sol/interface.IGlobalParams.md) - [IItem](IItem.sol/interface.IItem.md) +- [IReward](IReward.sol/interface.IReward.md) - [ITreasuryFactory](ITreasuryFactory.sol/interface.ITreasuryFactory.md) diff --git a/docs/src/src/treasuries/AllOrNothing.sol/contract.AllOrNothing.md b/docs/src/src/treasuries/AllOrNothing.sol/contract.AllOrNothing.md index 56ae4f1c..ef5a9767 100644 --- a/docs/src/src/treasuries/AllOrNothing.sol/contract.AllOrNothing.md +++ b/docs/src/src/treasuries/AllOrNothing.sol/contract.AllOrNothing.md @@ -1,24 +1,17 @@ # AllOrNothing -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/treasuries/AllOrNothing.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/treasuries/AllOrNothing.sol) **Inherits:** -[BaseTreasury](/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md), [TimestampChecker](/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md), [FiatEnabled](/src/utils/FiatEnabled.sol/abstract.FiatEnabled.md), ERC721Burnable +[IReward](/src/interfaces/IReward.sol/interface.IReward.md), [BaseTreasury](/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md), [TimestampChecker](/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md), ERC721Burnable A contract for handling crowdfunding campaigns with rewards. ## State Variables -### PRELAUNCH_PLEDGE +### s_tokenToCollectedAmount ```solidity -uint256 private constant PRELAUNCH_PLEDGE = 1 ether; -``` - - -### s_tokenToPledgedAmount - -```solidity -mapping(uint256 => uint256) private s_tokenToPledgedAmount; +mapping(uint256 => uint256) private s_tokenToCollectedAmount; ``` @@ -43,6 +36,20 @@ Counters.Counter private s_rewardCounter; ``` +### s_name + +```solidity +string private s_name; +``` + + +### s_symbol + +```solidity +string private s_symbol; +``` + + ## Functions ### constructor @@ -50,16 +57,32 @@ Counters.Counter private s_rewardCounter; ```solidity -constructor(bytes32 platformBytes, address infoAddress) ERC721("", "") BaseTreasury(platformBytes, infoAddress); +constructor() ERC721("", ""); ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| -|`infoAddress`|`address`|The address of the campaign information contract.| +### initialize + + +```solidity +function initialize(bytes32 _platformHash, address _infoAddress, string calldata _name, string calldata _symbol) + external + initializer; +``` + +### name +```solidity +function name() public view override returns (string memory); +``` + +### symbol + + +```solidity +function symbol() public view override returns (string memory); +``` + ### getReward Retrieves the details of a reward. @@ -106,7 +129,9 @@ function addReward(bytes32 rewardName, Reward calldata reward) external onlyCampaignOwner whenCampaignNotPaused - whenNotPaused; + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled; ``` **Parameters** @@ -116,79 +141,47 @@ function addReward(bytes32 rewardName, Reward calldata reward) |`reward`|`Reward`|The details of the reward as a `Reward` struct.| -### removeReward - -Removes a reward from the campaign. - - -```solidity -function removeReward(bytes32 rewardName) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused; -``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`rewardName`|`bytes32`|The name of the reward.| - - -### updateFiatPledge - -Updates the fiat pledge transaction. - - -```solidity -function updateFiatPledge(bytes32 fiatPledgeId, uint256 fiatPledgeAmount) - external - onlyPlatformAdmin(PLATFORM_BYTES) - whenCampaignNotPaused - whenNotPaused; -``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`fiatPledgeId`|`bytes32`|The unique identifier of the fiat pledge.| -|`fiatPledgeAmount`|`uint256`|The amount of the fiat pledge.| - - -### updateFiatFeeDisbursementState +### addRewardsBatch -Updates the state of fiat fee disbursement. +Adds multiple rewards in a batch. ```solidity -function updateFiatFeeDisbursementState(bool isDisbursed, uint256 protocolFeeAmount, uint256 platformFeeAmount) +function addRewardsBatch(bytes32[] calldata rewardNames, Reward[] calldata rewards) external - onlyPlatformAdmin(PLATFORM_BYTES) + onlyCampaignOwner whenCampaignNotPaused - whenNotPaused; + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`isDisbursed`|`bool`|Whether fiat fees are disbursed.| -|`protocolFeeAmount`|`uint256`|The protocol fee amount.| -|`platformFeeAmount`|`uint256`|The platform fee amount.| +|`rewardNames`|`bytes32[]`|An array of reward names.| +|`rewards`|`Reward[]`|An array of `Reward` structs containing reward details.| -### pledgeOnPreLaunch +### removeReward -Allows a backer to make a pre-launch pledge. +Removes a reward from the campaign. ```solidity -function pledgeOnPreLaunch(address backer) +function removeReward(bytes32 rewardName) external - currentTimeIsLess(INFO.getLaunchTime()) + onlyCampaignOwner whenCampaignNotPaused - whenNotPaused; + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`backer`|`address`|The address of the backer making the pledge.| +|`rewardName`|`bytes32`|The name of the reward.| ### pledgeForAReward @@ -197,17 +190,20 @@ Allows a backer to pledge for a reward. ```solidity -function pledgeForAReward(address backer, bytes32[] calldata reward) +function pledgeForAReward(address backer, uint256 shippingFee, bytes32[] calldata reward) external currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) whenCampaignNotPaused - whenNotPaused; + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled; ``` **Parameters** |Name|Type|Description| |----|----|-----------| |`backer`|`address`|The address of the backer making the pledge.| +|`shippingFee`|`uint256`|| |`reward`|`bytes32[]`|An array of reward names.| @@ -221,7 +217,9 @@ function pledgeWithoutAReward(address backer, uint256 pledgeAmount) external currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) whenCampaignNotPaused - whenNotPaused; + whenNotPaused + whenCampaignNotCancelled + whenNotCancelled; ``` **Parameters** @@ -239,7 +237,7 @@ Allows a backer to claim a refund. ```solidity function claimRefund(uint256 tokenId) external - currentTimeIsWithinRange(INFO.getLaunchTime(), INFO.getDeadline()) + currentTimeIsGreater(INFO.getLaunchTime()) whenCampaignNotPaused whenNotPaused; ``` @@ -256,16 +254,39 @@ Disburses fees collected by the treasury. ```solidity -function disburseFees() public override currentTimeIsGreater(INFO.getDeadline()); +function disburseFees() public override currentTimeIsGreater(INFO.getDeadline()) whenNotPaused whenNotCancelled; +``` + +### withdraw + +Withdraws funds from the treasury. + + +```solidity +function withdraw() public override whenNotPaused whenNotCancelled; ``` -### _checkIfPlatformAdmin +### cancelTreasury -*Checks if the caller is the platform admin.* +*This function is overridden to allow the platform admin and the campaign owner to cancel a treasury.* ```solidity -function _checkIfPlatformAdmin() internal view; +function cancelTreasury(bytes32 message) public override; +``` + +### _pledge + + +```solidity +function _pledge( + address backer, + bytes32 reward, + uint256 pledgeAmount, + uint256 shippingFee, + uint256 tokenId, + bytes32[] memory rewards +) internal; ``` ### _checkSuccessCondition @@ -300,12 +321,23 @@ event Receipt( address indexed backer, bytes32 indexed reward, uint256 pledgeAmount, + uint256 shippingFee, uint256 tokenId, - bool isPreLaunchPledge, bytes32[] rewards ); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`backer`|`address`|The address of the backer making the pledge.| +|`reward`|`bytes32`|The name of the reward.| +|`pledgeAmount`|`uint256`|The amount pledged.| +|`shippingFee`|`uint256`|| +|`tokenId`|`uint256`|The ID of the token representing the pledge.| +|`rewards`|`bytes32[]`|An array of reward names.| + ### RewardAdded *Emitted when a reward is added to the campaign.* @@ -314,6 +346,13 @@ event Receipt( event RewardAdded(bytes32 indexed rewardName, Reward reward); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`rewardName`|`bytes32`|The name of the reward.| +|`reward`|`Reward`|The details of the reward.| + ### RewardRemoved *Emitted when a reward is removed from the campaign.* @@ -322,6 +361,12 @@ event RewardAdded(bytes32 indexed rewardName, Reward reward); event RewardRemoved(bytes32 indexed rewardName); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`rewardName`|`bytes32`|The name of the reward.| + ### RefundClaimed *Emitted when a refund is claimed.* @@ -330,6 +375,14 @@ event RewardRemoved(bytes32 indexed rewardName); event RefundClaimed(uint256 tokenId, uint256 refundAmount, address claimer); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`tokenId`|`uint256`|The ID of the token representing the pledge.| +|`refundAmount`|`uint256`|The refund amount claimed.| +|`claimer`|`address`|The address of the claimer.| + ## Errors ### AllOrNothingUnAuthorized *Emitted when an unauthorized action is attempted.* @@ -371,6 +424,14 @@ error AllOrNothingNotSuccessful(); error AllOrNothingFeeNotDisbursed(); ``` +### AllOrNothingFeeAlreadyDisbursed +*Emitted when `disburseFees` after fee is disbursed already.* + + +```solidity +error AllOrNothingFeeAlreadyDisbursed(); +``` + ### AllOrNothingRewardExists *Emitted when a `Reward` already exists for given input.* @@ -387,16 +448,9 @@ error AllOrNothingRewardExists(); error AllOrNothingNotClaimable(uint256 tokenId); ``` -## Structs -### Reward +**Parameters** -```solidity -struct Reward { - uint256 rewardValue; - bool isRewardTier; - bytes32[] itemId; - uint256[] itemValue; - uint256[] itemQuantity; -} -``` +|Name|Type|Description| +|----|----|-----------| +|`tokenId`|`uint256`|The ID of the token representing the pledge.| diff --git a/docs/src/src/treasuries/KeepWhatsRaised.sol/contract.KeepWhatsRaised.md b/docs/src/src/treasuries/KeepWhatsRaised.sol/contract.KeepWhatsRaised.md index 41680788..7d89ed06 100644 --- a/docs/src/src/treasuries/KeepWhatsRaised.sol/contract.KeepWhatsRaised.md +++ b/docs/src/src/treasuries/KeepWhatsRaised.sol/contract.KeepWhatsRaised.md @@ -1,4 +1,5 @@ # KeepWhatsRaised + [Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/treasuries/KeepWhatsRaised.sol) **Inherits:** @@ -6,38 +7,35 @@ A contract that keeps all the funds raised, regardless of the success condition. -*This contract inherits from the `AllOrNothing` contract and overrides the `_checkSuccessCondition` function to always return true.* - +_This contract inherits from the `AllOrNothing` contract and overrides the `_checkSuccessCondition` function to always return true._ ## Functions -### constructor -*Initializes the KeepWhatsRaised contract.* +### constructor +_Initializes the KeepWhatsRaised contract._ ```solidity -constructor(bytes32 platformBytes, address infoAddress) AllOrNothing(platformBytes, infoAddress); +constructor(bytes32 platformHash, address infoAddress) AllOrNothing(platformHash, infoAddress); ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| -|`infoAddress`|`address`|The address of the associated campaign information contract.| +**Parameters** -### _checkSuccessCondition +| Name | Type | Description | +| -------------- | --------- | ------------------------------------------------------------ | +| `platformHash` | `bytes32` | The unique identifier of the platform. | +| `infoAddress` | `address` | The address of the associated campaign information contract. | -*Internal function to check the success condition for fee disbursement.* +### \_checkSuccessCondition +_Internal function to check the success condition for fee disbursement._ ```solidity function _checkSuccessCondition() internal pure override returns (bool); ``` -**Returns** - -|Name|Type|Description| -|----|----|-----------| -|``|`bool`|Whether the success condition is met.| +**Returns** +| Name | Type | Description | +| -------- | ------ | ------------------------------------- | +| `` | `bool` | Whether the success condition is met. | diff --git a/docs/src/src/treasuries/MinimumOrder.sol/contract.MinimumOrder.md b/docs/src/src/treasuries/MinimumOrder.sol/contract.MinimumOrder.md index 0e0c6d28..2addf548 100644 --- a/docs/src/src/treasuries/MinimumOrder.sol/contract.MinimumOrder.md +++ b/docs/src/src/treasuries/MinimumOrder.sol/contract.MinimumOrder.md @@ -1,4 +1,5 @@ # MinimumOrder + [Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/treasuries/MinimumOrder.sol) **Inherits:** @@ -8,73 +9,66 @@ A Solidity contract for managing minimum order-based campaigns. Users can pre-order items or rewards, and when a predefined success metric is reached, the campaign succeeds, and backers receive their rewards. - ## State Variables + ### SUCCESS_METRIC ```solidity uint256 internal immutable SUCCESS_METRIC; ``` - ### s_preOrderValueAmount ```solidity uint256 private s_preOrderValueAmount; ``` - ### s_platformFeePercent ```solidity uint256 private s_platformFeePercent; ``` - ### s_tokenToPledgedAmount ```solidity mapping(uint256 => uint256) private s_tokenToPledgedAmount; ``` - ### s_reward ```solidity mapping(bytes32 => Reward) private s_reward; ``` - ### s_tokenIdCounter ```solidity Counters.Counter private s_tokenIdCounter; ``` - ### s_numberOfPreOrders ```solidity Counters.Counter internal s_numberOfPreOrders; ``` - ## Functions -### constructor -*Constructor for the MinimumOrder contract.* +### constructor +_Constructor for the MinimumOrder contract._ ```solidity -constructor(bytes32 platformBytes, address infoAddress) ERC721("", "") BaseTreasury(platformBytes, infoAddress); +constructor(bytes32 platformHash, address infoAddress) ERC721("", "") BaseTreasury(platformHash, infoAddress); ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| -|`infoAddress`|`address`|The address of the CampaignInfo contract providing campaign details.| +**Parameters** +| Name | Type | Description | +| -------------- | --------- | -------------------------------------------------------------------- | +| `platformHash` | `bytes32` | The unique identifier of the platform. | +| `infoAddress` | `address` | The address of the CampaignInfo contract providing campaign details. | ### getNumberOfOrders @@ -82,59 +76,55 @@ bytes32 of `PreOrder0MinimumOrder(uint256)` Function to get the number of pre-orders made. - ```solidity function getNumberOfOrders() internal view returns (uint256); ``` -**Returns** -|Name|Type|Description| -|----|----|-----------| -|``|`uint256`|The number of pre-orders.| +**Returns** +| Name | Type | Description | +| -------- | --------- | ------------------------- | +| `` | `uint256` | The number of pre-orders. | ### getReward Function to get reward details by name. - ```solidity function getReward(bytes32 rewardName) external view returns (Reward memory); ``` + **Parameters** -|Name|Type|Description| -|----|----|-----------| -|`rewardName`|`bytes32`|The name of the reward.| +| Name | Type | Description | +| ------------ | --------- | ----------------------- | +| `rewardName` | `bytes32` | The name of the reward. | **Returns** -|Name|Type|Description| -|----|----|-----------| -|``|`Reward`|The reward details, including value, item IDs, values, and quantities.| - +| Name | Type | Description | +| -------- | -------- | ---------------------------------------------------------------------- | +| `` | `Reward` | The reward details, including value, item IDs, values, and quantities. | ### getRaisedAmount Function to get the total raised amount during the campaign. - ```solidity function getRaisedAmount() external view returns (uint256); ``` -**Returns** -|Name|Type|Description| -|----|----|-----------| -|``|`uint256`|The total raised amount.| +**Returns** +| Name | Type | Description | +| -------- | --------- | ------------------------ | +| `` | `uint256` | The total raised amount. | ### addReward Function to add a new reward to the campaign. Only the campaign owner can add rewards. - ```solidity function addReward(bytes32 rewardName, Reward calldata reward) external @@ -142,36 +132,34 @@ function addReward(bytes32 rewardName, Reward calldata reward) whenCampaignNotPaused whenNotPaused; ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`rewardName`|`bytes32`|The name of the reward.| -|`reward`|`Reward`|The reward details, including value, item IDs, values, and quantities.| +**Parameters** +| Name | Type | Description | +| ------------ | --------- | ---------------------------------------------------------------------- | +| `rewardName` | `bytes32` | The name of the reward. | +| `reward` | `Reward` | The reward details, including value, item IDs, values, and quantities. | ### removeReward Function to remove a reward from the campaign. Only the campaign owner can remove rewards. - ```solidity function removeReward(bytes32 rewardName) external onlyCampaignOwner whenCampaignNotPaused whenNotPaused; ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`rewardName`|`bytes32`|The name of the reward to be removed.| +**Parameters** +| Name | Type | Description | +| ------------ | --------- | ------------------------------------- | +| `rewardName` | `bytes32` | The name of the reward to be removed. | ### preOrderForAReward Function for backers to pre-order a reward. The pre-order can only be made within the specified campaign timeframe. - ```solidity function preOrderForAReward(address backer, bytes32 rewardName) public @@ -180,116 +168,116 @@ function preOrderForAReward(address backer, bytes32 rewardName) whenCampaignNotPaused whenNotPaused; ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`backer`|`address`|The address of the backer making the pre-order.| -|`rewardName`|`bytes32`|The name of the reward to pre-order.| +**Parameters** +| Name | Type | Description | +| ------------ | --------- | ----------------------------------------------- | +| `backer` | `address` | The address of the backer making the pre-order. | +| `rewardName` | `bytes32` | The name of the reward to pre-order. | ### claimRefund Function for backers to claim a refund if the campaign has not met the success metric. - ```solidity function claimRefund(uint256 tokenId) external whenCampaignNotPaused whenNotPaused; ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`tokenId`|`uint256`|The unique token ID associated with the refund.| +**Parameters** -### _checkSuccessCondition +| Name | Type | Description | +| --------- | --------- | ----------------------------------------------- | +| `tokenId` | `uint256` | The unique token ID associated with the refund. | -*Internal function to check the success condition for fee disbursement.* +### \_checkSuccessCondition +_Internal function to check the success condition for fee disbursement._ ```solidity function _checkSuccessCondition() internal view virtual override returns (bool); ``` -**Returns** -|Name|Type|Description| -|----|----|-----------| -|``|`bool`|Whether the success condition is met.| +**Returns** +| Name | Type | Description | +| -------- | ------ | ------------------------------------- | +| `` | `bool` | Whether the success condition is met. | ### supportsInterface Function to check if an address is supported by the ERC721 contract. - ```solidity function supportsInterface(bytes4 interfaceId) public view override returns (bool); ``` + **Parameters** -|Name|Type|Description| -|----|----|-----------| -|`interfaceId`|`bytes4`|The ERC721 interface ID to check.| +| Name | Type | Description | +| ------------- | -------- | --------------------------------- | +| `interfaceId` | `bytes4` | The ERC721 interface ID to check. | **Returns** -|Name|Type|Description| -|----|----|-----------| -|``|`bool`|True if the interface is supported, false otherwise.| - +| Name | Type | Description | +| -------- | ------ | ---------------------------------------------------- | +| `` | `bool` | True if the interface is supported, false otherwise. | ## Events + ### Receipt -*Event emitted when a backer makes a pledge.* +_Event emitted when a backer makes a pledge._ ```solidity event Receipt(address indexed backer, bytes32 indexed reward, uint256 pledgeAmount, uint256 tokenId); ``` ### RewardAdded -*Event emitted when a reward is added to the campaign.* +_Event emitted when a reward is added to the campaign._ ```solidity event RewardAdded(bytes32 indexed rewardName, Reward reward); ``` ### RewardRemoved -*Event emitted when a reward is removed from the campaign.* +_Event emitted when a reward is removed from the campaign._ ```solidity event RewardRemoved(bytes32 indexed rewardName); ``` ### RefundClaimed -*Event emitted when a refund is claimed by a backer.* +_Event emitted when a refund is claimed by a backer._ ```solidity event RefundClaimed(uint256 tokenId, uint256 refundAmount, address claimer); ``` ## Errors + ### PreOrderTransferFailed -*Throws an error indicating that the pre-order transfer failed.* +_Throws an error indicating that the pre-order transfer failed._ ```solidity error PreOrderTransferFailed(); ``` ### PreOrderInvalidInput -*Throws an error indicating that the pre-order input is invalid.* +_Throws an error indicating that the pre-order input is invalid._ ```solidity error PreOrderInvalidInput(); ``` ## Structs + ### Reward ```solidity @@ -300,4 +288,3 @@ struct Reward { uint256[] itemQuantity; } ``` - diff --git a/docs/src/src/treasuries/OutOfStock.sol/contract.OutOfStock.md b/docs/src/src/treasuries/OutOfStock.sol/contract.OutOfStock.md index cc22b272..2c95f9d2 100644 --- a/docs/src/src/treasuries/OutOfStock.sol/contract.OutOfStock.md +++ b/docs/src/src/treasuries/OutOfStock.sol/contract.OutOfStock.md @@ -1,4 +1,5 @@ # OutOfStock + [Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/treasuries/OutOfStock.sol) **Inherits:** @@ -8,30 +9,28 @@ A Solidity contract for managing minimum order-based campaigns with an out-of-st Users can pre-order items or rewards until the out-of-stock limit is reached. When the predefined success metric is reached or the out-of-stock limit is reached, the campaign ends. - ## Functions -### constructor -*Constructor for the OutOfStock contract.* +### constructor +_Constructor for the OutOfStock contract._ ```solidity -constructor(bytes32 platformBytes, address infoAddress) MinimumOrder(platformBytes, infoAddress); +constructor(bytes32 platformHash, address infoAddress) MinimumOrder(platformHash, infoAddress); ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| -|`infoAddress`|`address`|The address of the CampaignInfo contract providing campaign details.| +**Parameters** +| Name | Type | Description | +| -------------- | --------- | -------------------------------------------------------------------- | +| `platformHash` | `bytes32` | The unique identifier of the platform. | +| `infoAddress` | `address` | The address of the CampaignInfo contract providing campaign details. | ### preOrderForAReward Function for backers to pre-order a reward, checking against the out-of-stock limit. The pre-order can only be made within the specified campaign timeframe. - ```solidity function preOrderForAReward(address backer, bytes32 rewardName) public @@ -40,20 +39,20 @@ function preOrderForAReward(address backer, bytes32 rewardName) whenCampaignNotPaused whenNotPaused; ``` -**Parameters** -|Name|Type|Description| -|----|----|-----------| -|`backer`|`address`|The address of the backer making the pre-order.| -|`rewardName`|`bytes32`|The name of the reward to pre-order.| +**Parameters** +| Name | Type | Description | +| ------------ | --------- | ----------------------------------------------- | +| `backer` | `address` | The address of the backer making the pre-order. | +| `rewardName` | `bytes32` | The name of the reward to pre-order. | ## Errors + ### OutOfStockLimitReached -*Throws an error indicating the out-of-stock limit has been reached.* +_Throws an error indicating the out-of-stock limit has been reached._ ```solidity error OutOfStockLimitReached(); ``` - diff --git a/docs/src/src/treasuries/README.md b/docs/src/src/treasuries/README.md index 3bd64133..c01d8d76 100644 --- a/docs/src/src/treasuries/README.md +++ b/docs/src/src/treasuries/README.md @@ -2,6 +2,3 @@ # Contents - [AllOrNothing](AllOrNothing.sol/contract.AllOrNothing.md) -- [KeepWhatsRaised](KeepWhatsRaised.sol/contract.KeepWhatsRaised.md) -- [MinimumOrder](MinimumOrder.sol/contract.MinimumOrder.md) -- [OutOfStock](OutOfStock.sol/contract.OutOfStock.md) diff --git a/docs/src/src/utils/AddressCalculator.sol/library.AddressCalculator.md b/docs/src/src/utils/AddressCalculator.sol/library.AddressCalculator.md index c5cdce6b..6daa3a46 100644 --- a/docs/src/src/utils/AddressCalculator.sol/library.AddressCalculator.md +++ b/docs/src/src/utils/AddressCalculator.sol/library.AddressCalculator.md @@ -1,5 +1,5 @@ # AddressCalculator -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/AddressCalculator.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/AddressCalculator.sol) A Solidity library for computing contract addresses and checking if a contract is deployed at a given address. diff --git a/docs/src/src/utils/AdminAccessChecker.sol/abstract.AdminAccessChecker.md b/docs/src/src/utils/AdminAccessChecker.sol/abstract.AdminAccessChecker.md index c1545ff0..6249f4a2 100644 --- a/docs/src/src/utils/AdminAccessChecker.sol/abstract.AdminAccessChecker.md +++ b/docs/src/src/utils/AdminAccessChecker.sol/abstract.AdminAccessChecker.md @@ -1,5 +1,5 @@ # AdminAccessChecker -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/AdminAccessChecker.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/AdminAccessChecker.sol) *This abstract contract provides access control mechanisms to restrict the execution of specific functions to authorized protocol administrators and platform administrators.* @@ -9,25 +9,17 @@ to authorized protocol administrators and platform administrators.* ### GLOBAL_PARAMS ```solidity -IGlobalParams internal immutable GLOBAL_PARAMS; +IGlobalParams internal GLOBAL_PARAMS; ``` ## Functions -### constructor - -*Constructor to initialize the contract with the address of the global parameters contract.* +### __AccessChecker_init ```solidity -constructor(IGlobalParams globalParams); +function __AccessChecker_init(IGlobalParams globalParams) internal; ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`globalParams`|`IGlobalParams`|The address of the IGlobalParams contract.| - ### onlyProtocolAdmin @@ -46,39 +38,39 @@ Users attempting to execute functions with this modifier must be the platform ad ```solidity -modifier onlyPlatformAdmin(bytes32 platformBytes); +modifier onlyPlatformAdmin(bytes32 platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| -### _checkIfProtocolAdmin +### _onlyProtocolAdmin *Internal function to check if the sender is the protocol administrator. If the sender is not the protocol admin, it reverts with AdminAccessCheckerUnauthorized error.* ```solidity -function _checkIfProtocolAdmin() private view; +function _onlyProtocolAdmin() private view; ``` -### _checkIfPlatformAdmin +### _onlyPlatformAdmin *Internal function to check if the sender is the platform administrator for a specific platform. If the sender is not the platform admin, it reverts with AdminAccessCheckerUnauthorized error.* ```solidity -function _checkIfPlatformAdmin(bytes32 platformBytes) private view; +function _onlyPlatformAdmin(bytes32 platformHash) private view; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| ## Errors diff --git a/docs/src/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md b/docs/src/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md index cc70ccf4..1f9d835e 100644 --- a/docs/src/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md +++ b/docs/src/src/utils/BaseTreasury.sol/abstract.BaseTreasury.md @@ -1,8 +1,8 @@ # BaseTreasury -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/BaseTreasury.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/BaseTreasury.sol) **Inherits:** -[ICampaignTreasury](/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md), [CampaignAccessChecker](/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md), [PausableWithMsg](/src/utils/PausableWithMsg.sol/abstract.PausableWithMsg.md) +Initializable, [ICampaignTreasury](/src/interfaces/ICampaignTreasury.sol/interface.ICampaignTreasury.md), [CampaignAccessChecker](/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md), [PausableCancellable](/src/utils/PausableCancellable.sol/abstract.PausableCancellable.md) A base contract for creating and managing treasuries in crowdfunding campaigns. @@ -26,64 +26,55 @@ uint256 internal constant PERCENT_DIVIDER = 10000; ``` -### PLATFORM_BYTES +### PLATFORM_HASH ```solidity -bytes32 internal immutable PLATFORM_BYTES; +bytes32 internal PLATFORM_HASH; ``` ### PLATFORM_FEE_PERCENT ```solidity -uint256 internal immutable PLATFORM_FEE_PERCENT; +uint256 internal PLATFORM_FEE_PERCENT; ``` ### TOKEN ```solidity -IERC20 internal immutable TOKEN; +IERC20 internal TOKEN; ``` ### CAMPAIGN_INFO ```solidity -ICampaignInfo internal immutable CAMPAIGN_INFO; +ICampaignInfo internal CAMPAIGN_INFO; ``` -### s_pledgedAmountInCrypto +### s_pledgedAmount ```solidity -uint256 internal s_pledgedAmountInCrypto; +uint256 internal s_pledgedAmount; ``` -### s_cryptoFeeDisbursed +### s_feesDisbursed ```solidity -bool internal s_cryptoFeeDisbursed; +bool internal s_feesDisbursed; ``` ## Functions -### constructor - -*Constructs a new BaseTreasury instance.* +### __BaseContract_init ```solidity -constructor(bytes32 platformBytes, address infoAddress) CampaignAccessChecker(infoAddress); +function __BaseContract_init(bytes32 platformHash, address infoAddress) internal; ``` -**Parameters** - -|Name|Type|Description| -|----|----|-----------| -|`platformBytes`|`bytes32`|The identifier for the platform associated with this treasury.| -|`infoAddress`|`address`|The address of the CampaignInfo contract.| - ### whenCampaignNotPaused @@ -94,13 +85,20 @@ constructor(bytes32 platformBytes, address infoAddress) CampaignAccessChecker(in modifier whenCampaignNotPaused(); ``` -### getplatformBytes +### whenCampaignNotCancelled + + +```solidity +modifier whenCampaignNotCancelled(); +``` + +### getplatformHash Retrieves the platform identifier associated with the treasury. ```solidity -function getplatformBytes() external view override returns (bytes32); +function getplatformHash() external view override returns (bytes32); ``` **Returns** @@ -130,7 +128,7 @@ Disburses fees collected by the treasury. ```solidity -function disburseFees() public virtual override whenCampaignNotPaused; +function disburseFees() public virtual override whenCampaignNotPaused whenCampaignNotCancelled; ``` ### withdraw @@ -139,35 +137,51 @@ Withdraws funds from the treasury. ```solidity -function withdraw() public virtual override whenCampaignNotPaused; +function withdraw() public virtual override whenCampaignNotPaused whenCampaignNotCancelled; ``` -### _pauseTreasury +### pauseTreasury *External function to pause the campaign.* ```solidity -function _pauseTreasury(bytes32 message) external onlyPlatformAdmin(PLATFORM_BYTES); +function pauseTreasury(bytes32 message) public virtual onlyPlatformAdmin(PLATFORM_HASH); ``` -### _unpauseTreasury +### unpauseTreasury *External function to unpause the campaign.* ```solidity -function _unpauseTreasury(bytes32 message) external onlyPlatformAdmin(PLATFORM_BYTES); +function unpauseTreasury(bytes32 message) public virtual onlyPlatformAdmin(PLATFORM_HASH); +``` + +### cancelTreasury + +*External function to cancel the campaign.* + + +```solidity +function cancelTreasury(bytes32 message) public virtual onlyPlatformAdmin(PLATFORM_HASH); ``` -### _checkIfCampaignPaused +### _revertIfCampaignPaused *Internal function to check if the campaign is paused. If the campaign is paused, it reverts with TreasuryCampaignInfoIsPaused error.* ```solidity -function _checkIfCampaignPaused() internal view; +function _revertIfCampaignPaused() internal view; +``` + +### _revertIfCampaignCancelled + + +```solidity +function _revertIfCampaignCancelled() internal view; ``` ### _checkSuccessCondition @@ -194,14 +208,28 @@ Emitted when fees are successfully disbursed. event FeesDisbursed(uint256 protocolShare, uint256 platformShare); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`protocolShare`|`uint256`|The amount of fees sent to the protocol.| +|`platformShare`|`uint256`|The amount of fees sent to the platform.| + ### WithdrawalSuccessful Emitted when a withdrawal is successful. ```solidity -event WithdrawalSuccessful(address indexed to, uint256 amount); +event WithdrawalSuccessful(address to, uint256 amount); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`to`|`address`|The recipient of the withdrawal.| +|`amount`|`uint256`|The amount withdrawn.| + ### SuccessConditionNotFulfilled Emitted when the success condition is not fulfilled during fee disbursement. diff --git a/docs/src/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md b/docs/src/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md index 336c7cd4..4c39e4e8 100644 --- a/docs/src/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md +++ b/docs/src/src/utils/CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md @@ -1,5 +1,5 @@ # CampaignAccessChecker -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/CampaignAccessChecker.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/CampaignAccessChecker.sol) *This abstract contract provides access control mechanisms to restrict the execution of specific functions to authorized protocol administrators, platform administrators, and campaign owners.* @@ -9,18 +9,18 @@ to authorized protocol administrators, platform administrators, and campaign own ### INFO ```solidity -ICampaignInfo internal immutable INFO; +ICampaignInfo internal INFO; ``` ## Functions -### constructor +### __CampaignAccessChecker_init *Constructor to initialize the contract with the address of the campaign information contract.* ```solidity -constructor(address campaignInfo); +function __CampaignAccessChecker_init(address campaignInfo) internal; ``` **Parameters** @@ -46,13 +46,13 @@ Users attempting to execute functions with this modifier must be the platform ad ```solidity -modifier onlyPlatformAdmin(bytes32 platformBytes); +modifier onlyPlatformAdmin(bytes32 platformHash); ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| ### onlyCampaignOwner @@ -65,40 +65,40 @@ Users attempting to execute functions with this modifier must be the owner of th modifier onlyCampaignOwner(); ``` -### _checkIfProtocolAdmin +### _onlyProtocolAdmin *Internal function to check if the sender is the protocol administrator. If the sender is not the protocol admin, it reverts with AccessCheckerUnauthorized error.* ```solidity -function _checkIfProtocolAdmin() private view; +function _onlyProtocolAdmin() private view; ``` -### _checkIfPlatformAdmin +### _onlyPlatformAdmin *Internal function to check if the sender is the platform administrator for a specific platform. If the sender is not the platform admin, it reverts with AccessCheckerUnauthorized error.* ```solidity -function _checkIfPlatformAdmin(bytes32 platformBytes) private view; +function _onlyPlatformAdmin(bytes32 platformHash) private view; ``` **Parameters** |Name|Type|Description| |----|----|-----------| -|`platformBytes`|`bytes32`|The unique identifier of the platform.| +|`platformHash`|`bytes32`|The unique identifier of the platform.| -### _checkIfCampaignOwner +### _onlyCampaignOwner *Internal function to check if the sender is the owner of the campaign. If the sender is not the owner, it reverts with AccessCheckerUnauthorized error.* ```solidity -function _checkIfCampaignOwner() private view; +function _onlyCampaignOwner() private view; ``` ## Errors diff --git a/docs/src/src/utils/Counters.sol/library.Counters.md b/docs/src/src/utils/Counters.sol/library.Counters.md new file mode 100644 index 00000000..d8d77f16 --- /dev/null +++ b/docs/src/src/utils/Counters.sol/library.Counters.md @@ -0,0 +1,49 @@ +# Counters +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/Counters.sol) + +**Author:** +Matt Condon (@shrugs) + +*Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number +of elements in a mapping, issuing ERC721 ids, or counting request ids. +Include with `using Counters for Counters.Counter;`* + + +## Functions +### current + + +```solidity +function current(Counter storage counter) internal view returns (uint256); +``` + +### increment + + +```solidity +function increment(Counter storage counter) internal; +``` + +### decrement + + +```solidity +function decrement(Counter storage counter) internal; +``` + +### reset + + +```solidity +function reset(Counter storage counter) internal; +``` + +## Structs +### Counter + +```solidity +struct Counter { + uint256 _value; +} +``` + diff --git a/docs/src/src/utils/FiatEnabled.sol/abstract.FiatEnabled.md b/docs/src/src/utils/FiatEnabled.sol/abstract.FiatEnabled.md index 9221e342..ee22132e 100644 --- a/docs/src/src/utils/FiatEnabled.sol/abstract.FiatEnabled.md +++ b/docs/src/src/utils/FiatEnabled.sol/abstract.FiatEnabled.md @@ -1,5 +1,5 @@ # FiatEnabled -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/FiatEnabled.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/FiatEnabled.sol) A contract that provides functionality for tracking and managing fiat transactions. This contract allows tracking the amount of fiat raised, individual fiat transactions, and the state of fiat fee disbursement. @@ -122,6 +122,13 @@ Emitted when a fiat transaction is updated. event FiatTransactionUpdated(bytes32 indexed fiatTransactionId, uint256 fiatTransactionAmount); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`fiatTransactionId`|`bytes32`|The unique identifier of the fiat transaction.| +|`fiatTransactionAmount`|`uint256`|The updated amount of the fiat transaction.| + ### FiatFeeDisbusementStateUpdated Emitted when the state of fiat fee disbursement is updated. @@ -130,6 +137,14 @@ Emitted when the state of fiat fee disbursement is updated. event FiatFeeDisbusementStateUpdated(bool isDisbursed, uint256 protocolFeeAmount, uint256 platformFeeAmount); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`isDisbursed`|`bool`|True if the fiat fee is disbursed; otherwise, false.| +|`protocolFeeAmount`|`uint256`|The protocol fee amount.| +|`platformFeeAmount`|`uint256`|The platform fee amount.| + ## Errors ### FiatEnabledAlreadySet *Throws an error indicating that the fiat enabled functionality is already set.* diff --git a/docs/src/src/utils/ItemRegistry.sol/contract.ItemRegistry.md b/docs/src/src/utils/ItemRegistry.sol/contract.ItemRegistry.md index f4645f1c..7ac56706 100644 --- a/docs/src/src/utils/ItemRegistry.sol/contract.ItemRegistry.md +++ b/docs/src/src/utils/ItemRegistry.sol/contract.ItemRegistry.md @@ -1,5 +1,5 @@ # ItemRegistry -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/ItemRegistry.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/ItemRegistry.sol) **Inherits:** [IItem](/src/interfaces/IItem.sol/interface.IItem.md), Context @@ -54,6 +54,22 @@ function addItem(bytes32 itemId, Item calldata item) external override; |`item`|`Item`|The attributes of the item as an `Item` struct.| +### addItemsBatch + +Adds multiple items in a batch. + + +```solidity +function addItemsBatch(bytes32[] calldata itemIds, Item[] calldata items) external; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`itemIds`|`bytes32[]`|An array of unique item identifiers.| +|`items`|`Item[]`|An array of `Item` structs containing item attributes.| + + ## Events ### ItemAdded *Emitted when a new item is added to the registry.* @@ -63,3 +79,11 @@ function addItem(bytes32 itemId, Item calldata item) external override; event ItemAdded(address indexed owner, bytes32 indexed itemId, Item item); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`owner`|`address`|The address of the item owner.| +|`itemId`|`bytes32`|The unique identifier of the item.| +|`item`|`Item`|The item details including actual weight, dimensions, category, and declared currency.| + diff --git a/docs/src/src/utils/PausableCancellable.sol/abstract.PausableCancellable.md b/docs/src/src/utils/PausableCancellable.sol/abstract.PausableCancellable.md new file mode 100644 index 00000000..d13dcff3 --- /dev/null +++ b/docs/src/src/utils/PausableCancellable.sol/abstract.PausableCancellable.md @@ -0,0 +1,193 @@ +# PausableCancellable +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/PausableCancellable.sol) + +Abstract contract providing pause and cancel state management with events and modifiers + + +## State Variables +### _paused + +```solidity +bool private _paused; +``` + + +### _cancelled + +```solidity +bool private _cancelled; +``` + + +## Functions +### whenNotPaused + +Modifier to allow function only when not paused + + +```solidity +modifier whenNotPaused(); +``` + +### whenPaused + +Modifier to allow function only when paused + + +```solidity +modifier whenPaused(); +``` + +### whenNotCancelled + +Modifier to allow function only when not cancelled + + +```solidity +modifier whenNotCancelled(); +``` + +### whenCancelled + +Modifier to allow function only when cancelled + + +```solidity +modifier whenCancelled(); +``` + +### paused + +Returns true if the contract is currently paused + + +```solidity +function paused() public view virtual returns (bool); +``` + +### cancelled + +Returns true if the contract has been cancelled + + +```solidity +function cancelled() public view virtual returns (bool); +``` + +### _pause + +Pauses the contract + +*Can only pause if not already paused or cancelled* + + +```solidity +function _pause(bytes32 reason) internal virtual whenNotPaused whenNotCancelled; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`reason`|`bytes32`|A short reason for pausing| + + +### _unpause + +Unpauses the contract + +*Can only unpause if currently paused* + + +```solidity +function _unpause(bytes32 reason) internal virtual whenPaused; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`reason`|`bytes32`|A short reason for unpausing| + + +### _cancel + +Cancels the contract permanently + +*Auto-unpauses if paused, and cannot be undone* + + +```solidity +function _cancel(bytes32 reason) internal virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`reason`|`bytes32`|A short reason for cancellation| + + +## Events +### Paused +Emitted when contract is paused + + +```solidity +event Paused(address indexed account, bytes32 reason); +``` + +### Unpaused +Emitted when contract is unpaused + + +```solidity +event Unpaused(address indexed account, bytes32 reason); +``` + +### Cancelled +Emitted when contract is cancelled + + +```solidity +event Cancelled(address indexed account, bytes32 reason); +``` + +## Errors +### PausedError +*Reverts if contract is paused* + + +```solidity +error PausedError(); +``` + +### NotPausedError +*Reverts if contract is not paused* + + +```solidity +error NotPausedError(); +``` + +### CancelledError +*Reverts if contract is cancelled* + + +```solidity +error CancelledError(); +``` + +### NotCancelledError +*Reverts if contract is not cancelled* + + +```solidity +error NotCancelledError(); +``` + +### CannotCancel +*Reverts if contract is already cancelled* + + +```solidity +error CannotCancel(); +``` + diff --git a/docs/src/src/utils/README.md b/docs/src/src/utils/README.md index 4df5c823..a8b376bf 100644 --- a/docs/src/src/utils/README.md +++ b/docs/src/src/utils/README.md @@ -5,7 +5,8 @@ - [AdminAccessChecker](AdminAccessChecker.sol/abstract.AdminAccessChecker.md) - [BaseTreasury](BaseTreasury.sol/abstract.BaseTreasury.md) - [CampaignAccessChecker](CampaignAccessChecker.sol/abstract.CampaignAccessChecker.md) +- [Counters](Counters.sol/library.Counters.md) - [FiatEnabled](FiatEnabled.sol/abstract.FiatEnabled.md) - [ItemRegistry](ItemRegistry.sol/contract.ItemRegistry.md) -- [PausableWithMsg](PausableWithMsg.sol/abstract.PausableWithMsg.md) +- [PausableCancellable](PausableCancellable.sol/abstract.PausableCancellable.md) - [TimestampChecker](TimestampChecker.sol/abstract.TimestampChecker.md) diff --git a/docs/src/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md b/docs/src/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md index 7113d25c..d75b4cdd 100644 --- a/docs/src/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md +++ b/docs/src/src/utils/TimestampChecker.sol/abstract.TimestampChecker.md @@ -1,5 +1,5 @@ # TimestampChecker -[Git Source](https://github.com/ccprotocol/campaign-utils-contracts-aggregator/blob/79d78188e565502f83e2c0309c9a4ea3b35cee91/src/utils/TimestampChecker.sol) +[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/13d9d746c7f79b76f03c178fe64b679ba803191a/src/utils/TimestampChecker.sol) A contract that provides timestamp-related checks for contract functions. @@ -51,13 +51,13 @@ modifier currentTimeIsWithinRange(uint256 initialTime, uint256 finalTime); |`finalTime`|`uint256`|The final timestamp of the range.| -### _checkIfCurrentTimeIsGreater +### _checkIfCurrentTimeIsLess -*Internal function to check if the current timestamp is greater than a specified time.* +*Internal function to check if the current timestamp is less than or equal a specified time.* ```solidity -function _checkIfCurrentTimeIsGreater(uint256 inputTime) internal view virtual; +function _checkIfCurrentTimeIsLess(uint256 inputTime) internal view virtual; ``` **Parameters** @@ -66,13 +66,13 @@ function _checkIfCurrentTimeIsGreater(uint256 inputTime) internal view virtual; |`inputTime`|`uint256`|The timestamp being checked against.| -### _checkIfCurrentTimeIsLess +### _checkIfCurrentTimeIsGreater -*Internal function to check if the current timestamp is less than a specified time.* +*Internal function to check if the current timestamp is greater than or equal a specified time.* ```solidity -function _checkIfCurrentTimeIsLess(uint256 inputTime) internal view virtual; +function _checkIfCurrentTimeIsGreater(uint256 inputTime) internal view virtual; ``` **Parameters** @@ -106,6 +106,13 @@ function _checkIfCurrentTimeIsWithinRange(uint256 initialTime, uint256 finalTime error CurrentTimeIsGreater(uint256 inputTime, uint256 currentTime); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`inputTime`|`uint256`|The timestamp being checked against.| +|`currentTime`|`uint256`|The current block timestamp.| + ### CurrentTimeIsLess *Error: The current timestamp is less than the specified input time.* @@ -114,6 +121,13 @@ error CurrentTimeIsGreater(uint256 inputTime, uint256 currentTime); error CurrentTimeIsLess(uint256 inputTime, uint256 currentTime); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`inputTime`|`uint256`|The timestamp being checked against.| +|`currentTime`|`uint256`|The current block timestamp.| + ### CurrentTimeIsNotWithinRange *Error: The current timestamp is not within the specified range.* @@ -122,3 +136,10 @@ error CurrentTimeIsLess(uint256 inputTime, uint256 currentTime); error CurrentTimeIsNotWithinRange(uint256 initialTime, uint256 finalTime); ``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`initialTime`|`uint256`|The initial timestamp of the range.| +|`finalTime`|`uint256`|The final timestamp of the range.| + From 9079b461be8494e48d2c195575beab49cc7d81aa Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 06:06:54 +0800 Subject: [PATCH 45/61] Update readme.md --- README.md | 130 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index a5e70a42..b65e1342 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,113 @@ -# CCP Contracts -This repository contains the smart contracts source code and campaign configuration for Creative Crowdfunding Protocol - CCP. The repository uses Foundry as development environment for compilation, testing and deployment tasks. +# Creative Crowdfunding Protocol (CC Protocol) Smart Contracts -## What is CCP? -CCP is a protocol for crowdfunding campaigns that allows creators to multilist campaigns across different crowdfunding platforms. It provides infrastructure tooling and support for platforms to create and manage campaigns in web3. +## Overview -## Documentation -The detailed technical documentation for the protocol can be found in the [docs](./docs/src/SUMMARY.md) folder. +CC Protocol is a decentralized crowdfunding protocol designed to help creators launch and manage campaigns across multiple platforms. By providing a standardized infrastructure, the protocol simplifies the process of creating, funding, and managing crowdfunding initiatives in web3 across different platforms. -## Getting Started -### Prerequisites -The following tools are required to be installed in your system: -- [Foundry](https://book.getfoundry.sh/getting-started/installation) -- [Node.js](https://nodejs.org/en/download/) +## Features -### Installation +- Cross-listable campaign creation +- Multiple treasury models +- Secure fund management +- Customizable protocol parameters -```shell -$ npm install -``` +## Prerequisites + +- [Foundry](https://book.getfoundry.sh/) +- Solidity ^0.8.20 +- Node.js (recommended) -### Build +## Installation -```shell -$ forge build +1. Clone the repository: +```bash +git clone https://github.com/ccprotocol/ccprotocol-contracts.git +cd ccprotocol-contracts ``` -### Test +2. Install dependencies: +```bash +forge install +``` -```shell -$ forge test +3. Copy environment template: +```bash +cp .env.example .env ``` -### Format +4. Configure your `.env` file with: +- Private key +- RPC URL +- (Optional) Contract addresses for reuse + +## Development -```shell -$ forge fmt +### Compile Contracts +```bash +forge build ``` -### Gas Snapshots +### Run Tests +```bash +# Run all tests +forge test -```shell -$ forge snapshot +# Run specific test +forge test --match-test testFunctionName + +# Run tests with more verbose output +forge test -vvv ``` -## Deploy -### Environment Variables +### Deploy Contracts -Create an environment file named `.env`, fill the environment variables following the `.env.example` file and source the file using the following command: +#### Local Deployment +```bash +# Start local blockchain +anvil -```shell -$ source .env +# Deploy to local network +forge script script/DeployAll.s.sol:DeployAll --rpc-url http://localhost:8545 --private-key $PRIVATE_KEY --broadcast ``` -### Local Deployment -To deploy the contracts locally, run the following command: - -```shell -$ forge script script/Setup.s.sol:SetupScript +#### Testnet Deployment +```bash +# Deploy to testnet +forge script script/DeployAll.s.sol:DeployAll --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv ``` -### Remote Deployment -To deploy the contracts to a remote network, run the following command: +## Contract Architecture + +### Core Contracts +- `TestUSD`: Mock ERC20 token for testing +- `GlobalParams`: Protocol-wide parameter management +- `CampaignInfoFactory`: Campaign creation and management +- `TreasuryFactory`: Treasury contract deployment + +### Treasury Models +- `AllOrNothing`: Funds refunded if campaign goal not met + +## Deployment Workflow + +1. Deploy `TestUSD` +2. Deploy `GlobalParams` +3. Deploy `TreasuryFactory` +4. Deploy `CampaignInfoFactory` + +## Environment Variables + +Key environment variables in `.env`: +- `PRIVATE_KEY`: Deployment wallet private key +- `RPC_URL`: Network RPC endpoint +- `SIMULATE`: Toggle simulation mode +- Contract address variables for reuse + +## Troubleshooting + +- Ensure sufficient network gas tokens +- Verify RPC URL connectivity +- Check contract dependencies + +## License -```shell -$ forge script script/Setup.s.sol:SetupScript --rpc-url $RPC_URL --private-key $PRIVATE_KEY -``` \ No newline at end of file +[SPDX-License-Identifier: UNLICENSED] From 9bb367cb23cf419817756de197e357bdde803a0b Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Sat, 19 Apr 2025 06:17:57 +0800 Subject: [PATCH 46/61] Update readme.md --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index b65e1342..79080955 100644 --- a/README.md +++ b/README.md @@ -20,34 +20,56 @@ CC Protocol is a decentralized crowdfunding protocol designed to help creators l ## Installation 1. Clone the repository: + ```bash git clone https://github.com/ccprotocol/ccprotocol-contracts.git cd ccprotocol-contracts ``` 2. Install dependencies: + ```bash forge install ``` 3. Copy environment template: + ```bash cp .env.example .env ``` 4. Configure your `.env` file with: + - Private key - RPC URL - (Optional) Contract addresses for reuse +## Documentation + +Comprehensive documentation is available in the `docs/` folder: + +- Technical specifications +- Contract interfaces +- Deployment guides +- Development setup instructions + +To view the documentation: + +```bash +# Navigate to docs folder +cd docs +``` + ## Development ### Compile Contracts + ```bash forge build ``` ### Run Tests + ```bash # Run all tests forge test @@ -62,6 +84,7 @@ forge test -vvv ### Deploy Contracts #### Local Deployment + ```bash # Start local blockchain anvil @@ -71,6 +94,7 @@ forge script script/DeployAll.s.sol:DeployAll --rpc-url http://localhost:8545 -- ``` #### Testnet Deployment + ```bash # Deploy to testnet forge script script/DeployAll.s.sol:DeployAll --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv @@ -79,12 +103,14 @@ forge script script/DeployAll.s.sol:DeployAll --rpc-url $RPC_URL --private-key $ ## Contract Architecture ### Core Contracts + - `TestUSD`: Mock ERC20 token for testing - `GlobalParams`: Protocol-wide parameter management - `CampaignInfoFactory`: Campaign creation and management - `TreasuryFactory`: Treasury contract deployment ### Treasury Models + - `AllOrNothing`: Funds refunded if campaign goal not met ## Deployment Workflow @@ -97,6 +123,7 @@ forge script script/DeployAll.s.sol:DeployAll --rpc-url $RPC_URL --private-key $ ## Environment Variables Key environment variables in `.env`: + - `PRIVATE_KEY`: Deployment wallet private key - `RPC_URL`: Network RPC endpoint - `SIMULATE`: Toggle simulation mode From f097e5645fb09f6625e234d197785a67f7558df6 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:21:21 +0800 Subject: [PATCH 47/61] Add validations, initializer modifer and function for updating CampaignInfo implementation --- src/CampaignInfoFactory.sol | 64 ++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/CampaignInfoFactory.sol b/src/CampaignInfoFactory.sol index fda6146d..e126eba3 100644 --- a/src/CampaignInfoFactory.sol +++ b/src/CampaignInfoFactory.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts/proxy/Clones.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; -import "./CampaignInfo.sol"; import "./interfaces/IGlobalParams.sol"; import "./interfaces/ICampaignInfoFactory.sol"; @@ -12,7 +12,7 @@ import "./interfaces/ICampaignInfoFactory.sol"; * @title CampaignInfoFactory * @notice Factory contract for creating campaign information contracts. */ -contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { +contract CampaignInfoFactory is Initializable, ICampaignInfoFactory, Ownable { IGlobalParams private GLOBAL_PARAMS; address private s_treasuryFactoryAddress; bool private s_initialized; @@ -33,7 +33,7 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { /** * @dev Emitted when campaign creation fails. */ - error CampaignInfoFactoryCampaignCreationFailed(); + error CampaignInfoFactoryCampaignInitializationFailed(); error CampaignInfoFactoryPlatformNotListed(bytes32 platformHash); error CampaignInfoFactoryCampaignWithSameIdentifierExists( bytes32 identifierHash, @@ -43,7 +43,10 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { /** * @param globalParams The address of the global parameters contract. */ - constructor(IGlobalParams globalParams, address campaignImplementation) Ownable(msg.sender) { + constructor( + IGlobalParams globalParams, + address campaignImplementation + ) Ownable(msg.sender) { GLOBAL_PARAMS = globalParams; s_implementation = campaignImplementation; } @@ -56,15 +59,18 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { function _initialize( address treasuryFactoryAddress, address globalParams - ) external onlyOwner { - GLOBAL_PARAMS = IGlobalParams(globalParams); - if (s_initialized) { - revert CampaignInfoFactoryAlreadyInitialized(); + ) external onlyOwner initializer{ + if (treasuryFactoryAddress == address(0) || globalParams == address(0)) { + revert CampaignInfoFactoryInvalidInput(); } + GLOBAL_PARAMS = IGlobalParams(globalParams); s_treasuryFactoryAddress = treasuryFactoryAddress; s_initialized = true; } + /** + * @inheritdoc ICampaignInfoFactory + */ function createCampaign( address creator, bytes32 identifierHash, @@ -73,6 +79,12 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { bytes32[] calldata platformDataValue, CampaignData calldata campaignData ) external override { + if ( + campaignData.launchTime < block.timestamp && + campaignData.deadline <= campaignData.launchTime + ) { + revert CampaignInfoFactoryInvalidInput(); + } if (platformDataKey.length != platformDataValue.length) { revert CampaignInfoFactoryInvalidInput(); } @@ -97,21 +109,35 @@ contract CampaignInfoFactory is ICampaignInfoFactory, Ownable { s_treasuryFactoryAddress, GLOBAL_PARAMS.getTokenAddress(), GLOBAL_PARAMS.getProtocolFeePercent(), - identifierHash, - campaignData.launchTime, - campaignData.deadline, - campaignData.goalAmount + identifierHash ); address clone = Clones.cloneWithImmutableArgs(s_implementation, args); - emit CampaignInfoFactoryCampaignCreated(identifierHash, clone); - CampaignInfo(clone).initialize( - creator, - GLOBAL_PARAMS, - selectedPlatformHash, - platformDataKey, - platformDataValue + (bool success, ) = clone.call( + abi.encodeWithSignature( + "initialize(address,address,bytes32[],bytes32[],bytes32[],(uint256,uint256,uint256))", + creator, + address(GLOBAL_PARAMS), + selectedPlatformHash, + platformDataKey, + platformDataValue, + campaignData + ) ); + if (!success) { + revert CampaignInfoFactoryCampaignInitializationFailed(); + } identifierToCampaignInfo[identifierHash] = clone; isValidCampaignInfo[clone] = true; + emit CampaignInfoFactoryCampaignCreated(identifierHash, clone); + emit CampaignInfoFactoryCampaignInitialized(); + } + + /** + * @inheritdoc ICampaignInfoFactory + */ + function updateImplementation( + address newImplementation + ) external override onlyOwner { + s_implementation = newImplementation; } } From c8376de7f7a83286a81faf4564851608ec164a65 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:21:50 +0800 Subject: [PATCH 48/61] Update config constants and dependant functions --- src/CampaignInfo.sol | 62 ++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/CampaignInfo.sol b/src/CampaignInfo.sol index d238d750..d3b795fb 100644 --- a/src/CampaignInfo.sol +++ b/src/CampaignInfo.sol @@ -134,10 +134,12 @@ contract CampaignInfo is IGlobalParams globalParams, bytes32[] calldata selectedPlatformHash, bytes32[] calldata platformDataKey, - bytes32[] calldata platformDataValue + bytes32[] calldata platformDataValue, + CampaignData calldata campaignData ) external initializer { __AccessChecker_init(globalParams); _transferOwnership(creator); + s_campaignData = campaignData; uint256 len = selectedPlatformHash.length; for (uint256 i = 0; i < len; ++i) { s_platformFeePercent[selectedPlatformHash[i]] = GLOBAL_PARAMS @@ -162,9 +164,6 @@ contract CampaignInfo is address token; uint256 protocolFeePercent; bytes32 identifierHash; - uint256 launchTime; - uint256 deadline; - uint256 goalAmount; } function getCampaignConfig() public view returns (Config memory config) { @@ -173,14 +172,8 @@ contract CampaignInfo is config.treasuryFactory, config.token, config.protocolFeePercent, - config.identifierHash, - config.launchTime, - config.deadline, - config.goalAmount - ) = abi.decode( - args, - (address, address, uint256, bytes32, uint256, uint256, uint256) - ); + config.identifierHash + ) = abi.decode(args, (address, address, uint256, bytes32)); } /** @@ -239,24 +232,21 @@ contract CampaignInfo is * @inheritdoc ICampaignInfo */ function getLaunchTime() public view override returns (uint256) { - Config memory config = getCampaignConfig(); - return config.launchTime; + return s_campaignData.launchTime; } /** * @inheritdoc ICampaignInfo */ - function getDeadline() external view override returns (uint256) { - Config memory config = getCampaignConfig(); - return config.deadline; + function getDeadline() public view override returns (uint256) { + return s_campaignData.deadline; } /** * @inheritdoc ICampaignInfo */ function getGoalAmount() external view override returns (uint256) { - Config memory config = getCampaignConfig(); - return config.goalAmount; + return s_campaignData.goalAmount; } /** @@ -334,7 +324,7 @@ contract CampaignInfo is */ function transferOwnership( address newOwner - ) public override(ICampaignInfo, Ownable) onlyOwner whenNotPaused { + ) public override(ICampaignInfo, Ownable) onlyOwner whenNotPaused whenNotCancelled { super.transferOwnership(newOwner); } @@ -343,7 +333,17 @@ contract CampaignInfo is */ function updateLaunchTime( uint256 launchTime - ) external override onlyOwner currentTimeIsLess(launchTime) whenNotPaused { + ) + external + override + onlyOwner + currentTimeIsLess(getLaunchTime()) + whenNotPaused + whenNotCancelled + { + if (launchTime < block.timestamp && getDeadline() <= launchTime) { + revert CampaignInfoInvalidInput(); + } s_campaignData.launchTime = launchTime; emit CampaignInfoLaunchTimeUpdated(launchTime); } @@ -359,7 +359,12 @@ contract CampaignInfo is onlyOwner currentTimeIsLess(getLaunchTime()) whenNotPaused + whenNotCancelled { + if (deadline <= getLaunchTime()) { + revert CampaignInfoInvalidInput(); + } + s_campaignData.deadline = deadline; emit CampaignInfoDeadlineUpdated(deadline); } @@ -373,10 +378,13 @@ contract CampaignInfo is external override onlyOwner - currentTimeIsLess(s_campaignData.launchTime) + currentTimeIsLess(getLaunchTime()) whenNotPaused + whenNotCancelled { - s_campaignData.goalAmount = goalAmount; + if (goalAmount == 0) { + revert CampaignInfoInvalidInput(); + } emit CampaignInfoGoalAmountUpdated(goalAmount); } @@ -390,10 +398,14 @@ contract CampaignInfo is external override onlyOwner - currentTimeIsLess(s_campaignData.launchTime) + currentTimeIsLess(getLaunchTime()) whenNotPaused + whenNotCancelled { - if (s_selectedPlatformHash[platformHash] != selection) { + if (checkIfPlatformSelected(platformHash) == selection) { + revert CampaignInfoInvalidInput(); + } + if (!GLOBAL_PARAMS.checkIfPlatformIsListed(platformHash)) { revert CampaignInfoInvalidPlatformUpdate(platformHash, selection); } s_selectedPlatformHash[platformHash] = selection; From 9bfa359ac5e0499b721a55107f1b09567b662f8b Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:22:20 +0800 Subject: [PATCH 49/61] Fix issue validations --- src/GlobalParams.sol | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/GlobalParams.sol b/src/GlobalParams.sol index 317db7cb..b228e0a5 100644 --- a/src/GlobalParams.sol +++ b/src/GlobalParams.sol @@ -181,15 +181,6 @@ contract GlobalParams is IGlobalParams, Ownable { s_protocolFeePercent = protocolFeePercent; } - /** - * @inheritdoc IGlobalParams - */ - function checkIfPlatformIsListed( - bytes32 platformHash - ) public view override returns (bool) { - return s_platformIsListed[platformHash]; - } - /** * @inheritdoc IGlobalParams */ @@ -279,6 +270,15 @@ contract GlobalParams is IGlobalParams, Ownable { } } + /** + * @inheritdoc IGlobalParams + */ + function checkIfPlatformIsListed( + bytes32 platformHash + ) public view override returns (bool) { + return s_platformIsListed[platformHash]; + } + /** * @inheritdoc IGlobalParams */ @@ -290,6 +290,7 @@ contract GlobalParams is IGlobalParams, Ownable { /** * @notice Enlists a platform with its admin address and fee percentage. + * @dev The platformFeePercent can be any value including zero. * @param platformHash The platform's identifier. * @param platformAdminAddress The platform's admin address. * @param platformFeePercent The platform's fee percentage. @@ -298,7 +299,10 @@ contract GlobalParams is IGlobalParams, Ownable { bytes32 platformHash, address platformAdminAddress, uint256 platformFeePercent - ) external onlyOwner { + ) external onlyOwner notAddressZero(platformAdminAddress) { + if (platformHash == ZERO_BYTES || platformAdminAddress == address(0)) { + revert GlobalParamsInvalidInput(); + } if (s_platformIsListed[platformHash]) { revert GlobalParamsPlatformAlreadyListed(platformHash); } else { @@ -318,10 +322,9 @@ contract GlobalParams is IGlobalParams, Ownable { * @notice Delists a platform. * @param platformHash The platform's identifier. */ - function delistPlatform(bytes32 platformHash) external onlyOwner { - if (!s_platformIsListed[platformHash]) { - revert GlobalParamsPlatformNotListed(platformHash); - } + function delistPlatform( + bytes32 platformHash + ) external onlyOwner platformIsListed(platformHash) { s_platformIsListed[platformHash] = false; s_platformAdminAddress[platformHash] = address(0); s_platformFeePercent[platformHash] = 0; From bffb989ed584c05863e4528f23a77bda6af6a6b1 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:23:02 +0800 Subject: [PATCH 50/61] Add custom errors, remove unused imports --- src/TreasuryFactory.sol | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/TreasuryFactory.sol b/src/TreasuryFactory.sol index 8670b5e7..e989b8ad 100644 --- a/src/TreasuryFactory.sol +++ b/src/TreasuryFactory.sol @@ -6,7 +6,6 @@ import "@openzeppelin/contracts/proxy/Clones.sol"; import "./CampaignInfo.sol"; import "./interfaces/ITreasuryFactory.sol"; import "./utils/AdminAccessChecker.sol"; -import "./utils/AddressCalculator.sol"; contract TreasuryFactory is ITreasuryFactory, AdminAccessChecker { mapping(bytes32 => mapping(uint256 => address)) implementationMap; @@ -19,6 +18,7 @@ contract TreasuryFactory is ITreasuryFactory, AdminAccessChecker { error TreasuryFactoryImplementationNotSet(); error TreasuryFactoryImplementationNotSetOrApproved(); error TreasuryFactoryTreasuryInitializationFailed(); + error TreasuryFactorySettingPlatformInfoFailed(); /** * @notice Initializes the TreasuryFactory contract. @@ -110,7 +110,9 @@ contract TreasuryFactory is ITreasuryFactory, AdminAccessChecker { symbol ) ); - require(success, "Treasury initialization failed"); + if (!success) { + revert TreasuryFactoryTreasuryInitializationFailed(); + } (success, ) = infoAddress.call( abi.encodeWithSignature( "_setPlatformInfo(bytes32,address)", @@ -119,7 +121,7 @@ contract TreasuryFactory is ITreasuryFactory, AdminAccessChecker { ) ); if (!success) { - revert TreasuryFactoryTreasuryInitializationFailed(); + revert TreasuryFactorySettingPlatformInfoFailed(); } emit TreasuryFactoryTreasuryDeployed( platformHash, From 268ea1bbc96879e6e1a96cd996a0a22c58a754b4 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:23:28 +0800 Subject: [PATCH 51/61] Update Interface --- src/interfaces/ICampaignInfoFactory.sol | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/interfaces/ICampaignInfoFactory.sol b/src/interfaces/ICampaignInfoFactory.sol index f76d26f9..6481dfae 100644 --- a/src/interfaces/ICampaignInfoFactory.sol +++ b/src/interfaces/ICampaignInfoFactory.sol @@ -18,6 +18,12 @@ interface ICampaignInfoFactory is ICampaignData { address indexed campaignInfoAddress ); + /** + * @notice Emitted when the campaign after creation is initialized. + */ + event CampaignInfoFactoryCampaignInitialized( + ); + /** * @notice Creates a new campaign information contract. * @param creator The address of the creator of the campaign. @@ -35,4 +41,12 @@ interface ICampaignInfoFactory is ICampaignData { bytes32[] calldata platformDataValue, CampaignData calldata campaignData ) external; + + /** + * @notice Updates the campaign implementation address. + * @param newImplementation The address of the camapaignInfo implementation contract. + */ + function updateImplementation( + address newImplementation + ) external; } From 029331fd9efbb8525283c13539cbdefac1d60bc7 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:23:41 +0800 Subject: [PATCH 52/61] Remove unnecessary contract --- src/utils/AddressCalculator.sol | 50 --------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 src/utils/AddressCalculator.sol diff --git a/src/utils/AddressCalculator.sol b/src/utils/AddressCalculator.sol deleted file mode 100644 index 4f02e5da..00000000 --- a/src/utils/AddressCalculator.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.20; - -/** - * @title AddressCalculator - * @notice A Solidity library for computing contract addresses and checking if a contract is deployed at a given address. - */ -library AddressCalculator { - /** - * @dev Computes the contract address using CREATE2 and checks if the contract is deployed. - * @param salt The salt value used for address computation. - * @param bytecodeHash The keccak256 hash of the contract's bytecode. - * @param deployer The address that deploys the contract. - * @return addr The computed contract address. - * @return isValid True if a contract is deployed at the address; otherwise, false. - */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash, - address deployer - ) internal view returns (address addr, bool isValid) { - assembly { - let freePtr := mload(0x40) - mstore(add(freePtr, 0x40), bytecodeHash) - mstore(add(freePtr, 0x20), salt) - mstore(freePtr, deployer) - let start := add(freePtr, 0x0b) - mstore8(start, 0xff) - addr := keccak256(start, 85) - } - return (addr, checkIfContractDeployed(addr)); - } - - /** - * @dev Checks if a contract is deployed at the given address. - * @param addr The address to check for contract deployment. - * @return isValid True if a contract is deployed at the address; otherwise, false. - */ - function checkIfContractDeployed( - address addr - ) internal view returns (bool isValid) { - bytes32 codeHash; - assembly { - codeHash := extcodehash(addr) - } - return (codeHash != 0x0 && - codeHash != - 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470); - } -} From 5d9b7f746c7bfce8d328cf5d0fd29a0cfc250804 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:40:16 +0800 Subject: [PATCH 53/61] Improve validation logic, remove redundant functions - Removed addReward - Improved validation logic in `addRewards` - Combined the if conditions to make it concise - Updated the function visibily of `_pledge` - `Reordered _checkSuccessCondition` --- src/treasuries/AllOrNothing.sol | 98 +++++++++++++-------------------- 1 file changed, 38 insertions(+), 60 deletions(-) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index 7640585a..ec8e5b5d 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -53,11 +53,11 @@ contract AllOrNothing is ); /** - * @dev Emitted when a reward is added to the campaign. - * @param rewardName The name of the reward. - * @param reward The details of the reward. + * @dev Emitted when rewards are added to the campaign. + * @param rewardNames The names of the rewards. + * @param rewards The details of the rewards. */ - event RewardAdded(bytes32 indexed rewardName, Reward reward); + event RewardsAdded(bytes32[] rewardNames, Reward[] rewards); /** * @dev Emitted when a reward is removed from the campaign. @@ -158,44 +158,16 @@ contract AllOrNothing is return s_pledgedAmount; } - /** - * @notice Adds a reward to the campaign. - * @param rewardName The name of the reward. - * @param reward The details of the reward as a `Reward` struct. - */ - function addReward( - bytes32 rewardName, - Reward calldata reward - ) - external - onlyCampaignOwner - whenCampaignNotPaused - whenNotPaused - whenCampaignNotCancelled - whenNotCancelled - { - if ( - reward.rewardValue == 0 && - reward.itemId.length == 0 && - reward.itemId.length == reward.itemValue.length && - reward.itemId.length == reward.itemQuantity.length - ) { - revert AllOrNothingInvalidInput(); - } - if (s_reward[rewardName].rewardValue != 0) { - revert AllOrNothingRewardExists(); - } - s_reward[rewardName] = reward; - s_rewardCounter.increment(); - emit RewardAdded(rewardName, reward); - } - /** * @notice Adds multiple rewards in a batch. + * @dev This function allows for both reward tiers and non-reward tiers. + * For both types, rewards must have non-zero value. + * If items are specified (non-empty arrays), the itemId, itemValue, and itemQuantity arrays must match in length. + * Empty arrays are allowed for both reward tiers and non-reward tiers. * @param rewardNames An array of reward names. * @param rewards An array of `Reward` structs containing reward details. */ - function addRewardsBatch( + function addRewards( bytes32[] calldata rewardNames, Reward[] calldata rewards ) @@ -214,22 +186,28 @@ contract AllOrNothing is bytes32 rewardName = rewardNames[i]; Reward calldata reward = rewards[i]; + // Reward name must not be zero bytes and reward value must be non-zero + if (rewardName == ZERO_BYTES || reward.rewardValue == 0) { + revert AllOrNothingInvalidInput(); + } + + // If there are any items, their arrays must match in length if ( - reward.rewardValue == 0 && - reward.itemId.length == 0 && - reward.itemId.length == reward.itemValue.length && - reward.itemId.length == reward.itemQuantity.length + (reward.itemId.length != reward.itemValue.length) || + (reward.itemId.length != reward.itemQuantity.length) ) { revert AllOrNothingInvalidInput(); } + + // Check for duplicate reward if (s_reward[rewardName].rewardValue != 0) { revert AllOrNothingRewardExists(); } s_reward[rewardName] = reward; s_rewardCounter.increment(); - emit RewardAdded(rewardName, reward); } + emit RewardsAdded(rewardNames, rewards); } /** @@ -256,6 +234,8 @@ contract AllOrNothing is /** * @notice Allows a backer to pledge for a reward. + * @dev The first element of the `reward` array must be a reward tier and the other elements can be either reward tiers or non-reward tiers. + * The non-reward tiers cannot be pledged for without a reward. * @param backer The address of the backer making the pledge. * @param reward An array of reward names. */ @@ -326,10 +306,8 @@ contract AllOrNothing is whenCampaignNotPaused whenNotPaused { - if (block.timestamp >= INFO.getDeadline()) { - if (_checkSuccessCondition()) { - revert AllOrNothingNotClaimable(tokenId); - } + if (block.timestamp >= INFO.getDeadline() && _checkSuccessCondition()) { + revert AllOrNothingNotClaimable(tokenId); } uint256 amount = s_tokenToCollectedAmount[tokenId]; if (amount == 0) { @@ -379,6 +357,19 @@ contract AllOrNothing is _cancel(message); } + /** + * @inheritdoc BaseTreasury + */ + function _checkSuccessCondition() + internal + view + virtual + override + returns (bool) + { + return INFO.getTotalRaisedAmount() >= INFO.getGoalAmount(); + } + function _pledge( address backer, bytes32 reward, @@ -386,7 +377,7 @@ contract AllOrNothing is uint256 shippingFee, uint256 tokenId, bytes32[] memory rewards - ) internal { + ) private { uint256 totalAmount = pledgeAmount + shippingFee; TOKEN.safeTransferFrom(backer, address(this), totalAmount); s_tokenIdCounter.increment(); @@ -403,19 +394,6 @@ contract AllOrNothing is ); } - /** - * @inheritdoc BaseTreasury - */ - function _checkSuccessCondition() - internal - view - virtual - override - returns (bool) - { - return INFO.getTotalRaisedAmount() >= INFO.getGoalAmount(); - } - // The following functions are overrides required by Solidity. function supportsInterface( bytes4 interfaceId From aaf5363a53ad9285d8abff4438adb46d6242b66b Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:40:57 +0800 Subject: [PATCH 54/61] Update function names to make it consistent with its logic --- src/utils/BaseTreasury.sol | 1 + src/utils/TimestampChecker.sol | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/utils/BaseTreasury.sol b/src/utils/BaseTreasury.sol index 23eb07a7..c1750272 100644 --- a/src/utils/BaseTreasury.sol +++ b/src/utils/BaseTreasury.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; + import "../interfaces/ICampaignInfo.sol"; import "../interfaces/ICampaignTreasury.sol"; import "./CampaignAccessChecker.sol"; diff --git a/src/utils/TimestampChecker.sol b/src/utils/TimestampChecker.sol index 30117d31..e5170999 100644 --- a/src/utils/TimestampChecker.sol +++ b/src/utils/TimestampChecker.sol @@ -32,7 +32,7 @@ abstract contract TimestampChecker { * @param inputTime The timestamp being checked against. */ modifier currentTimeIsGreater(uint256 inputTime) { - _checkIfCurrentTimeIsGreater(inputTime); + _revertIfCurrentTimeIsNotGreater(inputTime); _; } @@ -41,7 +41,7 @@ abstract contract TimestampChecker { * @param inputTime The timestamp being checked against. */ modifier currentTimeIsLess(uint256 inputTime) { - _checkIfCurrentTimeIsLess(inputTime); + _revertIfCurrentTimeIsNotLess(inputTime); _; } @@ -51,15 +51,15 @@ abstract contract TimestampChecker { * @param finalTime The final timestamp of the range. */ modifier currentTimeIsWithinRange(uint256 initialTime, uint256 finalTime) { - _checkIfCurrentTimeIsWithinRange(initialTime, finalTime); + _revertIfCurrentTimeIsNotWithinRange(initialTime, finalTime); _; } /** - * @dev Internal function to check if the current timestamp is less than or equal a specified time. + * @dev Internal function to revert if the current timestamp is less than or equal a specified time. * @param inputTime The timestamp being checked against. */ - function _checkIfCurrentTimeIsLess( + function _revertIfCurrentTimeIsNotLess( uint256 inputTime ) internal view virtual { uint256 currentTime = block.timestamp; @@ -69,10 +69,10 @@ abstract contract TimestampChecker { } /** - * @dev Internal function to check if the current timestamp is greater than or equal a specified time. + * @dev Internal function to revert if the current timestamp is not greater than or equal a specified time. * @param inputTime The timestamp being checked against. */ - function _checkIfCurrentTimeIsGreater( + function _revertIfCurrentTimeIsNotGreater( uint256 inputTime ) internal view virtual { uint256 currentTime = block.timestamp; @@ -82,11 +82,11 @@ abstract contract TimestampChecker { } /** - * @dev Internal function to check if the current timestamp is within a specified time range. + * @dev Internal function to revert if the current timestamp is not within a specified time range. * @param initialTime The initial timestamp of the range. * @param finalTime The final timestamp of the range. */ - function _checkIfCurrentTimeIsWithinRange( + function _revertIfCurrentTimeIsNotWithinRange( uint256 initialTime, uint256 finalTime ) internal view virtual { From 81cf73294f7eab7b98355457f67bcb180b142979 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:41:56 +0800 Subject: [PATCH 55/61] Remove `addReward` helper function, and update tests for `addRewards` --- .../integration/AllOrNothing/AllOrNothing.t.sol | 15 ++------------- .../AllOrNothing/AllOrNothingFunction.t.sol | 12 ++++++------ 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol b/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol index e10ef774..38eba557 100644 --- a/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol +++ b/test/foundry/integration/AllOrNothing/AllOrNothing.t.sol @@ -141,25 +141,14 @@ abstract contract AllOrNothing_Integration_Shared_Test is allOrNothing = AllOrNothing(treasuryAddress); } - function addReward( - address caller, - address treasury, - bytes32 rewardName, - Reward memory reward - ) internal { - vm.startPrank(caller); - allOrNothing.addReward(rewardName, reward); - vm.stopPrank(); - } - - function addRewardsBatch( + function addRewards( address caller, address treasury, bytes32[] memory rewardNames, Reward[] memory rewards ) internal { vm.startPrank(caller); - AllOrNothing(treasury).addRewardsBatch(rewardNames, rewards); + AllOrNothing(treasury).addRewards(rewardNames, rewards); vm.stopPrank(); } diff --git a/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol b/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol index c19d46b6..c5f0738a 100644 --- a/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol +++ b/test/foundry/integration/AllOrNothing/AllOrNothingFunction.t.sol @@ -13,8 +13,8 @@ import {IReward} from "src/interfaces/IReward.sol"; contract AllOrNothingFunction_Integration_Shared_Test is AllOrNothing_Integration_Shared_Test { - function test_addRewardsBatch() external { - addRewardsBatch( + function test_addRewards() external { + addRewards( users.creator1Address, address(allOrNothing), REWARD_NAMES, @@ -50,7 +50,7 @@ contract AllOrNothingFunction_Integration_Shared_Test is } function test_pledgeForAReward() external { - addRewardsBatch( + addRewards( users.creator1Address, address(allOrNothing), REWARD_NAMES, @@ -82,7 +82,7 @@ contract AllOrNothingFunction_Integration_Shared_Test is } function test_claimRefund() external { - addRewardsBatch( + addRewards( users.creator1Address, address(allOrNothing), REWARD_NAMES, @@ -120,7 +120,7 @@ contract AllOrNothingFunction_Integration_Shared_Test is } function test_disburseFees() external { - addRewardsBatch( + addRewards( users.creator1Address, address(allOrNothing), REWARD_NAMES, @@ -170,7 +170,7 @@ contract AllOrNothingFunction_Integration_Shared_Test is } function test_withdraw() external { - addRewardsBatch( + addRewards( users.creator1Address, address(allOrNothing), REWARD_NAMES, From 13013cc4edb40728b8a5a955bdbbb16d7b1eb6dd Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 10:59:25 +0800 Subject: [PATCH 56/61] Fix issue with `claimRefund` - Added `s_tokenToPledgedAmount` to map pledged amount per token ID - Renamed `s_tokenToCollectedAmount` to `s_tokenToTotalCollectedAmount` - Update `claimRefund` function to refund full amount including pledged food and shipping fees. - Fixed issue in `claimRefund` `s_pledgedAmount` balance deduction --- src/treasuries/AllOrNothing.sol | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index ec8e5b5d..d745c54c 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -23,8 +23,9 @@ contract AllOrNothing is using SafeERC20 for IERC20; // Mapping to store the pledged amount per token ID - mapping(uint256 => uint256) private s_tokenToCollectedAmount; - + mapping(uint256 => uint256) private s_tokenToTotalCollectedAmount; + // Mapping to store the pledged amount per token ID + mapping(uint256 => uint256) private s_tokenToPledgedAmount; // Mapping to store reward details by name mapping(bytes32 => Reward) private s_reward; @@ -309,15 +310,17 @@ contract AllOrNothing is if (block.timestamp >= INFO.getDeadline() && _checkSuccessCondition()) { revert AllOrNothingNotClaimable(tokenId); } - uint256 amount = s_tokenToCollectedAmount[tokenId]; - if (amount == 0) { + uint256 amountToRefund = s_tokenToTotalCollectedAmount[tokenId]; + uint256 pledgedAmount = s_tokenToPledgedAmount[tokenId]; + if (amountToRefund == 0) { revert AllOrNothingNotClaimable(tokenId); } - s_tokenToCollectedAmount[tokenId] = 0; - s_pledgedAmount -= amount; + s_tokenToTotalCollectedAmount[tokenId] = 0; + s_tokenToPledgedAmount[tokenId] = 0; + s_pledgedAmount -= pledgedAmount; burn(tokenId); - TOKEN.safeTransfer(msg.sender, amount); - emit RefundClaimed(tokenId, amount, msg.sender); + TOKEN.safeTransfer(msg.sender, amountToRefund); + emit RefundClaimed(tokenId, amountToRefund, msg.sender); } /** @@ -382,7 +385,8 @@ contract AllOrNothing is TOKEN.safeTransferFrom(backer, address(this), totalAmount); s_tokenIdCounter.increment(); _safeMint(backer, tokenId, abi.encodePacked(backer, reward)); - s_tokenToCollectedAmount[tokenId] = totalAmount; + s_tokenToPledgedAmount[tokenId] = pledgeAmount; + s_tokenToTotalCollectedAmount[tokenId] = totalAmount; s_pledgedAmount += pledgeAmount; emit Receipt( backer, From 7f02f341368a3fc3c1ca9f8142e41b3cc674c9f8 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 11:01:19 +0800 Subject: [PATCH 57/61] Remove console.sol import --- src/utils/BaseTreasury.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/BaseTreasury.sol b/src/utils/BaseTreasury.sol index c1750272..33bb602b 100644 --- a/src/utils/BaseTreasury.sol +++ b/src/utils/BaseTreasury.sol @@ -9,7 +9,6 @@ import "../interfaces/ICampaignInfo.sol"; import "../interfaces/ICampaignTreasury.sol"; import "./CampaignAccessChecker.sol"; import "./PausableCancellable.sol"; -import "forge-std/console.sol"; /** * @title BaseTreasury From b25b0ca0ef40c8a80f84bd46ce47f5f9f9ae283e Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 20:27:34 +0800 Subject: [PATCH 58/61] Add validation to prevent setting zero address as campaignInfo implementation --- src/CampaignInfoFactory.sol | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/CampaignInfoFactory.sol b/src/CampaignInfoFactory.sol index e126eba3..f5d554f4 100644 --- a/src/CampaignInfoFactory.sol +++ b/src/CampaignInfoFactory.sol @@ -59,8 +59,10 @@ contract CampaignInfoFactory is Initializable, ICampaignInfoFactory, Ownable { function _initialize( address treasuryFactoryAddress, address globalParams - ) external onlyOwner initializer{ - if (treasuryFactoryAddress == address(0) || globalParams == address(0)) { + ) external onlyOwner initializer { + if ( + treasuryFactoryAddress == address(0) || globalParams == address(0) + ) { revert CampaignInfoFactoryInvalidInput(); } GLOBAL_PARAMS = IGlobalParams(globalParams); @@ -69,8 +71,8 @@ contract CampaignInfoFactory is Initializable, ICampaignInfoFactory, Ownable { } /** - * @inheritdoc ICampaignInfoFactory - */ + * @inheritdoc ICampaignInfoFactory + */ function createCampaign( address creator, bytes32 identifierHash, @@ -138,6 +140,9 @@ contract CampaignInfoFactory is Initializable, ICampaignInfoFactory, Ownable { function updateImplementation( address newImplementation ) external override onlyOwner { + if (newImplementation == address(0)) { + revert CampaignInfoFactoryInvalidInput(); + } s_implementation = newImplementation; } } From bfb33b0a6167d7fcc937f27c9e337966b8978687 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 20:29:20 +0800 Subject: [PATCH 59/61] Update comment --- src/treasuries/AllOrNothing.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/treasuries/AllOrNothing.sol b/src/treasuries/AllOrNothing.sol index d745c54c..75046efc 100644 --- a/src/treasuries/AllOrNothing.sol +++ b/src/treasuries/AllOrNothing.sol @@ -22,7 +22,7 @@ contract AllOrNothing is using Counters for Counters.Counter; using SafeERC20 for IERC20; - // Mapping to store the pledged amount per token ID + // Mapping to store the total collected amount (pledged amount and shipping fee) per token ID mapping(uint256 => uint256) private s_tokenToTotalCollectedAmount; // Mapping to store the pledged amount per token ID mapping(uint256 => uint256) private s_tokenToPledgedAmount; From 0992b2a0ef5827f5d2053dec9c5f0f2c6e7d657c Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 20:30:06 +0800 Subject: [PATCH 60/61] Add custom errors instead of require statements --- src/utils/Counters.sol | 26 +++++++++++++------------- src/utils/ItemRegistry.sol | 14 +++++++++----- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/utils/Counters.sol b/src/utils/Counters.sol index 6e978a29..cacf1388 100644 --- a/src/utils/Counters.sol +++ b/src/utils/Counters.sol @@ -1,22 +1,20 @@ -// NOTE: This is a local copy of OpenZeppelin's Counters library (removed in v5.x). +// NOTE: This is an edited version of OpenZeppelin's Counters library (removed in v5.x). // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/utils/Counters.sol // Reason: Used for backwards-compatible counter functionality in v5-based projects. - // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) -pragma solidity ^0.8.0; +// The updates in this version are to ensure compatibility with Solidity v0.8.20 and to be consistent in style of other contracts used in this repository. + +pragma solidity ^0.8.20; -/** - * @title Counters - * @author Matt Condon (@shrugs) - * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number - * of elements in a mapping, issuing ERC721 ids, or counting request ids. - * - * Include with `using Counters for Counters.Counter;` - */ library Counters { + /** + * @dev Error thrown when attempting to decrement a counter with value 0. + */ + error CounterDecrementOverflow(); + struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add @@ -36,7 +34,9 @@ library Counters { function decrement(Counter storage counter) internal { uint256 value = counter._value; - require(value > 0, "Counter: decrement overflow"); + if (value == 0) { + revert CounterDecrementOverflow(); + } unchecked { counter._value = value - 1; } @@ -45,4 +45,4 @@ library Counters { function reset(Counter storage counter) internal { counter._value = 0; } -} \ No newline at end of file +} diff --git a/src/utils/ItemRegistry.sol b/src/utils/ItemRegistry.sol index 93f71109..63f06100 100644 --- a/src/utils/ItemRegistry.sol +++ b/src/utils/ItemRegistry.sol @@ -18,6 +18,11 @@ contract ItemRegistry is IItem, Context { * @param item The item details including actual weight, dimensions, category, and declared currency. */ event ItemAdded(address indexed owner, bytes32 indexed itemId, Item item); + + /** + * @dev Thrown when the input arrays have mismatched lengths. + */ + error ItemRegistryMismatchedArraysLength(); /** * @inheritdoc IItem @@ -46,10 +51,9 @@ contract ItemRegistry is IItem, Context { bytes32[] calldata itemIds, Item[] calldata items ) external { - require( - itemIds.length == items.length, - "ItemRegistry: Mismatched arrays length" - ); + if (itemIds.length != items.length) { + revert ItemRegistryMismatchedArraysLength(); + } for (uint256 i = 0; i < itemIds.length; i++) { bytes32 itemId = itemIds[i]; @@ -59,4 +63,4 @@ contract ItemRegistry is IItem, Context { emit ItemAdded(_msgSender(), itemId, item); } } -} +} \ No newline at end of file From fbe1ec99a05e0d92853dca000a67b4772e7abe11 Mon Sep 17 00:00:00 2001 From: rayedsikder Date: Tue, 22 Apr 2025 20:33:21 +0800 Subject: [PATCH 61/61] Update workflow and remove npm runs --- .github/workflows/test.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05cf79cd..460619f1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,9 +17,6 @@ env: jobs: check: - strategy: - fail-fast: true - name: Foundry project runs-on: ubuntu-latest steps: @@ -34,7 +31,6 @@ jobs: - name: Run Forge build run: | - npm ci forge --version forge build --sizes id: build @@ -43,3 +39,16 @@ jobs: run: | forge test -vvv id: test + + - name: Run gas report + run: | + forge test --gas-report > gas-report.txt + if: always() + id: gas + + - name: Archive gas report + uses: actions/upload-artifact@v3 + if: always() + with: + name: gas-report + path: gas-report.txt \ No newline at end of file